- 浏览: 246957 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (293)
- web (1)
- [随笔分类]项目管理 (30)
- [随笔分类]WCF (14)
- 未分类 (1)
- [随笔分类]Linq (4)
- [随笔分类]C#基础 (24)
- 项目 (1)
- [网站分类]3.非技术区(技术之外的文章,但不要涉及任何政治内容) (8)
- [网站分类]1.首页原创精华.NET区(包含架构设计、设计模式)(对首页文章的要求:原创、高质量、经过认真思考并精心写作) (9)
- [随笔分类]Ubuntu (4)
- ASP.Net (1)
- [网站分类]2..NET新手区(用于发表不合适发表在首页的.NET技术文章,包括小经验、小技巧) (30)
- [随笔分类]ASP.NET MVC (20)
- [随笔分类]ASP.NET (3)
- [随笔分类]程序员厨房 (4)
- [随笔分类]英语学习 (28)
- [网站分类]4.其他技术区 (1)
- [随笔分类]Silverlight (12)
- [随笔分类]CodeSmith (8)
- [随笔分类]其他 (4)
- [随笔分类]Ruby (4)
- [发布至博客园首页] (34)
- [网站分类]其他技术区 (3)
- [随笔分类]Ruby on Rails (2)
- [网站分类].NET新手区 (33)
- [随笔分类]TDD (1)
- [随笔分类]不谈技术 (2)
- [网站分类]非技术区 (7)
最新评论
-
yicone:
You make a mistake when paste t ...
WCF步步为营(一):简单示例 -
jinweijie:
你好,这个实现不错,但是在用了scriptmanager以后就 ...
在服务器端保存ViewState
我们要实现的功能是,发工资时自动向我们发送邮件,如果工资少于10万(我们多少人的梦想呀),就让他发送失败。
1. 首先我们建一个测试工程和一个测试类
测试类重命名为SalaryMessageTest
[TestMethod]
public void SendEmailToMe()
{
SalaryMessage salaryMessage = new SalaryMessage();
}
按Ctrl+Shift+B, 编译无法通过
2. 现在我们新建一个SalaryMessage类让测试通过,但是我们想,应该和这个测试工程区分开,我们就建一个VSUnitDemo的Class Library
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace VSUnitDemo
{
public class SalaryMessage
{
}
}
3. 引入命名空间到Test工程
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using VSUnitDemo;
CTRL+R, A 测试全部,Pass
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 我们不用切换回测试工程
[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
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 这运行这个测试方法。
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]
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测试失败
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测试通过
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,但现在我觉得这个非常好用。
本文作者:王德水 2008-12-09 12:54. 今天在家休年假,9点起床,脑子真清醒,用VSTS的Unit Test尝试了一下TDD,感觉不错。
发表评论
-
ASP.NET MVC源码现在可以下载了(翻译)
2008-03-22 09:44 902上个月我在blog里介绍了ASP.NET MVC Roadm ... -
ASP.NET MVC+LINQ开发一个图书销售站点
2008-03-29 17:12 1296园子里已经有很多人讲解了其理论知识,网上也有不少示例,但是很多 ... -
Linq to SQL Dynamic 动态查询
2008-04-01 15:09 1016在开发中我们常需要使用动态的条件来组合查询,scotte博客里 ... -
使用ASP.NET 3.5 Extensions管理浏览器历史:使用服务器端
2008-04-08 13:15 594我们知道当我们使用ASP.NET AJAX的一些方便的服务端控 ... -
客户比产品更重要
2008-04-12 15:49 605发现博客园里99%都是技术文章,很少有管理的经验分享 ... -
WPF 全球化和本地化(图解)
2008-04-12 16:15 794当您将自己的产品限制为只能通过一种语言使用时,您便将潜在的客户 ... -
项目经理如何参与任务管理
2008-04-14 17:55 648每个项目经理可能都会 ... -
.NET环境下每日集成
2008-04-24 17:36 1351本系列主要介绍了.Net环境下如何使用CruiseContro ... -
项目经理虚拟管理客户
2008-05-28 11:26 529项目经理做项目时经常 ... -
从中国男足看项目管理
2008-06-16 11:39 403国足1:2 不敌伊拉克后,彻底无缘本届世界杯,我想比赛时和赛后 ... -
敏捷的 "道"
2008-11-19 14:10 478本文摘要 敏捷的路上 ... -
在服务器端保存ViewState
2008-11-20 16:51 5501.比较 Asp.net 的一个强大的功能就是ViewStat ... -
TDD Tip:方法内部New出来的对象如何Mock
2008-12-16 00:27 1155解决的问题:方法内部new的对象在测试时希望能够用mock对象 ... -
Web测试:Selenium使用
2008-12-23 10:49 1586<style> .confluenceTable ... -
谈软件协作:君子和而不同,小人同而不和
2008-12-31 18:39 670我们知道现在的软件开 ... -
如何进行ASP.NET MVC 的测试
2009-01-05 00:48 1308本文参考了http://stephenwalther.com/ ... -
如何使ASP.NET MVC Controller易测试呢?
2009-01-05 23:25 944昨天那篇文章如何进行ASP.NET MVC 的测试,虽然通过自 ... -
ASP.NET MVC AJAX的调用
2009-01-10 08:21 3727在ASP.NET MVC beta中我们可以使用Ajax.Be ... -
IIS7 配置ASP.NET 2.0, WCF, ASP.NET MVC
2009-01-16 17:50 4579ASP.NET 2.0 部署 1.首先打开win7 的特性,路 ... -
一步一步学Ruby(一): Ruby介绍
2009-01-21 00:16 757文章摘要 Ruby是如何来的 准备 ...
相关推荐
php-tdd-unit:使用TDD策略和单元测试编写PHP
python_tdd_book:使用Python进行测试驱动的开发书
获取有关单元测试的反馈-如果您尝试对某项进行TDD,并且测试难以编写或维护,发布一些代码段并中的解释上下文,我将做我的工作最好就如何改进它提供一些明确可行的建议。 看看我关于帖子,这启发了我。 戈伊科
(C#语言版)单元测试实例,主要功能包括:(1)输入数据到textbox,以逗号间隔,然后求数组最大值、求和,并将结果显示出来,并针对于数组求最大值函数和求和函数写单元测试代码;(2)连接数据库,写出单元测试代码来测试求...
nodejs-tdd-learn 使用NodeJS和TDD进行项目 :test_tube: :beaming_face_with_smiling_eyes:
单元测试 TDD EASYMOCK 的一般用法说明 实例
在我的单元测试/TDD 演讲中使用的示例。 示例 1 非常简单的例子只是为了展示如何使用 JUnit 设置和运行测试。 例2 一个稍微复杂一点的解决方案,展示了为什么有些类难以测试以及如何解决这些问题。 例3 用于 TDD...
tdd-book:我的“测试驱动开发”书的代码和练习
UT 该项目是使用版本11.2.5生成的。节点版本nvm use .nvmrc...运行单元测试运行ng test以通过执行单元测试。运行端到端测试运行ng e2e通过执行端到端测试。进一步的帮助要获得有关Angular CLI的更多帮助,请使用ng hel
通常,您可以使用任何语言编写自己的测试框架,重点是测试基础结构的状态或定义。 对于单元或合同(状态)测试,测试将涉及检查JSON或YAML配置。 大多数基础架构(如代码框架)已经进行了验收测试,以确保正确创建...
tdd-profiler:使用TDD创建的简单Java分析器
TDD 测试
第1章:使用功能测试进行Django设置 第2章:使用unittest模块扩展功能测试 第3章:使用单元测试测试简单的主页 第4章:我们如何处理所有这些测试? 第5章:保存用户输入 第6章:到达最低可行站点 第2部分: ...
pages/tennis: tennis题目练习的简易TDD测试程序,只能满足当前tennis的单元测试,而且只有deep equals功能(A === B)的断言 pages/wxassert: 通用的单元测试程序,目前只有deep equals功能(A === B)的断言 pages...
包含编译出的三个必须的链接文件: libcppunit.a libqxcppunitd.a libqxrunnerd.a ,及main.cpp实例和简单的test格式。 可用来针对Qt的程序进行单元测试
这些Katas还可用于练习您的C#技能进行单元测试。如何贡献: 想要贡献吗? 发出拉取请求(PR)以分支。 不要对Master分支进行任何PR。解释了Nuget包: Katas欲了解更多信息,请访问:TDD-Katas:接续贡献者非常感谢...
开发人员将对测试驱动开发(TDD)周期有一个基本的了解,并了解如何使用单元测试来编写代码以及重构遗留代码。 为什么要使用单元测试? 编写单元测试 扩展单元测试 过滤PHPUnit测试 建立虚拟对象 与数据提供者...
TddAngular 该项目是使用版本9.1.3生成的。...运行单元测试运行ng test通过执行单元测试。运行端到端测试运行ng e2e以通过执行端到端测试。进一步的帮助要获得有关Angular CLI的更多帮助,请使用ng help或查看 。
fizzBuzzKata 嘶嘶声kata单元测试,TDD简介要安装,请从命令行键入: git clone https://github.com/dicaormu/fizzBuzzKata.git 该项目是gradle项目,但是如果您的系统中没有gradle,则我已经包含了gradle包装器...
EmbedC_TDD__1 Keil中搭建自动化单元测试框架Unity