5

Visual Studio 2010 から Visual Studio 2012 にアップグレードしました。

私の単体テスト プロジェクトには、CSV ファイルを生成する [ClassInitialize] メソッドがあり、CSV に接続された [DataSource] を使用してデータ駆動型の [TestMethod] にフィードします。

これは、Visual Studio 2010 でうまく機能します。

これを Visual Studio 2012 で動作させることができません。

VS2012 では、MS テスト ランナーは [DataSource] に接続されたファイルが既に存在している必要があるようです。そうしないと、どのテストも実行されません。自分で CSV を作成すると、データ駆動型テストが実行されますが、[ClassInitialize] で作成されたデータが取得されません。[DataSource] からのテストのリストは、[ClassInitialize] が実行される前に評価されるようです。

回避策はありますか?


これは、問題を再現する最小限のプロジェクトです。私にとって、これは VS2010 では成功しますが、VS2012 では失敗します。

TestProject.cs

using System.Diagnostics;
using System.IO;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace TestProject
{
    [TestClass]
    public class DataDrivenUnitTest
    {
        private static bool _classInitializeCalled;
        private static int _testCount;

        public TestContext TestContext { get; set; }

        [ClassInitialize]
        public static void ClassInitialize(TestContext testContext)
        {
            // Generate the csv list of tests
            //TestContext = testContext;
            _classInitializeCalled = true;
            string testDirectory;
            testDirectory = testContext.DeploymentDirectory;
            using (var f = new StreamWriter(testDirectory + @"\" + "TestList.csv"))
            {
                f.WriteLine("TestName");
                f.WriteLine("TestA");
                f.WriteLine("TestB");
            }
        }

        [TestMethod]
        [DataSource("CsvTestData32")]
        public void TestMethod1()
        {
            _testCount++;
            var testName = TestContext.DataRow["TestName"];
            Debug.Print("Test {0}: {1}", _testCount, testName);
        }

        [ClassCleanup]
        public static void ClassCleanup()
        {
            Assert.IsTrue(_classInitializeCalled);
            Assert.AreEqual(_testCount, 2);
            Debug.Print("Tests completed: Tests run {0}", _testCount);
        }
    }
}

私の場合、「テストを 32 ビットとして実行」がデフォルト設定です。これは以下で変更される可能性があります -

  • VS2012 の場合: TEST > TestSettings > Default Processor Architecture
  • VS2010 では、ソリューション エクスプローラーの [ソリューション アイテム] を右クリックし、[追加] > [新しいアイテム] > [テストの設定] を選択してから、
  • VS2010 メイン メニュー > テスト > テスト設定の編集 > ホスト > 32 ビットまたは 64 ビット プロセスでテストを実行します。

64 ビットを使用する場合は、[DataSource("CsvTestData64")] を使用します。MS Access 64 ビット ODBC ドライバーをインストールする必要がある場合があります。最も簡単な方法は、32 ビットに固執することです。

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="microsoft.visualstudio.testtools" type="Microsoft.VisualStudio.TestTools.UnitTesting.TestConfigurationSection, Microsoft.VisualStudio.QualityTools.UnitTestFramework, Version=10.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
  </configSections>

  <microsoft.visualstudio.testtools>
    <dataSources>
      <add name="CsvTestData32" connectionString="CsvConn32" dataTableName="`TestList.csv`" dataAccessMethod="Sequential" />
      <add name="CsvTestData64" connectionString="CsvConn64" dataTableName="`TestTest.csv`" dataAccessMethod="Sequential" />
    </dataSources>
  </microsoft.visualstudio.testtools>

  <connectionStrings>
    <add name="CsvConn32" connectionString="Driver={Microsoft Text Driver (*.txt; *.csv)};.\;Extensions=csv;" providerName="System.Data.Odbc" />
    <add name="CsvConn64" connectionString="Driver={Microsoft Access Text Driver (*.txt, *.csv)};Dbq=.\;Extensions=csv" providerName="System.Data.Odbc" />
  </connectionStrings>
</configuration>
4

1 に答える 1

4

MSTestHacksが役立つかもしれません。

これにより、IEnumberableテスト クラスの を の として使用できDataSourceますTestMethod

ウェブサイトから:

ランタイム データソース

TestBase からテスト クラスを継承する必要があります

[TestClass]
public class UnitTest1 : TestBase
{ }

を返すプロパティ、フィールド、またはメソッドを作成します。IEnumerable

[TestClass]
public class UnitTest1 : TestBase
{
    private IEnumerable<int> Stuff
    {
        get
        {
            //This could do anything, fetch a dynamic list from anywhere....
            return new List<int> { 1, 2, 3 };
        }
    }
}

前に作成した名前DataSourceを指す属性をテスト メソッドに追加します。IEnumerableこれは完全に修飾されている必要があります。

[TestMethod]
[DataSource("Namespace.UnitTest1.Stuff")]
public void TestMethod1()
{
    var number = this.TestContext.GetRuntimeDataSourceObject<int>();

    Assert.IsNotNull(number);
}
于 2014-12-18T18:38:23.243 に答える