- 浏览: 257034 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (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 941上个月我在blog里介绍了ASP.NET MVC Roadm ... -
ASP.NET MVC+LINQ开发一个图书销售站点
2008-03-29 17:12 1324园子里已经有很多人讲解了其理论知识,网上也有不少示例,但是很多 ... -
Linq to SQL Dynamic 动态查询
2008-04-01 15:09 1053在开发中我们常需要使用动态的条件来组合查询,scotte博客里 ... -
使用ASP.NET 3.5 Extensions管理浏览器历史:使用服务器端
2008-04-08 13:15 620我们知道当我们使用ASP.NET AJAX的一些方便的服务端控 ... -
客户比产品更重要
2008-04-12 15:49 659发现博客园里99%都是技术文章,很少有管理的经验分享 ... -
WPF 全球化和本地化(图解)
2008-04-12 16:15 826当您将自己的产品限制为只能通过一种语言使用时,您便将潜在的客户 ... -
项目经理如何参与任务管理
2008-04-14 17:55 678每个项目经理可能都会 ... -
.NET环境下每日集成
2008-04-24 17:36 1387本系列主要介绍了.Net环境下如何使用CruiseContro ... -
项目经理虚拟管理客户
2008-05-28 11:26 559项目经理做项目时经常 ... -
从中国男足看项目管理
2008-06-16 11:39 431国足1:2 不敌伊拉克后,彻底无缘本届世界杯,我想比赛时和赛后 ... -
敏捷的 "道"
2008-11-19 14:10 508本文摘要 敏捷的路上 ... -
在服务器端保存ViewState
2008-11-20 16:51 5741.比较 Asp.net 的一个强大的功能就是ViewStat ... -
TDD Tip:方法内部New出来的对象如何Mock
2008-12-16 00:27 1244解决的问题:方法内部new的对象在测试时希望能够用mock对象 ... -
Web测试:Selenium使用
2008-12-23 10:49 1622<style> .confluenceTable ... -
谈软件协作:君子和而不同,小人同而不和
2008-12-31 18:39 706我们知道现在的软件开 ... -
如何进行ASP.NET MVC 的测试
2009-01-05 00:48 1340本文参考了http://stephenwalther.com/ ... -
如何使ASP.NET MVC Controller易测试呢?
2009-01-05 23:25 984昨天那篇文章如何进行ASP.NET MVC 的测试,虽然通过自 ... -
ASP.NET MVC AJAX的调用
2009-01-10 08:21 3767在ASP.NET MVC beta中我们可以使用Ajax.Be ... -
IIS7 配置ASP.NET 2.0, WCF, ASP.NET MVC
2009-01-16 17:50 4636ASP.NET 2.0 部署 1.首先打开win7 的特性,路 ... -
一步一步学Ruby(一): Ruby介绍
2009-01-21 00:16 792文章摘要 Ruby是如何来的 准备 ...
相关推荐
在C/C++项目中应用测试驱动开发(TDD)的方法,从单元测试到集成测试,详尽介绍了测试的基础、框架选择、实际应用及最佳实践。文章首先阐述了TDD的核心理念及其优势,包括提升代码质量、减少错误和改进设计等。接着...
标题中的“更好的代码:使用单元测试”提示我们讨论的核心是单元测试在软件开发中的重要性和实践。单元测试是一种软件质量保证方法,它允许开发者对程序的各个独立组件(即单元)进行验证,确保它们按预期工作。这...
2. **单元测试** - 单元测试是对软件中的最小可测试单元进行检查和验证,对于PHP,通常是函数、方法或类。 - 使用PHP的单元测试框架,如PHPUnit,可以方便地编写和执行单元测试。 - 测试应独立且可重复:每个测试...
《单元测试之道Java版:使用JUnit》是一本深入讲解如何在Java开发中运用JUnit进行高效自动化测试的专业书籍。JUnit作为Java领域最广泛使用的单元测试框架,对于任何希望提升软件质量、确保代码健壮性的开发者来说,...
单元测试与TDD实践 **一、单元测试之测试目的** 单元测试,作为软件开发过程中的重要环节,其核心目标在于确保代码的质量、可维护性和可扩展性。它通过独立测试软件中的最小可测试单元,如函数或方法,来验证其...
本次实验不仅帮助学生深入理解了黑盒测试的概念和技术,还通过实践操作掌握了如何使用CUnit这一流行的测试框架来进行有效的功能测试。通过亲手编写测试用例并对实际的代码进行测试,学生能够更加直观地体会到测试在...
单元测试:单元测试案例:测试驱动开发(TDD)原理与实践.docx
获取有关单元测试的反馈-如果您尝试对某项进行TDD,并且测试难以编写或维护,发布一些代码段并中的解释上下文,我将做我的工作最好就如何改进它提供一些明确可行的建议。 看看我关于帖子,这启发了我。 戈伊科
史上最全软件测试技术全套教程,包括: Postman Selenium 单元测试 压力测试 回归测试 安全测试 性能测试 测试工具 集成测试 等流行技术的系列教程
**TDD单元测试详解** 测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,它强调在编写实际代码之前先编写测试用例。这种方法由Kent Beck在其著作《Test-Driven Development: By Example》中...
2. 隔离被测代码:使用模拟对象(mock objects)或存根(stubs)来隔离被测单元,避免外部依赖影响测试结果。 3. 确保可重复性:测试应始终给出一致的结果,不受环境变化的影响。 4. 全覆盖:尽可能覆盖所有代码路径...
2. 测试驱动开发(TDD)和行为驱动开发(BDD):这两种开发模式强调先编写测试,再编写实现代码,有助于设计出更健壮的代码结构。 3. 创建测试:如何编写测试方法,定义测试条件和预期结果,以及如何使用断言来验证...
2. **测试驱动开发(TDD)**:TDD是一种迭代的开发过程,包括三个步骤:首先是编写测试用例,然后编写最小化的代码来使测试通过,最后重构代码以提高可读性和可维护性。TDD有助于防止缺陷,提高代码质量,并促进更好的...
2. **运行测试并确认失败**:运行测试以确保它确实失败,这是TDD的一个关键步骤,因为这证明了测试的有效性。 3. **编写最小化的可成功代码**:接着,编写足够实现测试通过的最小量的代码。这里的目的是避免过度...
(C#语言版)单元测试实例,主要功能包括:(1)输入数据到textbox,以逗号间隔,然后求数组最大值、求和,并将结果显示出来,并针对于数组求最大值函数和求和函数写单元测试代码;(2)连接数据库,写出单元测试代码来测试求...
Struts2SpringUnitDemo是一个示例项目,...通过这个项目,开发者可以学习到如何在实际应用中结合Struts2和Spring的优势,以及如何使用单元测试确保代码的健壮性。这对于提升Java Web应用的开发效率和质量具有重要意义。
在嵌入式软件开发中,测试驱动开发(TDD,Test-Driven Development)是一种重要的编程实践,它强调先编写测试用例,再根据测试用例编写功能代码。本主题将聚焦于如何在基于C语言的嵌入式环境,特别是在Keil IDE中,...
在实际应用中,单元测试和集成测试通常结合使用,形成一种测试金字塔模型,其中单元测试构成了基础,而集成测试和其他类型的测试(如系统测试和验收测试)位于金字塔的上层。这种模型有助于保持测试的效率和深度。 ...
在Java世界里,Junit是广泛使用的单元测试框架,它为开发者提供了方便、高效的测试工具。本篇文章将深入探讨如何利用Junit进行单元测试,并分享一些最佳实践。 首先,我们需要了解什么是单元测试。单元测试是对软件...
“第12章单元测试.pdf”文件很可能包含了更深入的单元测试技术,如测试驱动开发(TDD)和行为驱动开发(BDD),以及如何设计和组织测试用例。TDD强调先编写测试用例,再实现功能代码,而BDD则关注从用户视角描述软件...