摘自:http://msdn.microsoft.com/zh-cn/library/ms182532.aspx
版本:VS2012
然后,可以更改项目代码并重新运行测试。
本主题包含以下各节:
|
|
|---|
|
如何:安装第三方单元测试框架。 |
|
|
|---|
|
演练:使用命令行测试实用工具。 |
准备演练
-
打开 Visual Studio 2012。
-
“项目”。
此时将出现“新建项目”对话框。
-
“Visual C#”。
-
“类库”。
-
“确定”。
说明
如果名称“Bank”已被使用,请为该项目选择其他名称。
将创建新的 Bank 项目并将其显示在解决方案资源管理器中,而且将在代码编辑器中打开 Class1.cs 文件。
说明
如果代码编辑器中未打开 Class1.cs 文件,请在解决方案资源管理器中双击文件 Class1.cs 将其打开。
-
用于创建单元测试的示例项目中复制源代码。
-
用于创建单元测试的示例项目中的代码替换 Class1.cs 的原始内容。
-
该文件保存为 BankAccount.cs
-
“生成解决方案”。
“BankAccount”,在以下过程中将对该类的方法进行测试。
Debit 方法。,在提取货币帐户并包含以下代码时,debit 方法调用:
// method under test public void Debit(double amount) { if(amount > m_balance) { throw new ArgumentOutOfRangeException("amount"); } if (amount < 0) { throw new ArgumentOutOfRangeException("amount"); } m_balance += amount; }
我们可以通过对解决方案资源管理器中重命名文件执行于在一个步骤。
对选件类重命名文件
BankAccountTest。
BankAccountTests.cs 文件现在包含以下代码:
// unit test code using System; using Microsoft.VisualStudio.TestTools.UnitTesting; namespace BankTests { [TestClass] public class BankAccountTests { [TestMethod] public void TestMethod1() { } } }
添加 using 语句添加到项目测试
在选件类文件的顶部,添加:
using BankAccountNS
测试选件类要求
测试选件类的最低要求如下:
-
[TestClass] 属性在 Microsoft 单元测试框架所需的为托管代码对于包含单元测试方法要运行的测试资源管理器的任何选件类。
-
[TestMethod]属性的方法。
可以使用这些其他选件类,并在方法的测试方法。
方法上面列出。
通过分析方法下测试,我们确定需要签出至少有三种行为:
-
[ArgumentOutOfRangeException],如果超出信用保存与该平衡大。
-
ArgumentOutOfRangeException。
-
如果在 1.) 和 2. 的检查) 满意,方法从帐户余额减去此数量。
在我们第一个测试,我们验证是否比帐户余额小于,并且大于零) 的有效的量 (一提取从该帐户的正确数量。
创建测试方法
-
BankAccountNS; 语句添加到 BankAccountTests.cs 文件。
-
BankAccountTests 选件类:
// unit test code [TestMethod] public void Debit_WithValidAmount_UpdatesBalance() { // arrange double beginningBalance = 11.99; double debitAmount = 4.55; double expected = 7.44; BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance); // act account.Debit(debitAmount); // assert double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, "Account not debited correctly"); }
AreEqual 方案的结构可以验证期末余额什么是我们需要。
测试方法要求
测试方法必须满足以下要求:
-
[TestMethod] 特性修饰方法。
-
void。
-
方法不能有参数。
本节描述迭代过程如何分析,单元测试,开发,并重构可帮助您的生产代码更加可靠和有效。
分析问题
Debit 方法都将正确扣除,可以转向在我们的原始分析的其余的情况:
-
ArgumentOutOfRangeException,如果超出信用保存与该平衡大。
-
ArgumentOutOfRangeException。
创建测试方法
在创建测试方法的第一次尝试解决这些问题是有为:
//unit test method [TestMethod] [ExpectedException(typeof(ArgumentOutOfRangeException))] public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange() { // arrange double beginningBalance = 11.99; double debitAmount = -100.00; BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance); // act account.Debit(debitAmount); // assert is handled by ExpectedException }
若要测试用例,则会提取的此数量小于该平衡时大,我们需要执行的所有:
-
Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange。
-
Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange 的方法主体。新方法。
-
debitAmount 为数字大。
运行测试
运行所有三种测试确认在我们的原始分析的全部大小写正确地介绍。
继续该分析
ExpectedException 属性无法提供此信息。
ArgumentOutOfRangeException 构造函数:
throw new ArgumentOutOfRangeException("amount");
更好,可以使用公开的类型成员指定错误。
测试代码的重构
我们首先定义错误消息的两个常数。选件类范围:
// class under test public const string DebitAmountExceedsBalanceMessage = "Debit amount exceeds balance"; public const string DebitAmountLessThanZeroMessage = "Debit amount less than zero";
Debit 方法的两个条件语句:
// method under test // ... if (amount > m_balance) { throw new ArgumentOutOfRangeException("amount", amount, DebitAmountExceedsBalanceMessage); } if (amount < 0) { throw new ArgumentOutOfRangeException("amount", amount, DebitAmountLessThanZeroMessage); } // ...
重构测试方法
Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 方法,可以执行下列操作之一:
-
ActualValue 大于零。
-
DebitAmountExceedsBalanceMessage。
StringAssert.Contains 方法测试框架使我们验证第二个选项,而无需第一个选项的计算。
Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 的第二个尝试可能类似于:
[TestMethod] public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange() { // arrange double beginningBalance = 11.99; double debitAmount = 20.0; BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);\ // act try { account.Debit(debitAmount); } catch (ArgumentOutOfRangeException e) { // assert StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage); } }
重测,复盖,并重新分析
我们再次测试不同的值时的测试方法,我们会遇到以下情况:
-
这是我们需的行为。
-
这也是好。
-
这不是好,因为我们希望测试方法失败,如果未引发异常。
Fail 断言在测试方法结束时处理不会引发异常的情况。
Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange 的定稿如下所示:
[TestMethod] public void Debit_WhenAmountIsGreaterThanBalance_ShouldThrowArgumentOutOfRange() { // arrange double beginningBalance = 11.99; double debitAmount = 20.0; BankAccount account = new BankAccount("Mr. Bryan Walton", beginningBalance);\ // act try { account.Debit(debitAmount); } catch (ArgumentOutOfRangeException e) { // assert StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage); return; } Assert.Fail("No exception was thrown.") }
但更重要的是,多余的分析也会改进。我们的项目的测试代码。