4

多くのクラスで多くの単体テストを行うアプリケーションがあります。多くのテストには、必要なテストデータを提供するためのDeploymentItem属性があります。

[TestMethod]
[DeploymentItem("UnitTesting\testdata1.xml","mytestdata")]
public void Test1(){
    /*test*/
}

[TestMethod]
[DeploymentItem("UnitTesting\testdata2.xml","mytestdata")]
public void Test1(){
    /*test*/
}

テストを個別に実行すると、合格します。すべてを一度に実行すると(たとえば、[現在のコンテキストですべてのテストを実行する]を選択した場合)、DeploymentItem他のテストによって取り残されたsによってテストが間違ったデータを取得するため、一部のテストは失敗します。(または、テストで、まだ実行されていない別のテスト用のファイルが誤って使用されています。)

[TestCleanup]と属性を発見しました[ClassCleanup]。これは役立つようです。私はこれを追加しました:

[TestCleanup]
public void CleanUp(){
    if(Directory.Exists("mytestdata"))
        Directory.Delete("mytestdata", true);
}

問題は、これはすべてのテストメソッドの後に実行され、まだ実行されていないテストのDeploymentItemsを削除するようです。[ClassCleanup]これを防ぐことはできますが、残念ながら、元の問題を防ぐのに十分な頻度で実行されることはありません。

MSDNのドキュメントから、DeploymentItemは、テストが実行される前にファイルがそこにあることを保証するだけのようですが、それよりも具体的ではありません。私は次の問題が発生していると思います。

  1. テスト実行の展開アイテム
  2. (他のことが起こりますか?)
  3. 前のテスト実行からのテストクリーンアップ
  4. 次のテストが実行されます
  5. ファイルがなくなったため、テストは失敗します

さまざまなテスト属性の実行順序を知っている人はいますか?探していましたが、あまり見つかりませんでした。

各デプロイメントアイテムにデータ用の独自の一意のフォルダーを使用させることを考えましたが、何百ものテストを実行する必要があるため、これは困難になります。

4

2 に答える 2

5

テスト属性の順序は次のとおりです。

  1. AssemblyInitializeAttributeでマークされたメソッド。
  2. ClassInitializeAttributeでマークされたメソッド。
  3. TestInitializeAttributeでマークされたメソッド。
  4. TestMethodAttributeでマークされたメソッド。

問題の一部は、Visual Studioが非決定論的な順序(デフォルトでは、これは変更可能です)で、一度に複数の順序でテストを実行することです。これは、各テストの後にフォルダを削除できないことを意味します。


一般に、単体テストのためにディスクに行くのを避けることができれば、それははるかに良いでしょう。一般に、テストを中断する可能性のあるコード以外のものは必要ありません。

于 2013-01-11T21:30:14.837 に答える
1

私も同様の問題を抱えていました。いくつかのテストでは、デプロイされたアイテムを削除する必要があります。すべてのテストは、個別に実行すると合格しますが、プレイリストで実行すると失敗します。私の解決策は醜いですが、単純です。テストごとに異なるフォルダーを使用します

例えば:

    [TestMethod]
    [DeploymentItem("Resources\\DSC06247.JPG", "D1")]
    public void TestImageUploadWithRemoval()
    {
        // Arrange
        myDeployedImagePath = Path.Combine(TestContext.DeploymentDirectory, "D1", "DSC06247.JPG");
        // Act ...
    }

    [TestMethod]
    [DeploymentItem("Resources\\DSC06247.JPG", "D2")]
    public void TestImageUploadWithoutRemoval()
    {
        // Arrange
        myDeployedImagePath = Path.Combine(TestContext.DeploymentDirectory, "D2", "DSC06247.JPG");
        // Act...
    }
于 2013-11-23T09:17:38.777 に答える