微软visual studio 单元测试手册.docx
《微软visual studio 单元测试手册.docx》由会员分享,可在线阅读,更多相关《微软visual studio 单元测试手册.docx(36页珍藏版)》请在冰豆网上搜索。
![微软visual studio 单元测试手册.docx](https://file1.bdocx.com/fileroot1/2023-2/1/67c9326c-dee3-47b8-ac0c-229f2cbf28a3/67c9326c-dee3-47b8-ac0c-229f2cbf28a31.gif)
微软visualstudio单元测试手册
微软vs2008单元测试手册
目录
单元测试框架1
单元测试的结构2
如何:
生成单元测试3
生成单元测试4
如何:
创作单元测试5
编辑现有单元测试5
以手动方式键入创建单元测试6
如何:
创建ASP.NET单元测试7
用于数据驱动测试的元素10
编写数据驱动的单元测试的代码10
如何:
配置数据驱动的单元测试11
用于建立调用顺序的属性13
对于程序集13
对于类13
对于测试方法13
用于标识测试类和方法的属性14
Assert类和相关异常14
TestContext类14
用于对测试进行标识和排序的属性16
测试配置类16
用于生成报告的属性17
用于专用访问器的类17
使用Assert类17
使用Assert.AreEqual重载不安全类型18
单元测试框架
单元测试框架支持在VisualStudio中进行单元测试。
对单元测试进行编码时,请使用Microsoft.VisualStudio.TestTools.UnitTesting命名空间中的类和成员。
当您从头开始编写了单元测试或对由测试的代码生成的单元测试进行改进时,您便可以使用这些类和成员。
元素组
为了帮助提供对单元测试框架的更为清晰的概述,本节将UnitTesting命名空间的元素分为相关的功能组。
说明:
使用属性元素(其名称以字符串Attribute结束)时,可以使用也可以不使用字符串Attribute。
例如,下面的两个代码示例功能完全相同:
[TestClass()]
[TestClassAttribute()]
单元测试的结构
单元测试是一个作为使用C#、VisualBasic或VisualC++编写的类中的成员的方法。
说明:
有关如何对C++成品代码使用单元测试以及如何使用用C++编写的单元测试的详细信息,请参见单元测试和C++。
为了使TeamSystem测试工具能够识别出单元测试,此源代码文件必须位于某个测试项目中,而这个项目是VisualStudio解决方案的一部分。
在生成此项目或生成整个解决方案时,测试项目将生成到包含可执行单元测试的程序集之中。
所有单元测试方法都使用[TestMethod()]属性进行标记(在VisualBasic中则为),并且是[TestClass()]类的成员。
而这个类又是在Microsoft.VisualStudio.TestTools.UnitTesting命名空间中定义的。
在生成单元测试时,您可以看到,在所生成文件的开始处的using或Imports语句中包含有此命名空间。
单元测试的属性(Attribute和Property)
除了单元测试方法的[TestMethod()]属性及其包容类的[TestClass()]属性之外,可使用其他属性启用特定的单元测试功能。
在这些属性中,最主要的属性有[TestInitialize()]和[TestCleanup()]。
使用标记有[TestInitialize()]的方法对将要在其中运行单元测试的环境的各个方面进行准备;这样做的目的在于为单元测试的运行建立已知的状态。
例如,可以使用[TestInitialize()]方法复制、更改或创建测试中将要使用的某些数据文件。
在运行完某个测试后,可通过标记有[TestCleanup()]的方法将环境返回到已知状态;这可能意味着需要删除文件夹中的文件,或将某个数据库返回到已知状态。
例如,在测试了订单录入应用程序中使用的某个方法后,可将库存数据库重置为初始状态。
此外,建议您在[TestCleanup()]或ClassCleanup方法中使用清除代码,而不要在终结器方法中使用此代码。
从终结器方法引发的异常不会被捕捉到,并且会导致无法预料的结果。
TestContext属性是测试类的一个重要属性。
此属性包含的信息包括:
当前正在运行的单元测试的名称、部署目录、日志文件的名称;对于数据驱动型测试,还包括所连接到的数据库。
TestContext属性返回一个TestContext实例。
有关更多信息,请参见使用TestContext类。
单元测试示例
下面的代码段演示一个用C#编写的简单的单元测试。
复制代码
[TestMethod()]
publicvoidDebitTest()
{
stringcustomerName="Mr.BryanWalton";
doublebalance=11.99;
BankAccounttarget=newBankAccount(customerName,balance);
doubleamount=11.22;
target.Debit(amount);
Assert.AreEqual((System.Convert.ToDouble(0.77)),target.Balance,0.05);//0.05istoleranceforfloating-pointcomparison
//Assert.Inconclusive("Amethodthatdoesnotreturnavaluecannotbeverified.");
}
若要查看其他示例,请参见编写数据驱动的单元测试的代码。
单元测试的结果
验证是否已通过单元测试有三种方法:
∙使用一条或多条Assert语句验证特定的结果。
有关更多信息,请参见使用Assert语句。
∙验证没有引发任何异常。
仍然可以使用一条或多条Assert语句完成此工作。
∙验证是否引发了某个特定的异常。
可以使用ExpectedExceptionAttribute属性实现此目的。
使用Assert语句
如果某个测试过程产生的“通过”或“失败”结果对于您而言比测试可能完成的某些操作更有指示意义或更加重要,则应在测试代码中使用一条或多条Assert语句。
测试引擎假定所有单元测试在开始时均为通过状态。
测试将保持为此状态,直到Assert语句产生一个与通过状态相矛盾的结果,从而将此状态从“通过”更改为“失败”或“没有结论”,或者直到引发一个未在ExpectedExceptionAttribute属性中指定的异常。
换句话说,没有Assert语句的单元测试在每次运行时都会产生一个“通过”结果。
这并不表明这种测试没有任何价值,使用这种测试的目的可能仅仅是为了执行代码,确信它在运行时不会引发异常。
单元测试中执行的代码将作为代码覆盖率统计信息的一部分进行报告,而无论测试是产生了一个确定的结果还是甚至包含有Assert语句。
但是,为了验证是否执行了某个特定操作或是否达到了某个特定状态,必须使用Assert语句。
Microsoft.VisualStudio.TestTools.UnitTesting命名空间提供了几条可供使用的Assert语句。
不同的Assert语句为您提供了灵活性;例如,可以使用Assert.Fail()语句强迫测试失败。
当然,除了这些Assert语句之外,您还可能可以在if块中使用Assert语句,从而构造自己的自定义功能。
无论测试返回的结果如何,测试的通过或失败都取决于它所包含的Assert语句。
如果一个测试包含多条Assert语句,该测试的状态将保留为“通过”,直到遇到一条将此状态更改为“失败”或“没有结论”的Assert语句。
有关更多信息,请参见使用Assert类。
如何:
生成单元测试
可以采用多种方式创建单元测试。
可以从成品代码生成单元测试(如以下过程所述),然后对其进行编辑,使其按所希望的方式工作。
或者,可以手动创作单元测试,如如何:
创作单元测试中所述。
还可以从不知道其源代码的程序集中生成测试方法。
在测试实验室环境中通常需要这样做。
有关更多信息,请参见以下过程中提到“添加程序集”对话框的步骤。
实现单元测试
在生成单元测试时,为在“创建单元测试”对话框中选择的每种成品代码方法创建一个单元测试方法,以下过程将对此进行解释。
生成的每个单元测试调用Inconclusive方法,由于测试未实现,这将使测试失败。
下一步是添加有意义的代码以检测所测试的方法是否正确运行,从而实现测试。
有关更多信息,请参见如何:
创作单元测试。
生成单元测试
1.在解决方案资源管理器中右击某个测试项目,指向“添加”,再单击“单元测试”。
-或-
在解决方案资源管理器中右击某个测试项目,指向“添加”,再单击“新建测试”。
在“添加新测试”对话框中单击“单元测试向导”,再单击“确定”。
-或-
在“测试列表编辑器”或“测试视图”窗口中右击窗口图面,再单击“新建测试”。
在“添加新测试”对话框中单击“单元测试向导”,再单击“确定”。
-或-
在VisualStudio代码编辑器中,右击要测试的命名空间、类或方法并选择“创建单元测试”。
随即出现“创建单元测试”对话框。
其中会出现一个树状结构,显示代码所属程序集的类和成员层次结构。
使用此页可以为选定的所有成员或类生成单元测试,并可以选择要在其中放置生成的单元测试的项目。
最初在树状结构中选定的代码元素是您右击的元素及其包含的所有子元素。
该选择是基于当前光标位置的。
2.(可选)还可以从文件系统中的程序集生成测试方法。
a.单击“添加程序集”。
随即出现“添加程序集”对话框。
b.定位到文件系统中的程序集,选择该程序集并单击“打开”。
将在“创建单元测试”对话框的树结构中显示选定程序集的代码元素层次结构。
c.可以重复此步骤以显示其他程序集。
3.(可选)单击“筛选器”可更改显示的类和成员层次结构的内容。
4.(可选)通过选中其复选框选择其他代码元素。
5.(可选)单击“设置”可更改此测试的生成配置设置。
例如,可以为要生成的测试文件、类和方法更改默认的命名选项。
完成后,单击“确定”。
6.单击“确定”。
如果解决方案的测试项目中还没有包含测试类的文件,则此操作将创建一个这样的文件并将其打开。
该类中填充了以下方法:
一个“Initialize()”方法、一个“Cleanup()”方法和测试在步骤1和2中选定的代码元素的方法。
解决方案资源管理器将在测试项目中显示新测试文件。
如何:
创作单元测试
编辑单元测试的原因有两个:
您正在手动创作一个单元测试;或者正在编辑一个新生成的单元测试。
虽然您可以运行新生成的单元测试,但是由于它们是使用默认内容创建的,为了使测试能够产生有意义的结果,必须使用适当的值对默认内容进行初始化。
在生成的单元测试中,通常需要自定义变量的赋值以及一个或多个Assert语句。
在单元测试中使用Assert语句
默认情况下,每个生成的单元测试都调用Inconclusive方法,这会导致测试失败,因为测试实际上仍未实现。
下一步是添加有意义的代码,以检查所测试的方法的操作是否正确。
实现该目的的典型方法是生成一个值,然后使用Assert.AreEqual语句将该值与预期值进行比较。
有关示例,请参见单元测试的结构中的“单元测试示例”。
新生成的单元测试包含“To-do”注释,以提供更改建议。
不包含Assert语句的单元测试只要不超时,并且不引发意外的异常,就会自动通过。
有关更多信息,请参见基本测试结果和使用Assert类。
打开和创作单元测试
本主题包含两个过程:
∙第一个过程描述如何编辑现有单元测试。
通常,执行此操作的目的是为了准备一个已经自动生成的单元测试。
请参见如何:
生成单元测试。
∙第二个过程描述如何手动创建和创作一个单元测试。
编辑现有单元测试
1.在解决方案资源管理器中的测试项目中,找到并打开包含该单元测试的文件,然后找到要编辑的单元测试方法。
-或-
在“测试视图”中,双击该单元测试,这将打开包含该单元测试的文件并滚动到相应的单元测试方法。
2.在方法中找到变量赋值部分。
对于新生成的测试,将使用“To-Do”语句标记变量赋值部分,旨在提醒您需要自定义这些赋值语句。
例如,以下便是需要编辑的一个典型的赋值语句:
复制代码
stringtarget.owner=null;//TODO:
Initializetoanappropriatevalue
3.为每个变量赋给相应的值。
若要了解什么样的值才是适当的,应考虑以下几个方面:
在调用方法之前这些变量可能被初始化为的值,在调用方法时这些变量值可能经历的更改,以及期望的结果。
有关此过程的示例,请参见演练:
创建并运行单元测试中的“运行并编辑单元测试”过程。
4.在方法中查找并编辑Assert语句。
如果需要,添加其他Assert语句。
单元测试框架提供了众多的附加Assert类和方法,为您编写有用的Assert语句带来了极大的灵活性。
有关更多信息,请参见单元测试框架。
以手动方式键入创建单元测试
1.在解决方案资源管理器中,右击某个测试项目,指向“添加”,然后单击“新建测试”。
-或-
右击“测试视图”窗口图面,再单击“新建测试”。
这将显示“添加新测试”对话框。
2.在“模板”下单击“单元测试”,然后单击“确定”。
新的源代码文件(其名称类似于UnitTest1.cs)将被添加到测试项目中,它使用测试项目所用的语言。
此文件包含单元测试需要的几个要素:
∙它引用Microsoft.VisualStudio.TestTools.UnitTesting命名空间和System命名空间。
∙它定义自己的命名空间,此命名空间包含一个测试类。
测试类具有[TestClass]属性。
∙它包含一个初始化方法和一个清除方法。
这两个方法分别具有[TestInitialize()]和[TestCleanup()]属性。
∙它包含一个具有[TestMethod]属性的空白测试方法。
您可以在此方法内添加测试逻辑。
这个方法的默认名称类似于TestMethod1()。
此文件还会在用于编辑源代码的窗口中打开。
新的(空白)测试方法将显示在“测试视图”窗口和“测试列表编辑器”中。
3.为测试方法添加测试代码。
单元测试框架提供了众多的附加Assert类和方法,为您编写有用的Assert语句带来了极大的灵活性。
如何:
创建ASP.NET单元测试
使用ASP.NET单元测试可对ASP.NET项目中的方法进行测试。
可采用以下两种方式中的任意一种创建ASP.NET单元测试:
∙通过从ASP.NET项目生成ASP.NET单元测试。
这是最常用的方法。
∙通过将现有的单元测试配置为ASP.NET单元测试。
还可以在运行配置中指定与ASP.NET单元测试所用属性对应的设置。
以下几节对这些过程进行了描述。
说明:
在运行ASP.NET单元测试时,请勿对包含ASP.NET单元测试的类中的任何方法使用ClassCleanupAttribute或ClassInitializeAttribute属性。
同样,请勿在与ASP.NET单元测试相同的程序集中使用AssemblyCleanupAttribute或AssemblyInitializeAttribute属性。
在这些情况下使用这些属性所产生的结果不具有确定性。
不过,可以对所有单元测试使用TestInitializeAttribute和TestCleanupAttribute属性。
无论这些测试运行中包含的测试类型如何,都将在测试运行之前和之后分别运行安装脚本和清理脚本。
有关与测试运行一起运行的脚本的更多信息,请参见测试部署概述和如何:
指定测试运行配置。
生成ASP.NET单元测试
若要生成ASP.NET单元测试,首先要在VisualStudio解决方案中创建一个ASP.NET网站。
然后向网站项目中添加一个类,最后从该类生成单元测试。
生成ASP.NET单元测试
1.若要生成ASP.NET单元测试,首先请创建一个ASP.NET网站。
为此,请右击解决方案,指向“添加”,再单击“新建网站”。
2.在“添加新网站”对话框上单击“ASP.NET网站”。
3.在“位置”之下单击“文件系统”指示ASP.NETDevelopmentServer。
4.单击“确定”。
现在即生成一个新网站。
5.向此项目中添加一个类。
为此,请在“解决方案资源管理器”中右击该网站,再单击“添加新项”。
6.在“添加新项”对话框中单击“类”,再单击“添加”。
7.出现一个“MicrosoftVisualStudio”对话框,询问是否要在App_Code文件夹中放置新类。
单击“是”。
说明:
不能从.aspx文件或App_Code之外的其他文件夹中的代码生成测试。
8.生成一个ASP.NET单元测试。
如果新类文件尚未打开,请在解决方案资源管理器中双击它以将其打开。
9.在类文件中右击该类,再单击“创建单元测试”。
10.随即出现“创建单元测试”对话框。
有关如何使用此对话框生成单元测试的信息,请参见如何:
生成单元测试。
11.验证已选定要为其生成测试的类、方法或命名空间。
12.(可选)接受默认的“输出项目”或选择一个新项目。
13.完成上述操作后,单击“确定”。
新ASP.NET单元测试即添加到测试项目中的文件中。
若要查看该单元测试,请打开测试文件并滚动到末尾处。
运行单元测试(作为ASP.NET单元测试)必需的属性均已自动指定。
有关这些属性的更多信息,请参见下面的“配置ASP.NET单元测试”过程。
配置ASP.NET单元测试
可以将现有的单元测试配置为ASP.NET单元测试,方法为对特定测试的自定义属性赋值。
可以在包含该单元测试的代码文件中设置这些值。
在设置自定义属性之前,首先应添加对支持自定义属性的命名空间的引用;此处为Microsoft.VisualStudio.TestTools.UnitTesting.Web命名空间。
有了此引用,IntelliSense就可以帮助您设置属性值。
注意 生成ASP.NET单元测试时,将自动设置这些属性。
配置ASP.NET单元测试
1.打开包含该单元测试的代码文件。
2.设置该单元测试的以下属性:
[TestMethod]
由于所有单元测试都需要[TestMethod]属性,因此应事先设置此属性。
[UrlToTest()]
这是运行此单元测试时所测试的URL;例如[UrlToTest(“http:
//localhost/WebSites/Default.aspx”)]
[HostType()]
使用[HostType(¡°ASP.NET¡±)]。
测试通常在VSTest宿主进程下运行,但ASP.NET单元测试必须在ASP.NET宿主进程下运行。
示例
示例1.如果使用ASP.NETDevelopmentServer运行网站,则为ASP.NET单元测试设置的属性和值与以下类似:
[TestMethod()]
[HostType("ASP.NET")]
[UrlToTest("http:
//localhost:
25153/WebSite1")]
[AspNetDevelopmentServerHost("D:
\\DocumentsandSettings\\username\\MyDocuments\\VisualStudio2005\\WebSites\\WebSite1","/WebSite1")]
示例2.若要测试在IIS下运行的网站,请仅使用TestMethod、HostType和UrlToTest属性:
[TestMethod()]
[HostType("ASP.NET")]
[UrlToTest("http:
//localhost:
25153/WebSite1")]
使用运行配置对ASP.NET单元测试进行配置
可以在运行配置中指定与ASP.NET单元测试所用的属性对应的设置。
在运行配置中指定了这些属性之后,只要该运行配置为活动状态,就会在运行任何ASP.NET单元测试时应用这些设置。
说明:
只有一组ASP.NET单元测试设置有效:
运行配置设置或属性设置,但永远都不可能是两者的组合。
运行配置设置优先于属性(如果存在)。
也就是说,即使在运行配置中只指定了一个ASP.NET设置,也将忽略任何指定为属性的ASP.NET设置。
使用运行配置对ASP.NET单元测试进行配置
1.打开一个运行配置文件。
有关更多信息,请参见如何:
指定测试运行配置。
2.在“主机”页上,将“主机类型”设置为ASP.NET。
这将显示一些其他选择,其中有些选择与可在代码中指定的属性对应,如“要测试的Url”。
前面的“配置ASP.NET单元测试”过程中对这些属性进行了描述。
完成“主机”页上值的设置后单击“保存”,再单击“确定”。
用于数据驱动测试的元素
使用以下元素来设置数据驱动的单元测试。
编写数据驱动的单元测试的代码
说明:
如果某个单元测试具有数据驱动的单元测试要求的属性,则这个单元测试将用作数据驱动的测试。
通过使用“属性”窗口,或者通过直接将这些属性添加到测试代码中,可以指定这些属性并为它们赋值。
有关通过编辑单元测试的属性来将其配置为数据驱动的单元测试的更多信息,请参见如何:
配置数据驱动的单元测试。
本主题介绍如何使用DataSource属性和TestContext类编写作为数据驱动的单元测试的单元测试。
使用数据源中的数据
在运行数据驱动的单元测试时,从数据源的行中检索数据。
然后,通过TestContext类的DataRow和DataConnection属性将数据提供给正在运行的单元测试。
在下面的示例中,DataRow()()()的类型为DataRow,LastName是以下行中某个有效列的名称,该行与数据驱动的测试的当前迭代关联。
复制代码
TestContext.DataRow["LastName"]
尽管LastName按名称引用列,但是您也可以按列号引用列。
对于表中的每一行来说,可以访问任意数量的列。
例如,您可以一次检索若干个列的数据,使用这些数据进行计算,然后将计算结果与包含期望返回值的最后一列进行比较。
编写数据驱动的单元测试的代码
若要创建一个数据驱动的单元测试,既可以从手动创建的单元测试开始,也可以从生成的单元测试入手。
有关更多信息,请参见如何:
创作单元测试和如何:
生成单元测试。
若要配置现有单元测试,请添加定义以下内容的属性:
测试要使用的数据源、访问数据的方式以及要使用其中的行作为测试输入的数据表。
有关配置这些属性的更多信息,请参见如何:
配置数据驱动的单元测试。
例如,下面的代码就是来自于一个使用