
11.3 初始化和清理
有时必须编写在运行测试用例时执行的大量设置代码。例如,如果单元测试使用了数据库,为了确保测试用例可以不断重复地进行,在每一次测试完成以后,还应当把数据库恢复到初始状态。对于修改如文件系统等其他资源的单元测试来说也是如此。在编写初始化和清理测试用例的方法时,Visual Studio提供了大量丰富的支持。同样,负责初始化和清理测试用例的方法需要用特性进行标记。
初始化和清理测试用例的特性可以分为3个层次:有的应用于单个测试,有的应用于整个测试类,另外一些应用于整个测试项目。
11.3.1 TestInitialize和TestCleanup特性
顾名思义,在一个特定测试类中的每一个测试用例运行之前或者结束之后,应当运行TestInitialize和TestCleanup特性指示的方法。这些方法可以分配测试类中的所有测试用例需要的资源,之后释放这些资源。
11.3.2 ClassInitialize和ClassCleanup特性
某些情况下,确保测试环境在整个测试类运行之前或者之后处于正确的状态,要比在每一次测试时设置和清理数据简单得多。前面提及,测试类可以对测试用例进行有效的分组管理,现在正好验证了这一点。可以把测试用例分组存放到测试类中,然后对每个类中的方法标记对应的ClassInitialize和ClassCleanup特性。这些方法必须标记为static,标记为ClassInitialize的方法还必须带有一个UnitTesting.TestContext类型的参数。
11.3.3 AssemblyInitialize和AssemblyCleanup特性
最后一个层次上的初始化和清理特性是用于程序集或者项目级别的。对于在整个测试项目运行之前初始化环境的方法,或者在整个测试项目运行结束之后执行清理操作的方法,可以分别标记上AssemblyInitialize和AssemblyCleanup特性。由于这些方法作用于测试项目中的每一个测试用例,因此每个测试项目中只能有一个方法可以标记上AssemblyInitialize或者AssemblyCleanup特性。与类层次上的特性一样,这些方法必须标记为static,用AssemblyInitialize标记的方法还必须带有一个UnitTesting.TestContext类型的参数。
对于程序集层次和类层次上的特性,即使只运行一个测试用例,也会执行标记了这些特性的方法。
最好把标记了AssemblyInitialize和AssemblyCleanup特性的方法放在它们自己的测试类中,以便于查找。如果有多个方法标记了上述两个特性,那么在运行项目中的任何测试时会出现一个运行时错误。