2016-03-28 3 views
1

私は、MSTest(100+サブシステム)でかなりの数の統合テストを行っています。また、関連するテストを独自のテストクラスにグループ分けして読みやすくしたいテストグループには異なる構成設定が必要です。MSTestのテストクラス間でサービスを共有する

テストはもともと、特定のサービスの静的インスタンスを含む1つの大きなテストクラスから開始されました。これらのサービスは、スピンアップするまでに時間がかかり、テストが実行されるたびにテスト実行時間が支配的になります。元のテストコードはこのように始まりました。

[TestClass] 
public class IntegrationTests 
{ 
    static ServiceA serviceA = new ServiceA(); 
    static ServiceB serviceB = new ServiceB(); 

    [ClassInitialize] 
    public static void ClassInit(TestContext context) 
    { 
    /* Gets the services up and going */ 
    } 
    [TestInitialize] 
    public void TestInit() 
    { 
    /* Gets services back into good states */ 
    } 

    /* Lots and lots of Integration tests */ 

    [ClassCleanup] 
    public static void ClassCleanup() 
    { 
    /* Tear down the services */ 
    } 
} 

この問題は、異なるテストグループがテストを実行する前にサービスを別の状態にする必要があることです。

[TestClass] 
public class TestClassA : IntegrationTests 
{ 
    /* tests */ 
} 

[TestClass] 
public class TestClassB : IntegrationTests 
{ 
    /* tests */ 
} 

[TestClass] 
public class TestClassC : IntegrationTests 
{ 
    /* tests */ 
} 

問題と:

私の最初のアイデアは、共通のベーステストクラスで静的なサービスを維持し、このような各試験群のための基本クラスから継承する新しいテストクラスを作成することでしたつまり、サービスは各テストクラスごとにスピンアップされ、解体されます。確かに、個々のテストごとに作成され破壊されるほど悪くはありませんが、テスト実行ごとに1回作成したいと思います。

MSTestの統合テストで同じサービスを共有する別々のテストクラスを用意する方法はありますか?

答えて

1

私があなたの質問を正しく理解していれば、別個のシングルトンを使ってこれらのサービスを実装できます。次のようなものがあります。

public class Services 
{ 
    static ServiceA _serviceA 
    static ServiceB _serviceB 
    public static ServiceA InstanceA 
    { 
    if (_serviceA == null) 
     _serviceA = new ServiceA(); 
    return _serviceA; 
    } 
    public static ServiceB InstanceB 
    { 
    if (_serviceB == null) 
     _serviceB = new ServiceB(); 
    return _serviceB; 
    } 
} 

このクラスは、すべてのテストクラスで共有できます。

+0

いつものように、私は他の誰かがする前に私自身の質問に答えることができました。解決策はこれに非常に似ていました。私のテスト基底クラスの中で、すべての初期化コードを処理する静的コンストラクタを作った。この方法も同様に機能します。 – CHendrix

0

IProgrammerの答えがうまくいくが、ここで私が思いついた解決策がある。

私はそうのようなサービスのすべてが、スピンアップされている基本テストクラスの静的コンストラクタを追加しました:すべてのテストが実行された後に、リソースをクリーンアップ

[TestClass] 
public class IntegrationTests 
{ 
    static ServiceA serviceA = new ServiceA(); 
    static ServiceB serviceB = new ServiceB(); 

    //Static constructor gets called once during the lifetime of the appdomain. 
    static IntegrationTests() 
    { 
    /* Gets the services up and going */ 
    } 
    [TestInitialize] 
    public void TestInit() 
    { 
    /* Gets services back into good states */ 
    } 

    /* Lots and lots of Integration tests */ 
} 

は、C#以来、もう少しトリッキーでした静的デストラクタはありません。

ただし、this answer providedは、きれいで巧妙な回避策です。

ここには、「静的な」デストラクタコードがあります。

private static readonly Destructor Finalise = new Destructor(); 
private sealed class Destructor 
{ 
    ~Destructor() 
    { 
    /* Service cleanup code here */ 
    } 
} 
関連する問題