次の方法で共有


C# でテストを作成する

次の例は、C# テスト マークアップを示す単純な 1 つのテスト クラスを含む C# .cs ファイルを表しています。 (この例はデモンストレーションのみを目的としているため、コンパイルや実行は行われません。)

1    using Microsoft.VisualStudio.TestTools.UnitTesting;
2    using System;
3    using System.Collections;
4    using WEX.Logging.Interop;
5    using WEX.TestExecution;
6
7    [TestClass]
8    public class ManagedStartMenuTests
9    {
10       [AssemblyInitialize]
11       [TestProperty("Component", "Navigation")]
12       [TestProperty("SubComponent", "StartMenu")]
13       public static void RunModuleSetup(Object context)
14       {
15           defaultPolicy = SetObjectFactoryPolicy(PolicyClassic);
16       }
17
18       [AssemblyCleanup]
19       public static void RunModuleCleanup()
20       {
21           SetObjectFactoryPolicy(defaultPolicy);
22       }
23
24       [ClassInitialize]
25       [TestProperty("TeamOwner", "WEX")]
26       [TestProperty("GroupOwner", "MediaPlayerTest")]
27       public static void TestClassSetup(Object testContext)
28       {
29           objectFactory = new ObjectFactory();
30       }
31
32       [ClassCleanup]
33       public static void TestClassCleanup()
34       {
35           objectFactory.Dispose();
36       }
37
38       [TestInitialize]
39       public void TestMethodSetup()
40       {
41           startMenuObject = objectFactory.CreateObject();
42       }
43
44       [TestCleanup]
45       public void TestMethodCleanup()
46       {
47           startMenuObject.Dispose();
48       }
49
50
51       [TestMethod]
52       [Owner("Someone")]
53       [Priority(0)]
54       public void TestMethod1()
55       {
56           Verify.AreEqual(startMenuObject.size, expectedObjectSize);
57       }
58   }

C# テストを宣言するために、TAEF は VSTS テスト マークアップを使用します。

C# でテスト クラスを宣言するには、通常の C# クラス (7 行目) で [TestClass] 属性を使用し、テスト メソッドの宣言には、通常のクラス メソッド (51 行目) で [TestMethod] 属性を使用します。

C# テスト マークアップでは、さまざまなセットアップ メソッドと クリーンアップ メソッドもサポートされています。

[AssemblyInitialize] 属性セットを持つ静的メソッドは、他のクラス メソッドの前に実行され、アセンブリ レベルの初期化を実行します (10 行目)。 したがって、アセンブリ クリーンアップ メソッドがあります。これは、[AssemblyCleanup] 属性が設定された静的メソッドで、他のすべてのメソッドが完了した後に実行されます (18 行目)。

同様に、クラスとテストのセットアップメソッドとクリーンアップ メソッドも存在します。 (24 行目、32 行目、38 行目、44 行目を参照) C++ とは異なり、マネージド コードのクラスセットアップメソッドとクリーンアップ メソッドは静的である必要があります。

TAEF C# テスト マークアップでは、テスト、クラス、モジュールのプロパティがサポートされています。

モジュールのプロパティを設定するには、アセンブリ初期化子に属性を設定します (11 行目と 12 行目を参照)。 クラス レベルのプロパティを設定するのと同様に、クラス初期化子にプロパティを設定します (25 行目と 26 行目を参照)。 テスト メソッド レベルのプロパティの場合は、特定のテスト メソッドにプロパティを適用するだけです。 (52 行目と 53 行目を参照)

VSTS での実行

注: VSTS バイナリへの依存関係を減らすために、現在のクラスおよびアセンブリのセットアップ メソッドは Object を最初のパラメーターとして受け取ります。

VSTS からテストを実行する場合は、そのオブジェクトの種類を TestContext 型に変更してください。 これにより、microsoft.visualstudio.qualitytools.unittestframework.dllmicrosoft.visualstudio.qualitytools.resource.dllへの依存関係が追加されることに注意してください。

VSTS で実行する場合、手順は少し異なります。 アンマネージ依存関係をコピーするには、ローカル テスト実行の設定をする必要があります。 これを行うには、次のサイトにアクセスする:

  • テスト->テスト実行設定の編集>-ローカルテスト実行
  • [配置] をクリックします。各テストにコピーする必要がある dll を入力します:
    • Wex.Logger.dll
    • Wex.Common.dll
    • Wex.Common.Managed.dll
    • Wex.Communication.dll
    • Wex.Logger.Interop.dll

これは、VSTSがテストケースを実行するたびに新しいディレクトリを作成し、ファイルをコピーするために必要です。 マシン上のこれらのディレクトリは、プロジェクト フォルダーの兄弟フォルダーとして表示できます。

既定のアプリケーションドメインでマネージドテストを実行する

既定では、テスト コードの分離のために、TAEF は特別なテスト アプリケーションドメインでマネージドテストを実行します。 ただし、既定以外のアプリケーション ドメインを使用する場合、ネイティブコードがマネージドコードを呼び出すシナリオ (たとえば、マネージドコードによって消費されるネイティブコールバック関数) では、次のメッセージが表示されるエラーが発生する可能性があります: 「AppDomain 間で GCHandle を渡すことはできません。」 これらのシナリオでは、/defaultAppDomain スイッチを使用して既定のアプリケーションドメインでマネージド テストを強制的に実行します。

既定のアプリケーションドメインでマネージド テストを実行することは、アセンブリ構成ファイルと互換性がないことに注意してください。

非同期テスト メソッドのサポート

TAEF の NetFX 4.5 バイナリでは、非同期 TAEF テスト メソッドの実行がサポートされています。 つまり、非同期キーワードでマークされた TAEF テストは、非同期操作を待機できます。

注: TAEF の NetFX 2.0/3.5 バイナリではこの機能を利用しないでください。この機能をサポートするのは NetFX 4.5 バイナリのみです。

TAEF では、async void と async Task の両方のテスト メソッドがサポートされています (両方とも同じ機能になります)。

[TestMethod]
public async Task MyAsyncTest()
{
    await AsyncAPICall1();
    var result = await AsyncAPICall2();
    Verify.IsTrue(result);
}

あるいは:

[TestMethod]
public async void MyAsyncTest2()
{
    await AsyncAPICall1();
    var result = await AsyncAPICall2();
    Verify.IsTrue(result);
}