http://msdn.microsoft.com/zh-cn/library/ms182532.aspx
然后,可以更改项目代码并重新运行测试。
本主题包含以下各节:
Fix your code and rerun your tests
Use unit tests to improve your code
|
|
|---|
|
如何:安装第三方单元测试框架 |
|
|
|---|
|
演练:使用命令行测试实用工具。 |
准备演练
-
打开 Visual Studio 2012。
-
“项目”。
“新建项目”对话框。
-
“Visual C#”。
-
“类库”。
-
“确定”。
说明
如果名称“Bank”已被使用,请为该项目选择其他名称。
将创建新的 Bank 项目并将其显示在解决方案资源管理器中,而且将在代码编辑器中打开 Class1.cs 文件。
说明
如果代码编辑器中未打开 Class1.cs 文件,请在解决方案资源管理器中双击文件 Class1.cs 将其打开。
-
有关创建单元测试的示例项目中复制源代码。
-
有关创建单元测试的示例项目中的代码替换 Class1.cs 的原始内容。
-
将文件另存为 BankAccount.cs
-
“生成解决方案”。
“BankAccount”,在以下过程中将对该类的方法进行测试。
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 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.Credit(debitAmount); // assert double actual = account.Balance; Assert.AreEqual(expected, actual, 0.001, "Account not credited 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大于零。
-
BankAccount类。
StringAssert.Contains Microsoft 单元测试框架中的方法,使我们能够验证第二个选项,而无需计算所需的第一个选项。
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);
return;
}
catch (ArgumentOutOfRangeException e)
{
// assert
StringAssert.Contains(e.Message, BankAccount. DebitAmountExceedsBalanceMessage);
}
Assert.Fail("No exception was thrown.")
}
但更重要的是,额外的分析还带来更好的代码,我们所测试的项目中。