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>