質問
アセンブリ内の各テストの前に特定のメソッドを実行することは可能ですか?
TestInitialize
属性について知っていますが、この属性には" class scope"があります。 Testクラスで定義されている場合、このクラスの各テストの前に実行されます。
アセンブリ全体で定義された各テストの前に実行されるメソッドを定義したい。
解決
この機能が、他のテストフレームワーク(MbUnitなど)のようにMsTestですぐに使用できるかどうかはわかりません。
MsTestを使用する必要がある場合、[TestInitialize]属性で抽象クラスTestBaseを定義することでこれを解決し、この動作を必要とするすべてのテストはこの基本クラスから派生します。あなたの場合、アセンブリ内のすべてのテストクラスはこのベースから継承する必要があります...
そして、おそらく別の解決策があります。カスタムテスト属性を作成できます-しかし、私はまだこれを試していません...:
他のヒント
[TestInitialize()]
が必要です。
private string dir;
[TestInitialize()]
public void Startup()
{
dir = Path.GetTempFileName();
MakeDirectory(ssDir);
}
[TestCleanup()]
public void Cleanup()
{
ss = null;
Directory.SetCurrentDirectory(Path.GetTempPath());
setAttributesNormal(new DirectoryInfo(ssDir));
Directory.Delete(ssDir, true);
}
[TestMethod]
public void TestAddFile()
{
File.WriteAllText(dir + "a", "This is a file");
ss.AddFile("a");
...
}
[TestMethod]
public void TestAddFolder()
{
ss.CreateFolder("a/");
...
}
これにより、テストごとに新しいランダムな一時パスが提供され、完了したら削除されます。これをデバッグで実行し、各テストケースのdir変数を調べることで確認できます。
まあ、MSTestは各テストのクラスをインスタンス化していませんか?それが私の理解でした。このような場合、コンストラクタから呼び出すものはすべて初期化コードです(定義によるテストごと)。
編集:動作しない場合(MSTestが個々のテストメソッドの実行を確実に分離する必要があるため、それでも動作するはずです) TestInitialize
が属性です。ちなみに、最適な単体テストの比較は、 Codeplexのリンク
ClassInitialize
属性を探していると思います。