Unit test
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前言
本文是阅读了《单元测试之道》一书后的笔记,也是公司安排本人进行单元测试培训的材料,原文是一个Powerpoint,故修改了下,并针对Visual studio 2005自带的单元测试做的一个整理,将其奉献出来,目的是供需要了解和学习单元测试的朋友们阅读。如有错误望指出。
什么是单元测试?
单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。
执行单元测试,是为了证明某段代码的行为确实和开发者所期望的一致。为什么需要单元测试?
当编写项目的时刻,如果我们假设底层的代码是正确无误的,那么先是高层代码中使用了底层代码;然后这些高层代码又被更高层的代码所使用,如此往复。当基本的底层代码不再可靠时,那么必需的改动就无法只局限在底层。虽然你可以修正底层的问题,但是这些对底层代码的修改必然会影响到高层代码。
于是,一个对底层代码的修正,可能会导致对几乎所有代码的一连串改动,从而使修改越来越多,也越来越复杂。从而使整个项目也以失败告终。
而单元测试的核心内涵:这个简单有效的技术就是为了令代码变得更加完美。
什么是断言
Assertion(断言),它是一个简单的方法调用,用于判断某个语句是否为真。
例如:
public void IsTrue(bool condtion){
if(!condition) abort();
}
应用则为:
int a=2;
IsTrue(a==2);
还可以编写更多的特定数据类型的断言。
计划你的单元测试
当我们编写了一个如下的函数,它用于查找list中的最大值:static int Largest(int[] list);
所能想到的测试如下:
创建单元测试
在解决方案资源管理器中右击某个测试项目,或在Visual Studio 代码编辑器中,右击要测试的命名空间、类或方法并选择“创建单元测试”。
VsUnit 的各种断言
Assert
在测试方法中,可以调用任意数量的Assert 类方法,如Assert.AreEqual()。Assert 类有很多方法可供选择,其中许多方法具有若干重载。CollectionAssert
使用CollectionAssert 类可比较对象集合,也可验证一个或多个集合的状态。
StringAssert
使用StringAssert 类可对字符串进行比较。此类包含各种有用的方法,如StringAssert.Contains、StringAssert.Matches 和StringAssert.StartsWith。AssertFailedException
只要测试失败,就会引发AssertFailedException 异常。如果测试超时,引发意外的异常,或包含生成了Failed 结果的Assert 语句,则该测试失败。
AssertInconclusiveException (无结果的)
只要测试生成的结果为Inconclusive,就会引发AssertInconclusiveException。通常,向仍在处理的测试添加Assert.Inconclusive 语句可指示该测试尚未准备好,不能运行。
UnitTestAssertException
编写新的Assert 异常类时使该类从基类UnitTestAssertException 进行继承,可更方便地将异常标识为断言失败而非从测试或产品代码引发的意外异常。ExpectedExceptionAttribute
如果希望开发代码中的某方法引发异常,又想用测试方法来验证是否真的在该方法中引发了异常,则请用ExpectedExceptionAttribute 属性来修饰测试方法。
如:
[TestMethod]
[ExpectedException(typeof(ArgumentException),
"userID 为NULL 的异常检测.")]
public void NullUserIdInConstructor()
{
LogonInfo logonInfo = new LogonInfo(null, "P@ss0word");
}
单元测试的属性
除了单元测试方法的[TestMethod()] 属性及其包容类的[TestClass()] 属性之外,可使用其他属性启用特定的单元测试功能。在这些属性中,最主要的属性有[TestInitialize()] 和[TestCleanup()]。使用标记有[TestInitialize()] 的方法对将要在其中运行单元测试的环境的各个方面进行准备;这样做的目的在于为单元测试的运行建立已知的状态。例如,可以使用[TestInitialize()] 方法复制、更改或创建测试中将要使用的某些数据文件。
在运行完某个测试后,可通过标记有[TestCleanup()] 的方法将环境返回到已知状态;这可能意味着需要删除文件夹中的文件,或将某个数据库返回到已知状态。例如,在测试了订单录入应用程序中使用的某个方法后,可将库存数据库重置为初始状态。此外,建议您在[TestCleanup()] 或ClassCleanup 方法中使用清除代码,而不要在终结器方法(~Constructor)中使用此代码。从终结器方法引发的异常不会被捕捉到,并且会导致无法预料的结果。
用于建立调用顺序的属性
对于程序集:
在加载程序集之后以及卸载程序集之前,将调用AssemblyInitialize和AssemblyCleanup。
对于类: