什么是单元测试
检测被测试代码(CUT)功能是否正确,证明被测试代码产生的结果和开发者期望的一致
涉及的sample下载地址
一:创建单元测试
新建Bank项目,复制sample中的class1.cs文件,贴出部分代码(做了少许修改)
namespace BankAccountNS { /// <summary> /// 银行帐户演示类。 /// </summary> public class BankAccount { private string m_customerName;//账户名称 private double m_balance;//账户余额 public BankAccount(string customerName, double balance) { m_customerName = customerName; m_balance = balance; } public string CustomerName { get { return m_customerName; } } public double Balance { get { return m_balance; } } /// 存款动作 public void Credit(double amount) { if (amount < 0) { throw new ArgumentOutOfRangeException("amount"); } m_balance -= amount;//正确应该是+= } /// 提款动作 public void Debit(double amount) { if (amount > m_balance) { throw new ArgumentOutOfRangeException("amount"); } m_balance -= amount; } |
对debit()和credit()方法做单元测试
打开class1.cs,右键—创建单元测试,此时对debit()和credit()2个方法做单元测试
看如下设置图,测试生成设置可修改自己习惯的,这里保持不变
一路点击确定后, 这将创建一个名为 TestProject1 的项目,该项目将显示在解决方案资源管理器中,该测试项目包含一个测试类,命名规则如上图设置
贴出测试类(系统自动生成好的,不需要我们自己编写)主要代码,注意红色加粗标记
[TestClass()] public class BankAccountTest { /// <summary> ///Debit 的测试 ///</summary> ///将自动为每个测试方法分配“TestMethod()”属性。每个测试与要测试的 CUT 中的一个方法相对应。测试方法保存在已分配“TestClass()”属性的测试类中 [TestMethod()] public void DebitTest() { string customerName = string.Empty; // TODO: 初始化为适当的值 double balance = 0F; // TODO: 初始化为适当的值 BankAccount target = new BankAccount(customerName, balance); // TODO: 初始化为适当的值 double amount = 0F; // TODO: 初始化为适当的值 target.Debit(amount); Assert.Inconclusive("无法验证不返回值的方法。"); } /// <summary> ///Credit 的测试 ///</summary> [TestMethod()] public void CreditTest() { string customerName = string.Empty; // TODO: 初始化为适当的值 double balance = 0F; // TODO: 初始化为适当的值 BankAccount target = new BankAccount(customerName, balance); // TODO: 初始化为适当的值 double amount = 0F; // TODO: 初始化为适当的值 target.Credit(amount); Assert.Inconclusive("无法验证不返回值的方法。"); } } } |
目前为止,我们有Bank项目,和为其创建的测试项目TestProject1,测试项目下的测试类BankAccountTest.cs对应测试Bank项目中的2个方法.
二:运行单元测试
先看测试方法CreditTest(),注释掉Assert.Inconclusive("无法验证不返回值的方法。");(关于Assert.Inconclusive方法参考msdn),此时右键—运行测试, 则会得出“已通过”结果,但这仅仅是因为它没有对任何内容进行测试。必须添加对预期的结果进行测试的代码。
修改后的测试方法CreditTest()如下
///Credit 的测试 ///</summary> [TestMethod()] public void CreditTest() { string customerName = "jason"; // TODO: 初始化为适当的值 double balance = 66.6; // TODO: 初始化为适当的值 BankAccount target = new BankAccount(customerName, balance); // TODO: 初始化为适当的值 double amount = 10.3; // TODO: 初始化为适当的值 target.Credit(amount); //Assert.Inconclusive("无法验证不返回值的方法。"); Assert.AreEqual(System.Convert.ToDouble(76.9), target.Balance,0.05);//验证指定值是否相当,第一个参数为期望的值,第2个参数为代码运行得到的值 } |
’Jason’账户人有余款$66.6,运行Credit()存款方法,存入$10.3.我们回到被测试项目Bank,查看Credit()方法的目的是存款后修改账户余额.重点看最后一句代码,很显然,我们期望存款后余额为$76.9,对这个期望值和代码运行值做比较.右键点击--运行测试,不能通过.期望的值和代码运行后的不相同!
说明我们编写的代码是不正确的.回到原代码,将”-=”修改为正确的”+=”,保存后再次运行测试,及通过!
测试完毕!
备注:整理来源于:MSDN Visual Studio Team System 文档 Test Edition演练章节