使用 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.dll 和 microsoft.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);
}