2

現在、次のようなテストがあるとします。

[TestMethod]
[DeploymentItem("DataSource.csv")]
[DataSource(
    Microsoft.VisualStudio.TestTools.DataSource.CSV, 
    "DataSource.csv", 
    "DataSource#csv", 
    DataAccessMethod.Sequential)]
public void TestSomething()
{
    string data = TestContext.DataRow["ColumnHeader"].ToString();
    /* 
    do something with the data
    */
}

このテストを実行すると、データ値と同じ数のテストが実行されます。

私がやりたいのは、データソースを保持しながら、この種の動作をコードで複製することです。例: Web サービスの複数のデプロイされたバージョンに対してこのテストを実行したいとしましょう (これは機能テストであるため、何もモックされていません。つまり、複数の Web サービスにデプロイされた Web サイトに対する Codeui テストである可能性が非常に高くなります)。ホスト)。

[TestMethod]
[DeploymentItem("DataSource.csv")]
[DataSource(
    Microsoft.VisualStudio.TestTools.DataSource.CSV, 
    "DataSource.csv", 
    "DataSource#csv", 
    DataAccessMethod.Sequential)]
public void TestSomething()
{
    var svc = helper.GetService(/* external file - NOT a datasource */);
    string data = TestContext.DataRow["ColumnHeader"].ToString();
    /* 
    do something with the data
    */
}

ここで、外部ファイルに 2 つの配置場所がリストされていて、testmethod のデータソースに 2 つの値がある場合、4 つのテストを取得する必要があります。

データソースに値を追加しない理由を尋ねているかもしれません。外部ファイルのデータは、テストの実行のために展開項目を介して取り込まれます。これ.testsettingsは、テストを実行する人ごとに異なる方法で定義することができ、また、テスト コードの再構築を強制したくないためです。テストを実行するか、テスト用のデータ ファイルの数を爆発させます。各テストでは、テスト対象の場所を指定できる場合があります (物理的な場所ではなく、コンパイル時に型が認識されます)。

同様に、展開場所は場所と量が動的になる可能性があるため、展開場所ごとにテストを作成することはできません。

この問題を解決するのに役立つ情報を誰か教えてもらえますか?

4

1 に答える 1

3

アップデート!これは Visual Studio 2010 では機能しますが、2012 および 2013 では機能しないようです。

データ駆動型テストでテストデータとして使用したいファイルがたくさんあるという同様の問題がありました。データ駆動テストを実行する前にCSVファイルを生成することで解決しました。ClassInitialize生成は、属性で装飾された静的メソッドで発生します。

基本的に似たようなことをして、現在のデータ ソースを「外部ファイル」とマージし、データ ドリブン テストで使用する新しい CSV データ ソースを出力できると思います。

public TestContext TestContext { get; set; }
const string NameColumn = "NAME";
const string BaseResourceName = "MyAssembly.UnitTests.Regression.Source";

[ClassInitialize()]
public static void Initialize(TestContext context)
{
    var path = Path.Combine(context.TestDeploymentDir, "TestCases.csv");
    using (var writer = new StreamWriter(path, false))
    {
        // Write column headers
        writer.WriteLine(NameColumn);

        string[] resourceNames = typeof(RegressionTests).Assembly.GetManifestResourceNames();
        foreach (string resourceName in resourceNames)
        {
            if (resourceName.StartsWith(BaseResourceName))
            {
                writer.WriteLine(resourceName);
            }
        }
    }
}

[TestMethod]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", "|DataDirectory|\\TestCases.csv", "TestCases#csv", DataAccessMethod.Random)]
public void RegressionTest()
{
    var resourceName = TestContext.DataRow[NameColumn].ToString();
    // Get testdata from resource and perform test.
}
于 2011-11-09T10:08:43.250 に答える