三、Visual Studio测试属性
在上一节构建我们的测试时,我们需要使用下列两个属性:
[TestMethod]—用于把一个方法标记为一个测试方法。当你运行你的测试时,仅标记有这个属性的方法才能够运行。
[TestClass]—用于把一个类标记为一个测试类。当你运行你的测试时,仅标记有这个属性的类才能够运行。
当构建测试时,你总是使用[TestMethod]和[TestClass]属性。然而,还存在其它若干有用的(但是可选的)测试属性。例如,你可以使用下列属性对来建立和简化你的测试:
[AssemblyInitialize]和[AssemblyCleanup]—分别用于标记那些在一个程序集中的所有测试执行之前或之后要执行的方法
[ClassInitialize]和[ClassCleanup]—分别用于标记那些在一个类中的所有测试执行之前或之后要执行的方法
[TestInitialize]和[TestCleanup]—分别用于标记那些在一个特定的测试方法之前或之后要执行的方法
例如,你可能想创建一个虚构的HttpContext并使之应用于你所有的测试方法中。此时,你可以在一个标记有[ClassInitialize]属性的方法中建立该虚构的HttpContext,然后在一个标记有[ClassCleanup]属性的方法中释放此虚构的HttpContext。
此外,还存在若干属性你可以用于提供关于测试方法的额外信息。当你操作成百上千的单元测试时,你需要通过排序和过滤等方法来管理这些测试。此时,下面这些属性就变得相当有用:
[Owner]—指定一个测试方法的作者
[Description]—提供一个测试方法的描述
[Priority]—能够使你为一个测试指定一个整数优先权
[TestProperty]—指定一个随意的测试属性
你可以在测试视图窗口或测试列表编辑器中使用这些属性来排序和过滤测试。
最后,还存在一个属性可以支持你当运行一个测试时忽略一个特定的测试方法。当你的一个测试出现问题并且你目前还不想处理该问题时,这个属性就变得相当有用的:
? [Ignore]—支持你临时性地禁用一个特定的测试。你可以把这个属性应用于一个测试方法或一个测试类之上。
四、 创建测试断言
大多数情况下,当时你编写你的测试方法代码时你都会使用Assert类提供的方法。例如,大多数测试方法中的最后一行代码往往都使用Assert类来断言一个测试必须满足的条件,从而最终使该测试顺利通过。
Assert类支持下列静态方法:
AreEqual—断言两个值是相等的
AreNotEqual—断言两个值不是相等的
AreNotSame—断言两个对象是不同的对象
AreSame—断言两个对象是相同的对象
Fail—断言一个测试失败
Inconclusive—断言一个测试的结果是不确定的。Visual Studio在它自动生成的方法中包括了这个断言,要求你自己去实现
IsFalse—断言一个给定条件表达式返回值False
IsInstanceOfType—断言一个给定对象是一个指定类型的实例
IsNotInstanceOfType—断言一个给定对象不是一个指定类型的一个实例
IsNotNull—断言一个对象不是一个Null值
IsNull—断言一个对象为一个Null值
IsTrue—断言一个给定条件表达式返回值True
ReplaceNullChars—在一个以\0结尾的字符串中使用\\0代替其中的Null字符
当上面任何一个Assert方法失败时,该Assert类将抛出一个AssertFailedException异常。
例如,假定你在编写一个单元测试来测试一个方法:此方法实现两个数求和。列表4中的测试方法使用了一个Assert方法检查是否被测试方法返回2+2相应的正确的结果。
列表4–CalculateTest.cs
public void AddNumbersTest()
{
int result = Calculate.Add(2, 2);
Assert.AreEqual(result, 2 + 2);
}
值得注意的是,有一个特定的名为CollectionAssert的类,用于测试与集合相关的断言。该CollectionAssert类支持下列静态方法:
AllItemsAreInstancesOfType—断言一个集合中的每一项都属于一个指定的类型
AllItemsAreNotNull—断言一个集合中的每一项都非空
AllItemsAreUnique—断言一个集合中的每一项都是唯一的
AreEqual—断言两个集合中的每一个对应项的值都相等
AreEquivalent—断言两个集合中的每一个对应项的值都相等(但是第一个集合中的项的顺序可能与第二个集合中的项的顺序不相匹配)
AreNotEqual—断言两个集合不是相等的
AreNotEquivalent—断言两个集合不是相等的
Contains—断言一个集合包含一个指定的项
DoesNotContain—断言一个集合不包含一个指定的项
IsNotSubsetOf—断言一个集合不是另一个集合的一个子集
IsSubsetOf—断言一个集合是另一个集合的一个子集
此外,还存在一个特别的名为StringAssert的类,专门用于实现有关于字符串的断言。该StringAssert类支持下列静态方法:
Contains—断言一个字符串包含一个指定的子串
DoesNotMatch—断言一个字符串不匹配一个指定的正规表达式
EndsWith—断言一个字符串以一个指定的子串结束
Matches—断言一个字符串匹配一个指定的正规表达式
StartsWith—断言一个字符串以一个指定的子串开头
最后,你可以使用[ExpectedException]属性来断言一个测试方法应该抛出一个特定类型的异常。在前面的例子中,我们就使用了该ExpectedException属性来测试是否一个NullProductId会致使一个控制器抛出一个ArgumentNullException类型的异常。