现在的位置: 首页 > 综合 > 正文

演练:创建并运行单元测试

2012年04月16日 ⁄ 综合 ⁄ 共 3381字 ⁄ 字号 评论关闭

什么是单元测试

检测被测试代码(CUT)功能是否正确,证明被测试代码产生的结果和开发者期望的一致

涉及的sample下载地址

http://download.microsoft.com/download/0/A/5/0A5FEDD6-D37E-4B57-AE48-88318B97C945/dv_vsetlt01/Bank.zip.exe

:创建单元测试

新建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演练章节

 

 

 

抱歉!评论已关闭.