`
wangdeshui
  • 浏览: 257034 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

TDD实验2:使用VSTS 的单元测试功能

阅读更多

我们要实现的功能是,发工资时自动向我们发送邮件,如果工资少于10万(我们多少人的梦想呀),就让他发送失败。

1. 首先我们建一个测试工程和一个测试类

image

测试类重命名为SalaryMessageTest

        [TestMethod]

        public void SendEmailToMe()

        {

            SalaryMessage salaryMessage = new SalaryMessage();           

        }

按Ctrl+Shift+B, 编译无法通过

image

2. 现在我们新建一个SalaryMessage类让测试通过,但是我们想,应该和这个测试工程区分开,我们就建一个VSUnitDemo的Class Library

image

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace VSUnitDemo

{

    public class SalaryMessage

    {

 

    }

}

 

3. 引入命名空间到Test工程

image

using System.Collections.Generic;

using System.Linq;

using Microsoft.VisualStudio.TestTools.UnitTesting;

using VSUnitDemo;

CTRL+R, A 测试全部,Pass

image

4. 现在,我们需要邮件里包含邮箱地址,名字,内容,写测试

      [TestMethod]

        public void Mail_has_EmailAddress_Name_Content()

        {

            Mail m = new Mail

            {

                EmailAddress = "wangdeshui@gmail.com",

                Name = "Jack Wang",

                Content = "Well Done!"

            };

            Assert.AreEqual(m.Name, "Jack Wang");

            Assert.AreEqual(m.EmailAddress,"wangdeshui@gmail.com");

            Assert.AreEqual(m.Content, "Well Done!");

        }

Ctrl+Shift+B编译无法通过,提示无Mail类,我们现在在VSUnitDemo里加入Mail类和相关属性

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace VSUnitDemo

{

   public class Mail

    {

       public string EmailAddress { get; set; }

       public string Name { get; set; }

       public string Content { get; set; }

    }

}

Ctrl+R, A 我们不用切换回测试工程

image

  [TestMethod]

        public void SendEmailToMe()

        {

            SalaryMessage salaryMessage = new SalaryMessage();

            Assert.IsNotNull(salaryMessage);

            Mail m = new Mail

            {

                EmailAddress = "wangdeshui@gmail.com",

                Name = "Jack Wang",

                Content = "Well Done!"

            };

            bool IsSuccess=salaryMessage.SendEmailToMe(m);

            Assert.IsTrue(IsSuccess);

        }

编译无法通过

 

5. 添加SendEmailToMe方法

namespace VSUnitDemo

{

    public class SalaryMessage

    {

        public bool SendEmailToMe(Mail m)

        {

            if (m != null) return true;

            return false;

        }

    }

}

Ctrl+R, A测试PASS

image

6.  添加一项需求,如果发送的邮件的名字,地址,或者内容为空的话,就抛出参数异常      

        [TestMethod]

        [ExpectedException(typeof(ArgumentNullException), "all fields of mail is required")]

        public void Mail_EmailAddressIsRequired_NameIsRequired_ContentIsRequired()

        {

            SalaryMessage salaryMessage = new SalaryMessage();

            Assert.IsNotNull(salaryMessage);

            Mail m1 = new Mail

            {

                EmailAddress = "wangdeshui@gmail.com",

                Name = "",

                Content = "Well Done!"

            };

            Mail m2 = new Mail

            {

                EmailAddress = "wangdeshui@gmail.com",

                Name = "",

                Content = "Well Done!"

            };

            Mail m3 = new Mail

            {

                EmailAddress = "wangdeshui@gmail.com",

                Name = "",

                Content = "Well Done!"

            };

            Assert.IsTrue(salaryMessage.SendEmailToMe(m1));

            Assert.IsTrue( salaryMessage.SendEmailToMe(m2));

            Assert.IsTrue(salaryMessage.SendEmailToMe(m3));

        }

鼠标放入这个测试方法内部 Ctrl+R, T 这运行这个测试方法。

image

6. 修改代码如下,Ctrl+R, A测试通过

image

7. 现在我突然想起来,邮件内容里没有工资,哦,这这是很大的失误

image

8. 添加Salary属性,Ctrl+R, A测试通过

image

9. 我们现在担心,测试代码是否覆盖了。打开测试运行配置文件,如果你没有这个选择Solutin添加新项,添加测试运行配置文件

 

image

Ctrl+R, A 右键Test Results,选择Code Coverage

image

很明显没有覆盖全的是我们的public void Mail_EmailAddressIsRequired_NameIsRequired_ContentIsRequired(),很明显我们只测试了三种控制组合,这里我就不演示了。

 

10. 现在实现,如果工资小于100000我们就让他发送失败,返回false,添加测试

      [TestMethod]

        public void SendEmailToMe_ReturnFalse_IFSalaryLessThan100000()

        {

            SalaryMessage salaryMessage = new SalaryMessage();

            Assert.IsNotNull(salaryMessage);

            Mail m = new Mail

            {

                EmailAddress = "wangdeshui@gmail.com",

                Name = "Jack Wang",

                Content = "Well Done!",

                Salary = 9000

            };

            bool IsSuccess = salaryMessage.SendEmailToMe(m);

            Assert.IsFalse(IsSuccess);

        }

Ctrl+R, A测试失败

image

11. 修改代码

namespace VSUnitDemo

{

    public class SalaryMessage

    {

        public bool SendEmailToMe(Mail m)

        {

 

            if (m != null && !string.IsNullOrEmpty(m.EmailAddress)

                && !string.IsNullOrEmpty(m.Name) && !string.IsNullOrEmpty(m.Content)

                )

            {

                return IsEnough(m.Salary) ? true : false;

 

            }

            else

            {

                throw new ArgumentNullException("parameter is null");

            }           

        }

 

        private bool IsEnough(decimal salary)

        {

            return salary < 100000 ? false : true;

        }

    }

}

 

Ctrl+R, A测试通过

image

12. 问题是,我们引入了一个私有方法,我们如何测试这个方法是否正确呢,一般我们是不测试私有方法的,但现在我们不想调试,就是想测试私有方法,没关系VSTS给我们提供了这样一个功能

image

添加一个测试方法

image

 

Ok,本文主要演示VSTS的单元测试工具在TDD中的威力,我只演示了一部分功能,如果有兴趣,可以自己在深研究

附录:

列出一些快捷键

Ctrl+R, A 测试解决方案中所有的测试

Ctrl+R, T 测试当前鼠标所在的测试方法

Ctrl+R, N 测试当前的命名空间的所有测试

Ctrl+R, C测试当前类的所有测试

 

Ctrl+R, Ctrl+A 调试解决方案中所有的测试

Ctrl+R, Ctrl+T 调试当前鼠标所在的测试方法

Ctrl+R, Ctrl+N 调试当前的命名空间的所有测试

Ctrl+R, Ctrl+C 调试当前类的所有测试

 

VSTS的单元测试还提供很多属性,比如[Ignore]等,同时还可以对测试进行过滤。

 

总结: 我认为VSTS的单元测试是很不错,和IDE集成的非常好。之前我一直用NUnit,但现在我觉得这个非常好用。

 

本文作者:王德水 2008-12-09 12:54.  今天在家休年假,9点起床,脑子真清醒,用VSTS的Unit Test尝试了一下TDD,感觉不错。

分享到:
评论

相关推荐

    C-C++项目的测试驱动开发(TDD):从单元测试到集成测试.md

    在C/C++项目中应用测试驱动开发(TDD)的方法,从单元测试到集成测试,详尽介绍了测试的基础、框架选择、实际应用及最佳实践。文章首先阐述了TDD的核心理念及其优势,包括提升代码质量、减少错误和改进设计等。接着...

    更好的代码:使用单元测试

    标题中的“更好的代码:使用单元测试”提示我们讨论的核心是单元测试在软件开发中的重要性和实践。单元测试是一种软件质量保证方法,它允许开发者对程序的各个独立组件(即单元)进行验证,确保它们按预期工作。这...

    php-tdd-unit:使用TDD策略和单元测试编写PHP

    2. **单元测试** - 单元测试是对软件中的最小可测试单元进行检查和验证,对于PHP,通常是函数、方法或类。 - 使用PHP的单元测试框架,如PHPUnit,可以方便地编写和执行单元测试。 - 测试应独立且可重复:每个测试...

    单元测试之道Java版:使用JUnit

    《单元测试之道Java版:使用JUnit》是一本深入讲解如何在Java开发中运用JUnit进行高效自动化测试的专业书籍。JUnit作为Java领域最广泛使用的单元测试框架,对于任何希望提升软件质量、确保代码健壮性的开发者来说,...

    单元测试与TDD实践

    单元测试与TDD实践 **一、单元测试之测试目的** 单元测试,作为软件开发过程中的重要环节,其核心目标在于确保代码的质量、可维护性和可扩展性。它通过独立测试软件中的最小可测试单元,如函数或方法,来验证其...

    实验四:实验报告 黑盒测试.doc

    本次实验不仅帮助学生深入理解了黑盒测试的概念和技术,还通过实践操作掌握了如何使用CUnit这一流行的测试框架来进行有效的功能测试。通过亲手编写测试用例并对实际的代码进行测试,学生能够更加直观地体会到测试在...

    单元测试:单元测试案例:测试驱动开发(TDD)原理与实践.docx

    单元测试:单元测试案例:测试驱动开发(TDD)原理与实践.docx

    tdd-feedback:获得有关单元测试的反馈

    获取有关单元测试的反馈-如果您尝试对某项进行TDD,并且测试难以编写或维护,发布一些代码段并中的解释上下文,我将做我的工作最好就如何改进它提供一些明确可行的建议。 看看我关于帖子,这启发了我。 戈伊科

    单元测试:单元测试与TDD.zip

    史上最全软件测试技术全套教程,包括: Postman Selenium 单元测试 压力测试 回归测试 安全测试 性能测试 测试工具 集成测试 等流行技术的系列教程

    TDD单元测试

    **TDD单元测试详解** 测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,它强调在编写实际代码之前先编写测试用例。这种方法由Kent Beck在其著作《Test-Driven Development: By Example》中...

    有关单元测试的培训资料

    2. 隔离被测代码:使用模拟对象(mock objects)或存根(stubs)来隔离被测单元,避免外部依赖影响测试结果。 3. 确保可重复性:测试应始终给出一致的结果,不受环境变化的影响。 4. 全覆盖:尽可能覆盖所有代码路径...

    .NET单元测试 《C#单元测试.pdf》和《使用Visual Studio 2005 Team System进行单元测试.pdf》

    2. 测试驱动开发(TDD)和行为驱动开发(BDD):这两种开发模式强调先编写测试,再编写实现代码,有助于设计出更健壮的代码结构。 3. 创建测试:如何编写测试方法,定义测试条件和预期结果,以及如何使用断言来验证...

    nodejs-tdd-learn:使用NodeJS和TDD进行项目:test_tube::beaming_face_with_smiling_eyes:

    2. **测试驱动开发(TDD)**:TDD是一种迭代的开发过程,包括三个步骤:首先是编写测试用例,然后编写最小化的代码来使测试通过,最后重构代码以提高可读性和可维护性。TDD有助于防止缺陷,提高代码质量,并促进更好的...

    python_tdd_book:使用Python进行测试驱动的开发书

    2. **运行测试并确认失败**:运行测试以确保它确实失败,这是TDD的一个关键步骤,因为这证明了测试的有效性。 3. **编写最小化的可成功代码**:接着,编写足够实现测试通过的最小量的代码。这里的目的是避免过度...

    单元测试实例(C#版)

    (C#语言版)单元测试实例,主要功能包括:(1)输入数据到textbox,以逗号间隔,然后求数组最大值、求和,并将结果显示出来,并针对于数组求最大值函数和求和函数写单元测试代码;(2)连接数据库,写出单元测试代码来测试求...

    Struts2SpringUnitDemo单元测试

    Struts2SpringUnitDemo是一个示例项目,...通过这个项目,开发者可以学习到如何在实际应用中结合Struts2和Spring的优势,以及如何使用单元测试确保代码的健壮性。这对于提升Java Web应用的开发效率和质量具有重要意义。

    EmbedC_TDD__1 Keil中搭建自动化单元测试框架Unity

    在嵌入式软件开发中,测试驱动开发(TDD,Test-Driven Development)是一种重要的编程实践,它强调先编写测试用例,再根据测试用例编写功能代码。本主题将聚焦于如何在基于C语言的嵌入式环境,特别是在Keil IDE中,...

    软件测试 单元测试 单元测试 集成测试

    在实际应用中,单元测试和集成测试通常结合使用,形成一种测试金字塔模型,其中单元测试构成了基础,而集成测试和其他类型的测试(如系统测试和验收测试)位于金字塔的上层。这种模型有助于保持测试的效率和深度。 ...

    单元测试之道Java版——使用Junit

    在Java世界里,Junit是广泛使用的单元测试框架,它为开发者提供了方便、高效的测试工具。本篇文章将深入探讨如何利用Junit进行单元测试,并分享一些最佳实践。 首先,我们需要了解什么是单元测试。单元测试是对软件...

    敏捷开发必要技巧12:单元测试

    “第12章单元测试.pdf”文件很可能包含了更深入的单元测试技术,如测试驱动开发(TDD)和行为驱动开发(BDD),以及如何设计和组织测试用例。TDD强调先编写测试用例,再实现功能代码,而BDD则关注从用户视角描述软件...

Global site tag (gtag.js) - Google Analytics