使用 Assert 类
更新:2007 年 11 月
使用 UnitTestingFramework 命名空间的 Assert 类可对特定功能进行验证。单元测试方法执行开发代码中的方法代码,但只有包含 Assert 语句时才能报告代码行为方面的内容。
说明: |
---|
无论是否使用 Assert 语句,单元测试都可以生成代码覆盖率数据。有关更多信息,请参见如何:获取代码覆盖率数据。 |
Assert 类型
Microsoft.VisualStudio.TestTools.UnitTesting 命名空间提供若干类型的 Assert 类:
在测试方法中,可以调用任意数量的 Assert 类方法,如 Assert.AreEqual()。Assert 类有很多方法可供选择,其中许多方法具有若干重载。
使用 CollectionAssert 类可比较对象集合,也可验证一个或多个集合的状态。
使用 StringAssert 类可对字符串进行比较。此类包含各种有用的方法,如 StringAssert.Contains、StringAssert.Matches 和 StringAssert.StartsWith。
只要测试失败,就会引发 AssertFailedException 异常。如果测试超时,引发意外的异常,或包含生成了 Failed 结果的 Assert 语句,则该测试失败。
只要测试生成的结果为 Inconclusive,就会引发 AssertInconclusiveException。通常,向仍在处理的测试添加 Assert.Inconclusive 语句可指示该测试尚未准备好,不能运行。
说明: |
---|
或者可以使用 Ignore 属性标记没有准备好、尚不能运行的测试。但是,这样做的弊端是无法轻松生成尚要实现的测试数量的报告。 |
编写新的 Assert 异常类时使该类从基类 UnitTestAssertException 进行继承,可更方便地将异常标识为断言失败而非从测试或产品代码引发的意外异常。
如果希望开发代码中的某方法引发异常,又想用测试方法来验证是否真的在该方法中引发了异常,则请用 ExpectedExceptionAttribute 属性来修饰测试方法。
使用 Assert.AreEqual 重载不安全类型
Assert.AreEqual 方法具有许多重载,可对特定数据类型进行比较。但是,Assert.AreEqual 方法没有面向不安全类型(如指针数据类型)的重载。
为了说明此问题,请创建一个包含以下类的 C# 控制台应用程序:
unsafe public class CUnsafeTest
{
private int* m_pX = null;
unsafe public void VoidPtr(void* voidPtr)
{
}
unsafe public int* ReturnPointer(float* fPtr, TestThis* pTestThis)
{
int x = 5;
return &x;
}
}
现在为 CunsafeTest 类生成测试。有关更多信息,请参见如何:生成单元测试。您将看到生成与下面的示例类似的代码:
[TestMethod()]
public void ReturnPointerTest()
{
unsafe
{
CodeGen.BVT.Unsafe.CUnsafeTest target;
target = new CodeGen.BVT.Unsafe.CUnsafeTest();
// TODO: Initialize to an appropriate value
System.Single* fPtr = null;
// TODO: Initialize to an appropriate value
TestThis* pTestThis = null;
// TODO: Initialize to an appropriate value
System.Int32* expected = null;
System.Int32* actual;
actual = target.ReturnPointer(fPtr, pTestThis);
Assert.AreEqual(actual, expected);
// On the preceding line, no overload is available.
}
}
在这种情况下,应使用自己的自定义验证代码替换 Assert.AreEqual 语句。