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 { getset; }

       public string Name { getset; }

       public string Content { getset; }

    }

}

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 != nullreturn 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,但现在我觉得这个非常好用。

本文转自敏捷的水博客园博客,原文链接http://www.cnblogs.com/cnblogsfans/archive/2008/12/10/1351532.html如需转载请自行联系原作者


王德水

相关文章
|
23天前
|
运维
【运维基础知识】用dos批处理批量替换文件中的某个字符串(本地单元测试通过,部分功能有待优化,欢迎指正)
该脚本用于将C盘test目录下所有以t开头的txt文件中的字符串“123”批量替换为“abc”。通过创建批处理文件并运行,可实现自动化文本替换,适合初学者学习批处理脚本的基础操作与逻辑控制。
119 56
|
11天前
|
测试技术 C# 数据库
C# 一分钟浅谈:测试驱动开发 (TDD) 实践
【10月更文挑战第18天】测试驱动开发(TDD)是一种软件开发方法论,强调先编写测试代码再编写功能代码,以确保代码质量和可维护性。本文从 TDD 的基本概念入手,详细介绍了其核心步骤——编写测试、运行测试并失败、编写代码使测试通过,以及“红绿重构”循环。文章还探讨了 TDD 的优势,包括提高代码质量、促进设计思考、减少调试时间和文档化。此外,文中分析了常见问题及解决方案,如测试覆盖率不足、测试代码过于复杂、忽视重构和测试依赖过多,并通过一个简单的计算器类的代码案例,展示了 TDD 的实际应用过程。
24 1
|
1月前
|
测试技术
Appscan手工探索、手工测试功能实战
Appscan手工探索、手工测试功能实战
|
2月前
|
JSON 移动开发 监控
快速上手|HTTP 接口功能自动化测试
HTTP接口功能测试对于确保Web应用和H5应用的数据正确性至关重要。这类测试主要针对后台HTTP接口,通过构造不同参数输入值并获取JSON格式的输出结果来进行验证。HTTP协议基于TCP连接,包括请求与响应模式。请求由请求行、消息报头和请求正文组成,响应则包含状态行、消息报头及响应正文。常用的请求方法有GET、POST等,而响应状态码如2xx代表成功。测试过程使用Python语言和pycurl模块调用接口,并通过断言机制比对实际与预期结果,确保功能正确性。
219 3
快速上手|HTTP 接口功能自动化测试
|
3月前
|
NoSQL Linux Android开发
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
本文介绍了如何在QEMU中挂载虚拟分区、创建和编译简单的Linux内核模块,并在QEMU虚拟机中加载和测试这些内核模块,包括创建虚拟分区、编写内核模块代码、编译、部署以及在QEMU中的加载和测试过程。
179 0
内核实验(三):编写简单Linux内核模块,使用Qemu加载ko做测试
|
3月前
|
XML Web App开发 数据挖掘
Postman接口测试工具全解析:功能、脚本编写及优缺点探讨
文章详细分析了Postman接口测试工具的功能、脚本编写、使用场景以及优缺点,强调了其在接口自动化测试中的强大能力,同时指出了其在性能分析方面的不足,并建议根据项目需求和个人偏好选择合适的接口测试工具。
104 1
|
3月前
|
Java 测试技术 开发者
提高代码质量:深入实践测试驱动开发(TDD)
【8月更文挑战第14天】测试驱动开发是一种强大的软件开发方法,它通过先写测试再编写代码的方式,显著提高了代码质量。通过实践TDD,开发者可以编写出更可靠、更易于维护的代码,并加速开发进程。虽然TDD需要一定的学习和适应过程,但其带来的长期收益是不可估量的。如果你还没有尝试过TDD,现在就开始吧!
|
3月前
|
测试技术 Go
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
写出高质量代码的秘诀:Golang中的测试驱动开发(TDD)
|
3月前
|
测试技术 开发者 Ruby
探索Ruby中测试驱动开发(TDD)的实践及其对传统开发模式的挑战
【8月更文挑战第31天】测试驱动开发(TDD)是一种重要的软件开发方法论,强调先编写测试再编写代码,确保每一步开发都基于测试。在灵活且表达力强的Ruby语言中,TDD尤为适用。本文通过对比传统开发模式与TDD,探讨如何在Ruby中有效实践TDD。传统模式下,测试常被视为次要步骤;而在TDD中,先编写失败的测试用例,再编写通过该测试的代码。以Ruby on Rails项目为例,介绍如何为用户模型添加邮箱验证功能。
26 0
|
3月前
|
Web App开发 敏捷开发 测试技术
自动化测试之美:使用Selenium WebDriver进行网页功能验证
【8月更文挑战第29天】在数字时代,软件质量是企业竞争力的关键。本文将深入探讨如何通过Selenium WebDriver实现自动化测试,确保网页应用的可靠性和性能。我们将从基础设置到编写测试用例,逐步引导读者掌握这一强大的测试工具,同时分享实战经验,让测试不再是开发的负担,而是质量保证的利器。