求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
 
使用VSTS 的单元测试功能
 

2010-11-18 本文作者:王德水 来源:网络

 

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

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

测试类重命名为SalaryMessageTest

[TestMethod]

publicvoidSendEmailToMe()

{

SalaryMessage salaryMessage =newSalaryMessage();

}

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

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

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceVSUnitDemo

{

publicclassSalaryMessage

{

}

}

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

usingSystem.Collections.Generic;

usingSystem.Linq;

usingMicrosoft.VisualStudio.TestTools.UnitTesting;

usingVSUnitDemo;

CTRL+R, A 测试全部,Pass

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

[TestMethod]

publicvoidMail_has_EmailAddress_Name_Content()

{

Mail m =newMail

{

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类和相关属性

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

namespaceVSUnitDemo

{

publicclassMail

{

publicstringEmailAddress {get;set; }

publicstringName {get;set; }

publicstringContent {get;set; }

}

}

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

[TestMethod]

publicvoidSendEmailToMe()

{

SalaryMessagesalaryMessage =newSalaryMessage();

Assert.IsNotNull(salaryMessage);

Mailm =newMail

{

EmailAddress ="wangdeshui@gmail.com",

Name ="Jack Wang",

Content ="Well Done!"

};

boolIsSuccess=salaryMessage.SendEmailToMe(m);

Assert.IsTrue(IsSuccess);

}

编译无法通过

5. 添加SendEmailToMe方法

namespaceVSUnitDemo

{

publicclassSalaryMessage

{

publicboolSendEmailToMe(Mailm)

{

if(m !=null)returntrue;

returnfalse;

}

}

}

Ctrl+R, A测试PASS

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

[TestMethod]

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

publicvoidMail_EmailAddressIsRequired_NameIsRequired_ContentIsRequired()

{

SalaryMessagesalaryMessage =newSalaryMessage();

Assert.IsNotNull(salaryMessage);

Mailm1 =newMail

{

EmailAddress ="wangdeshui@gmail.com",

Name ="",

Content ="Well Done!"

};

Mailm2 =newMail

{

EmailAddress ="wangdeshui@gmail.com",

Name ="",

Content ="Well Done!"

};

Mailm3 =newMail

{

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 这运行这个测试方法。

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

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

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

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

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

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

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

[TestMethod]

publicvoidSendEmailToMe_ReturnFalse_IFSalaryLessThan100000()

{

SalaryMessagesalaryMessage =newSalaryMessage();

Assert.IsNotNull(salaryMessage);

Mailm =newMail

{

EmailAddress ="wangdeshui@gmail.com",

Name ="Jack Wang",

Content ="Well Done!",

Salary = 9000

};

boolIsSuccess = salaryMessage.SendEmailToMe(m);

Assert.IsFalse(IsSuccess);

}

Ctrl+R, A测试失败

11. 修改代码

namespaceVSUnitDemo

{

publicclassSalaryMessage

{

publicboolSendEmailToMe(Mailm)

{

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

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

)

{

returnIsEnough(m.Salary) ?true:false;

}

else

{

thrownewArgumentNullException("parameter is null");

}

}

privateboolIsEnough(decimalsalary)

{

returnsalary < 100000 ?false:true;

}

}

}

Ctrl+R, A测试通过

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

添加一个测试方法

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



LoadRunner性能测试基础
软件测试结果分析和质量报告
面向对象软件测试技术研究
设计测试用例的四条原则
功能测试中故障模型的建立
性能测试综述
更多...   


性能测试方法与技术
测试过程与团队管理
LoadRunner进行性能测试
WEB应用的软件测试
手机软件测试
白盒测试方法与技术


某博彩行业 数据库自动化测试
IT服务商 Web安全测试
IT服务商 自动化测试框架
海航股份 单元测试、重构
测试需求分析与测试用例分析
互联网web测试方法与实践
基于Selenium的Web自动化测试
更多...