转载:http://msdn.microsoft.com/zh-cn/library/ms182532(v=vs.80).aspx
此演练将逐步指导您使用 Team System testing tools 来创建、运行和自定义一系列测试。您将从正处于开发过程中的 C# 项目开始,创建执行该项目代码的测试,运行测试并检查结果。然后,可以更改项目代码并重新运行测试。
注意 |
---|
有关如何从命令行运行测试的信息,请参见演练:使用命令行测试实用工具。 |
在本演练中,您将完成以下任务:
-
准备一个要在演练中使用的“银行帐户”项目。
-
打开一个现有项目。
-
为公共和私有方法创建单元测试。
-
对代码运行这些测试。
-
在测试中查找错误并进行更正。
-
在代码中查找错误并进行更正。
准备演练
-
打开 Visual Studio 2005 Team Edition for Testers。
-
在“文件”菜单上指向“新建”,然后单击“项目”。
随即出现“新建项目”对话框。
-
在“项目类型”之下单击“Visual C#”。
-
在“模板”之下单击“类库”。
-
在“名称”行中,键入 Bank,然后单击“确定”。
如果名称“Bank”已被使用,请为该项目选择其他名称。
新的 Bank 项目即被创建,并显示在解决方案资源管理器中。
-
在解决方案资源管理器中双击 Class1.cs 文件,以便在 Visual Studio 代码编辑器中打开它。
-
从 单元测试示例 中复制源代码。
-
用 单元测试示例 中的代码替换 Class1.cs 的原始内容。
-
在“生成”菜单上,单击“生成解决方案”。
现在您有一个名为“Bank”的项目。它包含要测试的源代码和用于对该源代码进行测试的工具。Bank 的命名空间“BankAccountNS”包含公共类“BankAccount”,在以下过程中将对该类的方法进行测试。
先决条件:按照准备演练过程中的步骤执行操作。
创建单元测试
-
在解决方案资源管理器中,双击 Bank 项目中的 Class1.cs 文件。
这将打开要查看和编辑的源文件。
Bank 项目包含要进行测试的代码,也称为“待测试代码”或 CUT。
-
在 Class1.cs 文件的“BankAccount”类中,滚动到“Debit()”方法。
-
右击“Debit()”方法,并选择“创建单元测试”。
这将显示“创建单元测试”对话框。
在“当前选择”下,树结构将显示保存“BankAccount”类的程序集的类和成员层次结构。使用此页可以为选定的任何成员生成单元测试,并可以选择要在其中放置生成的单元测试的测试项目。
在该树结构中,只选择了“Debit()”方法。将其保留选定状态并选择“Credit()”方法。
-
对于“输出项目”,单击“创建新的 Visual C# 测试项目”。
-
单击“设置”。
随即出现“测试生成设置”对话框。在“命名设置”下,可以更改测试文件、测试类和测试方法在生成时的命名方式。在“常规”下,可以更改测试生成的其他方面。将这些设置保留为默认值,然后单击“确定”。
-
在“生成单元测试”对话框中单击“确定”。
随即出现“新建测试项目”对话框。
-
接受默认名称,然后单击“创建”。
这将创建一个名为 TestProject1 的项目,该项目将显示在解决方案资源管理器中。
为该测试项目添加一个名为 Class1Tests.cs 的文件,该文件包含一个测试类。该类由一个初始化方法、一个清理方法和一些用于测试“Debit()”和“Credit()”方法的方法来填充。
将自动为每个测试方法分配“TestMethod()”属性。每个测试与要测试的 CUT 中的一个方法相对应。测试方法保存在已分配“TestClass()”属性的测试类中。
-
在 Class1Tests.cs 中,为要测试的变量指定值。滚动到“DebitTest”方法,在此可以看到指示要设置的变量(即“customerName”、“balance”和“amount”)的三个 // TODO 行。应使用什么值?若要回答此问题,必须知道应用程序运行时要使用的值。
-
在解决方案资源管理器中,双击 Class1.cs 文件将其打开,并滚动到“Main”方法。请注意,客户名称初始化为“Mr. Bryan Walton”,帐户余额初始化为“11.99”,调用“Credit”方法时使用参数“5.77”,调用“Debit”方法时使用参数“11.22”。因此,如果此帐户开始时“Balance”为“11.99”,在调用“Debit”方法时传递“11.22”应生成新“Balance”“0.77”。
在运行和自定义单元测试过程中,您将使用这一预期的“Balance”值 (0.77)。
-
打开 Class1Tests.cs 文件并滚动到“DebitTest”方法。
-
设置下列值:
string customerName = "Mr. Bryan Walton"; double balance = 11.99; double amount = 11.22;
-
保存 Class1Tests.cs 文件。
您已创建了一个源代码文件,其中包含 Bank 项目的测试。现在可以对 Bank 项目的代码运行“BankAccountTest”类中的测试了。
先决条件:执行创建单元测试过程中的步骤。
运行和自定义单元测试
-
使用“测试管理器”窗口或“测试视图”窗口运行 DebitTest 单元测试。
如果“测试结果”窗口尚未打开,则它现在打开。“DebitTest”测试运行。
在“测试结果”窗口的“结果”列中,当测试运行时,测试状态将显示为“正在运行”。测试运行完成后,测试的结果将更改为“没有结论”。
-
在“测试结果”窗口中双击表示测试的行。
这将打开“测试结果详细信息”页,其中包含有关测试结果的信息。
-
请注意,“测试结果详细信息”页显示以下错误消息:“Assert.Inconclusive 失败。无法验证不返回值的方法。”若要创建成功的测试,请先查找并评估此“Assert”语句。
-
若要查找包含“Assert”语句的测试方法,请打开 Class1Tests.cs 文件并滚动到“DebitTest()”方法。
-
Assert 语句是“DebitTest”方法中的最后一行。它显示如下内容:
Assert.Inconclusive("A method that does not return a value cannot be verified.");
注释掉此 Assert 语句。
-
如果现在运行测试,则会得出“已通过”结果,但这仅仅是因为它没有对任何内容进行测试。必须添加对预期的结果进行测试的代码。向“DebitTest”方法的末尾添加以下语句:
Assert.AreEqual((System.Convert.ToDouble(0.77)), target.Balance, 0.05);
此语句将预期结果 (0.77) 与调用“BankAccount”类的“Balance”方法所产生的实际结果进行比较。如果两个值不相等,则“Assert”返回“False”,从而使测试失败。
此“Assert”语句还包括第三个参数“delta”,其值为 0.05。在“Assert.AreEqual”方法的此重载中需要该 delta 参数;它可以补偿“Doubles”等浮点型所固有的舍入错误。
您已运行了“BankAccountTest”测试类的生成的“DebitTest”方法,注意它需要做的更改,请就此做出这些更改。现在,可以测试您应用程序中“Debit”方法的精确性。
先决条件:执行运行和自定义单元测试过程中的步骤。
运行单元测试并修复代码
-
运行 Debit 测试:在“测试视图”中选择“DebitTest”项,并单击“运行”。或者,右击“DebitTest”,再单击“运行选定内容”。
在“测试结果”窗口的“结果”列中,当测试运行时,测试状态将显示为“正在运行”。测试运行完成后,测试的结果将更改为“未通过”。
-
在“测试结果”窗口中双击表示测试的行。
这将打开“测试结果详细信息”页,其中显示以下错误消息:“Assert.AreEqual 失败。期望值: <0.77>,实际值: <23.21>”;这些数字似乎表明数学运算不正确。由于“BankAccountTest”类的“DebitTest”方法测试“BankAccount”类的“Debit”方法,所以从检查“Debit”方法开始。
-
在解决方案资源管理器中,双击 Bank 项目中的 Class1.cs 文件,并滚动到“Debit”方法。
-
请注意以下赋值:
m_balance += amount;
此赋值向余额增加金额,在“Debit”方法中,应当减去赋值。将此行更改为:
m_balance -= amount;
-
再次运行“Debit”测试。
在“测试结果”窗口的“结果”列中,将为“DebitTest”显示“已通过”。
更改源代码后不必重新生成项目,因为运行测试时会生成项目而不进行提示。
您创建了一个可以运行的单元测试,并通过它查找和修复了代码中的错误。
先决条件:执行运行单元测试并修复代码过程中的步骤。
为私有方法创建和运行单元测试
-
在解决方案资源管理器中,双击 Bank 项目中的 Class1.cs 文件。
-
在 Class1.cs 文件的“BankAccount”类中,取消对以下代码的注释:
// new enum: public enum accountType { Gold, Platinum, } // private method: private accountType GetAccountType { get { if (Balance > 15.00) return accountType.Platinum; else return accountType.Gold; } }
-
右击“GetAccountType()”方法,并选择“创建单元测试”。
这将显示“创建单元测试”对话框。
-
在显示的树结构中,只选择了“GetAccountType()”方法。使其保留选定状态,然后单击“确定”。
这样将创建一个名为 VSCodeGenAccessors.cs 的新文件,其中包含可在 BankAccount 类中检索私有实体值的特殊访问器方法。在解决方案资源管理器的测试项目文件夹中可以看到显示的新文件。
-
打开 Class1Tests.cs 文件并滚动到“GetAccountTypeTest()”方法。
-
注释掉下面的行:
Assert.Inconclusive("Verify the correctness of this test method.");
-
在“GetAccountTypeTest()”方法中,找到使用 // TODO: 注释标记的三个赋值语句。将其更改为:
string customerName = "Mr. Bryan Walton"; double balance = 7.00; TestProject1.BankAccountNS_BankAccount_accountTypeAccessor val = TestProject1.BankAccountNS_BankAccount_accountTypeAccessor.Gold;
-
运行 GetAccountTypeTest 测试。
在“测试结果”窗口的“结果”列中,最终测试状态显示为“已通过”。这是预期的结果,因为帐户余额设置为“7.00”时,accountType 应该为“Gold”。
-
在“GetAccountTypeTest()”中,将 balance 赋值更改为:
double balance = 15.01;
-
重新运行 GetAccountTypeTest 测试。
“GetAccountTypeTest()”测试将“GetAccountType()”方法返回的值与预期值进行比较,以测试该方法。在此测试中,为帐户余额 15.01 返回 Gold 值是不正确的。因此,预计该测试会生成结果“未通过”,指示测试的数字超出了 Gold 帐户类型的范围。
您已经添加了一个私有方法,为其创建了新的单元测试并运行了该测试。可以对 balance 变量使用其他边界值(如 15.00)来多次运行该测试。
对程序集中的代码运行测试时,可以通过收集代码覆盖率数据来查看正在测试的项目代码部分。有关更多信息,请参见演练:运行测试并查看代码覆盖率。
可以在命令行中(而不是在 Visual Studio 中)运行测试。有关更多信息,请参见演练:使用命令行测试实用工具。
社区附加资源
添加私有方法的测试有问题
应该这样:
/// <summary>
///GetAccountType 的测试
///</summary>
[TestMethod()]
[DeploymentItem("bank.dll")]
public void GetAccountTypeTest()
{
// PrivateObject param0 = 7 ; // TODO: 初始化为适当的值
BankAccount_Accessor target = new BankAccount_Accessor("Mr. Bryan Walton",12.01); // TODO: 初始化为适当的值
BankAccount_Accessor.accountType actual;
actual = target.GetAccountType;
Assert.AreEqual(actual,BankAccount_Accessor.accountType.Platinum);
}
我也将此记录到的我博客上了http://blog.csdn.net/metababy