2.2、创建单元测试项目
2.2.1、新增单元测试项目,并且添加项目引用
2.2.2、创建单元测试类BankAccountTest.cs
将默认的UnitTest1.cs类修改名称为【BankAccountTest.cs】,默认的测试类示例如下:
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace BankTests
{
[TestClass]
public class BankAccountTests
{
[TestMethod]
public void TestMethod1()
{
}
}
}
其中【TestClass】标识该类是一个单元测试类;【TestMethod】标识该方法是一个单元测试方法。
2.2.3、编写一个单元测试的示例方法
①分析:编写单元测试方法以验证 BankAccount 类的 Debit 方法的行为,则至少需要检查三种行为:
·如果借方金额大于余额,该方法将引发 ArgumentOutOfRangeException 。
· 如果借方金额小于零,该方法会引发 ArgumentOutOfRangeException。
· 如果借方金额有效,该方法会从帐户余额中减去该借方金额。
②第一个单元测试方法:验证是否从帐户中提取了正确的有效金额(即小于帐户余额且大于零);将以下方法添加到该 BankAccountTests 类:
[TestMethod]
//验证借出指定的金额后是否与预期的金额相等
public void Debit_WithValidAmount_UpdatesBalance()
{
double beginningBalance = 11.99; //初始金额
double debitAmount = 4.55; //借出去的金额数量
double expected = 7.44; //进出金额后期望剩余的金额数量
BankAccount account = new BankAccount("张三", beginningBalance);
account.Debit(debitAmount);
double actual = account.Balance;
//判断是否相等[若不相等则抛出异常]
Assert.AreEqual(expected, actual, 0.001, "该账户的金额并没有正确的借出去!!!");
}
③生成并运行单元测试和解决错误
首先生成解决方案:
然后选择顶部的【测试】-->【运行所有测试】结果如下:
最后根据单元测试的错误提示排查是由于调用账户的借出金额后的余额与期望的余额不一致导致报错,我们需要排查【account.Debit()】方法,需要将【account.Debit()】方法的 m_balance += amout;修改为 m_balance -= amout;后保存重新【运行所有测试】即可通过单元测试),如下图所示:
using test_UnitTest;
namespace UnitTest
{
[TestClass]
public class BankAccountTest
{
[TestMethod]
//验证借出指定的金额后是否与预期的金额相等
public void Debit_WithValidAmount_UpdatesBalance()
{
double beginningBalance = 11.99; //初始金额
double debitAmount = 4.55; //借出去的金额数量
double expected = 7.44; //进出金额后期望剩余的金额数量
BankAccount account = new BankAccount("张三", beginningBalance);
account.Debit(debitAmount);
double actual = account.Balance;
//判断是否相等[若不相等则抛出异常](运行测试后发现抛出了【该账户的金额并没有正确的借出去!!!】的异常;我们此时需要排查【account.Debit()】方法,
//需要将【account.Debit()】方法的 m_balance += amout;修改为 m_balance -= amout;后重新运行即可通过单元测试)
Assert.AreEqual(expected, actual, 0.001, "该账户的金额并没有正确的借出去!!!");
}
[TestMethod]
//验证借出去的金额小于零时的行为是否正确(即:应该报错)
public void Debit_WhenAmountIsLessThanZero_ShouldThrowArgumentOutOfRange()
{
double beginningBalance = 11.99;
double debitAmount = -100;
BankAccount bankAccount = new BankAccount("张三",beginningBalance);
//使用 ThrowsException 方法断言已引发正确的异常。 除非 ArgumentOutOfRangeException 已引发,否则该方法将导致测试失败。
//如果在借方金额小于零时,临时修改测试方法以引发更通用的 ApplicationException,则测试将正确运行,即测试将失败。
Assert.ThrowsException<System.ArgumentOutOfRangeException>(() => bankAccount.Debit(debitAmount));
}
[TestMethod]
//验证借出去的金额大于余额时的行为是否正确(即:应该报错)
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange()
{
double beginningBalance = 11.99;
double debitAmount =20.0;
BankAccount bankAccount = new BankAccount("张三", beginningBalance);
//使用 ThrowsException 方法断言已引发正确的异常。 除非 ArgumentOutOfRangeException 已引发,否则该方法将导致测试失败。
//如果在借方金额大于余额时,临时修改测试方法以引发更通用的 ApplicationException,则测试将正确运行,即测试将失败。
Assert.ThrowsException<System.ArgumentOutOfRangeException>(() => bankAccount.Debit(debitAmount));
}
[TestMethod]
//该测试方法解决【没有办法知道哪个条件(amount > m_balance 或 amount < 0)导致在测试期间引发异常。
//我们只知道在方法中引发了一个 ArgumentOutOfRangeException。
//更理想的情况是,如果我们知道是 BankAccount.Debit 中的哪个条件导致引发异常(amount > m_balance 或 amount < 0),
//这样就可以确信我们的方法可以正确合理地检查其自变量。】
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange2()
{
// Arrange
double beginningBalance = 11.99;
double debitAmount = 20.0;
BankAccount account = new BankAccount("张三", beginningBalance);
// Act
try
{
account.Debit2(debitAmount);
}
catch (System.ArgumentOutOfRangeException e)
{
// Assert
StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
}
}
[TestMethod]
//该测试方法解决【测试方法不会处理它原本应该处理的所有情况。
//如果所测试的方法 Debit 在 debitAmount 大于余额(或小于零)时未能引发 ArgumentOutOfRangeException,则该测试方法通过。
//这样并不好,因为如果未引发异常,则希望测试方法失败。这是测试方法中的一个 bug。
//要解决该问题,在测试方法末尾添加 Assert.Fail 断言,处理未引发异常的情况。】
public void Debit_WhenAmountIsMoreThanBalance_ShouldThrowArgumentOutOfRange3()
{
// Arrange
double beginningBalance = 11.99;
double debitAmount = 20.0;
BankAccount account = new BankAccount("张三", beginningBalance);
// Act
try
{
account.Debit2(debitAmount);
}
catch (System.ArgumentOutOfRangeException e)
{
// Assert
StringAssert.Contains(e.Message, BankAccount.DebitAmountExceedsBalanceMessage);
return;
}
Assert.Fail("未引发预期的异常");
}
}//Class_end
}
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理