使用 C# 创作测试

以下示例显示了一个 C# .cs 文件,其中包含一个简单的测试类,演示了 C# 测试标记。 (请注意,此示例仅供演示之用,因此无法编译或运行。)

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# 类上使用 [TestClass] 属性(第 7 行),要声明测试方法,可在普通类方法上使用 [TestMethod] 属性(第 51 行)。

C# 测试标记还支持各种设置和清理方法。

设置了 [AssemblyInitialize] 属性的静态方法在任何其他类方法之前运行,并执行汇编级初始化(第 10 行)。 因此,有一个程序集清理方法,这是一个设置了 [AssemblyCleanup] 属性的静态方法,在所有其他方法完成后运行(第 18 行)。

同样,还有类和测试的设置和清理方法。 (参见第 24 行, 32, 38, 44 行)与 C++ 不同,托管代码中的类设置和清理方法必须是静态的。

TAEF C# 测试标记支持测试、类和模块属性。

要设置模块属性,可在程序集初始化器上设置属性(参见第 11 和 12 行)。 与设置类级属性类似,在类初始化器上设置属性(参见第 25 和 26 行)。 对于测试方法级属性,只需将该属性应用于特定的测试方法即可。 (参见第 52 行和第 53 行)

在 VSTS 下运行

注意:为减少对 VSTS 二进制文件的依赖,目前类和程序集设置方法将对象作为第一个参数。

如果想从 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 在一个特殊的测试应用程序域中执行托管测试。 但是,在使用非默认应用程序域时,本地代码调用托管代码(例如托管代码使用本机回调函数)的情况可能会导致错误信息:“无法跨应用程序域传递 GCHandle”。 在这些情况下,使用 /defaultAppDomain 开关强制托管测试在默认应用程序域中运行。

请注意,在默认应用程序域中运行托管测试与程序集配置文件不兼容。

支持异步测试方法

TAEF 的 NetFX 4.5 二进制文件支持执行异步 TAEF 测试方法。 这意味着标有 async 关键字的 TAEF 测试能够等待异步操作。

注意 不要尝试使用 TAEF 的 NetFX 2.0/3.5 二进制文件来利用此功能;只有 NetFX 4.5 二进制文件支持此功能。

TAEF 同时支持异步 void 和同步 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);
}