14

Visual Studio 2008 内で MSTEST を使用しています。各テストを実行する前にすべてのグローバル状態がリセットされるように、特定のテスト クラスの各単体テスト メソッドを最初に実行するテストであるかのように動作させるにはどうすればよいですか? TestInitialize、ClassInitialize、AssemblyInitialize などを使用して明示的に世界をクリーンアップしたくありません。例:

[TestClass]
public class MyClassTests
{
    [TestMethod]
    public void Test1()
    {
       // The "Instance" property creates a new instance of "SomeSingleton"
       // if it hasn't been created before.
       var i1 = SomeSingleton.Instance;
       ...
    }
    [TestMethod]
    public void Test2()
    {
       // When I select "Test1" and "Test2" to run, I'd like Test2
       // to have a new AppDomain feel so that the static variable inside
       // of "SomeSingleton" is reset (it was previously set in Test1) on
       // the call to ".Instance"
       var i2 = SomeSingleton.Instance;
       // some code
    }

このトピックには同様の質問がありましたが、テストが並行して実行されないことが明確になっただけです。テストが連続して実行されることはわかっていますが、メソッドごとに新しい AppDomain を明示的に強制する方法 (またはすべての状態をクリアする同等のもの) はないようです。

理想的には、単体テストの小さなサブセットに対してのみこの動作を指定して、グローバル状態を気にしないテストのために新しい AppDomain を作成するというペナルティを支払う必要がないようにしたいと考えています (大部分の私のテスト)。

4

4 に答える 4

7

最後に、 AppDomain.CreateDomainを使用するヘルパーを作成し、リフレクションを使用して別の AppDomain で単体テストを呼び出しました。それは私が必要としていた分離を提供します。

MSDN のフォーラムのこの投稿では、リセットが必要な統計がわずかしかない場合の状況の処理方法を示しています。いくつかのオプションについて言及しています (例: Reflection とPrivateType使用)。

特に MSTEST について明らかな何かが欠けている場合は、今後も引き続きアイデアを歓迎します。

于 2008-10-13T17:24:49.357 に答える
6

リフレクションを使用してシングルトンインスタンスを削除するヘルパーをテストに追加します(シングルトンにリセットメソッドを追加することもできますが、その使用については心配です)。何かのようなもの:

public static class SingletonHelper {
            public static void CleanDALFactory() 
            {
                    typeof(DalFactory)
                        .GetField("_instance",BindingFlags.Static | BindingFlags.NonPublic)
                        .SetValue(null, null);
            }
}

TestInitializeメソッドでこれを呼び出します。[これが「世界をクリーンアップする」ことであることは知っていますが、シングルトンごとにヘルパーでメソッドを1回記述するだけで済みます。これは非常に簡単で、明示的な制御が可能です]

于 2008-10-13T18:36:08.043 に答える
2

TestIntialize 属性と TestCleanUp 属性を探していると思います。これは、実行順序のリンク テキストを示す MSDN ブログです。

于 2008-10-13T15:14:39.040 に答える
1

MSTests でも同様の問題が発生しました。それを必要とする特定のテストの最初と最後に関数を呼び出すことで、それを処理しました。

アプリ構成にテストの有効期限を保存しています。3 つのテストでは、適切な値を決定するために、この日付が特定の範囲に収まる必要がありました。アプリケーションのセットアップ方法では、セッションで値が割り当てられていない場合にのみ、構成値がリセットされます。そのため、2 つの新しいプライベートな静的関数を作成しました。1 つは構成値を指定された日付に明示的に設定するためのもので、もう 1 つはテストの実行後にセッションからその日付をクリアするためのものです。3 つのテストでは、これら 2 つの関数を呼び出しました。次のテストが実行されると、アプリケーションは日付の空の値を確認し、構成ファイルから再取得します。

それが参考になるかどうかはわかりませんが、これが同様の問題を回避する方法でした。

于 2008-10-13T15:07:34.423 に答える