2

重複の可能性:
MSTest の [SetUp] と [TearDown] に代わるものは何ですか?

単体テストと自動テストの一般的な使用方法を学んでいますが、理解できない/答えを見つけることができないいくつかの質問があります

私は現在、さまざまなメソッドを呼び出し、それらにアサートを持つ複数の [TestMethod] を使用してテストしています。現在、TestMethod はすべて、DB をヒットし、残りのテストのために自分自身をセットアップするための重複したコードを持っています。例は次のとおりです。

public void TestDBReturnsFooInFormatXyz() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo format is xyz );
}

public void TestDBFooContainsAbc() {
    var foo = HitDBAndReturnStuff();
    Assert.IsTrue( // foo contains abc );
}

いくつかの質問: テスト クラスでプライベート フィールドを作成し、コンストラクターに設定させることはベスト プラクティスですか?

テスト速度はそれほど重要ではないので、各 TestMethod で行う必要がありますか?

テストの実行時にコンストラクターが確実に呼び出されるようにするには、コンストラクターの上に何 [Test???] を配置すればよいですか?

MSDN と本「Programming Microsoft Visual C# 2008: The Language」を見てきましたが、単体テストに関する適切な情報が見つかりません。これらの質問への回答を読む必要があるリソースがある場合は、お知らせください。

ありがとう!

4

1 に答える 1

2

重複したコードは常に悪い習慣です。そのため、コードをリファクタリングしてTestInitialize Methodでfooオブジェクトを初期化する必要があります。これは各テストの実行前に 1 回実行され、次に各テスト ケースで特定の操作を実行します。

private FooType foo;

[TestInitialize()]
public void TestInitialize()
{
    foo = CreateFooObject();
}

[TestMethod()]
public void TestToAssertThatAbcStuffGetsDone()
{
    foo.DoAbcStuff();
    Assert.IsTrue(foo.DidAbc());
}

[TestMethod()]
public void TestToAssertThatXyzStuffGetsDone()
{
    foo.DoXyzStuff();
    Assert.IsTrue(foo.DidXyz());
}

各テスト メソッドの実行後に foo オブジェクトを破棄する必要がある場合は、 TestCleanup Method も実装する必要があります

ただし、単体テストでデータベースを使用することはベスト プラクティスとは見なされません。これは、テスト結果に影響を与える外部依存関係が望ましくないためです。代わりに、データベースのように機能するが、単体テストを実際のデータベースの依存関係から分離するデータベース モックを使用する必要があります。

接続障害、タイムアウト、データ変更、不定期のデータベース アップグレードなど、いくつかのデータベース関連の問題によってテストが中断される可能性があります。この SO の質問では、データベースの依存関係の問題を処理するための戦略について説明します。

于 2012-12-19T00:29:07.967 に答える