码迷,mamicode.com
首页 > 其他好文 > 详细

初识单元测试

时间:2015-02-23 17:54:48      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

                                 技术分享

一、单元测试的定义

 

       单元测试是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工作。

 

       还有这样一种单元测试的定义:一个单元测试是程序员编写的一段代码,用于执行另一段代码并确定那段代码的行为是否和程序员的期望一致。

 

二、单元测试的一些原则

 

1、测试代码必须要做的几件事情:

准备测试所需要的各种条件(创建所有必须的对象,分配必要的资源等等)

调用要测试的方法

验证被测试方法的行为和期望是否一致

完成后清理各种资源

 

2、单元测试内容:

6个方面:Right-BICEP

Right——结果是否正确;

B——是否所有的边界条件都是正确的?

I——能查一下反向关联吗?

C——能用其他手段交叉检查一下结果吗?

E——你是否可以强制错误条件发生?

P——是否满足性能要求?

 

详细解释

Right:结果是否正确

如果代码能运行正确,如何才知道它是正确的呢? 

1、使用更明确的设计文档

2、真实环境数据

3、???? 

B:边界条件

    尽可能的至少各种特殊或者意外的情况,测试程序是否能正常工作,如: 

  • 完全伪造或者不一致的输入数据,如叫做“(*@Q!&#?±的文件。
  • 格式错误的数据,如错误格式的邮件地址
  • 空值或不完整的值
  • 一些与意料中的合理值相去甚远的值,如年纪为10000
  • 如果要求是一个不允许出现重复数值的list,但传入一个有重复数值的list
  • 要求是一个有序的list,但传入一个无序的list
  • 处理的顺序是错误的,或者与期望的次序不一致。如未登录系统就尝试打印。 

边界条件的-CORRECT

Conformance(一致性)值是否和预期的一致

Ordering(顺序性)值是否应该的那样有序或者无序

Range(区间性)值是否位于合理范围

Reference(依赖性)代码是否引用了一些代码本身控制范围之外的资源

Existence(存在性)值是否存在(是否非空,非零,在集合中等等)

Cardinality(基数性)是否恰好有足够的值

Time(相对或绝对的时间性)所有事情的发生是否有序?是否在正确的时间?是否恰好及时? 

I:检查反向关联

         通常一些结果可以使用反向的逻辑关系来验证它们是否正确,如:计算a*b的函数,测试方法如下: 

Publicvoid UsingInverse(){

 double x = MyMath.AB(4,4);

 Assert.AreEqual<double>(x,4*4);

} 

C:使用其他手段实现交叉检查

计算一个结果可以存在多个算法,同一个算法可以使用稳定的版本来校验新改进的版本,如: 

Publicvoid UsingStd(){

    double number = 23214.01;

    double result1 =MyMath.旧方法(number1);

    double result2 =MyMath.新方法(number1);

   Assert.AreEqual<double>(result1,result2);

} 

E:强制产生错误条件

        真实运行环境各种出乎意料的事情都可能发生,如断电,断网等等。在测试中模拟这些情况可以使用Mock对象来实现。 

P:性能特性

        如数据采集的功能,在十个网站上进行采集工作很正常,那么在1000个网站上或更多的网站上进行采集它的速度如何?是否写个单元测试?

 

3、好的测试所具有的品质,合称A-TRIP

自动化(Automatic

彻底的(Thorough

可重复(Repeatable

独立的(Independent

专业的(Professional

 

详细解释

Thorough彻底的

      测试所有可能会出现问题的情况,一个极端是,对于每行代码、代码可能到达的分支,每个可能抛出的异常等等,都可以作为测试的对象。另一个极端是,你仅仅测试最可能的情况---边界条件、残缺和畸形的数据等等。然而这些都基于项目需求的决策问题这些所说的归纳为“代码覆盖率”。

 

Repeatable可重复

      测试应该独立于所有其他的测试,而且必须独立于周围的环境。目标只有一个,就是测试应该能够以任意的顺序一次又一次的运行,并且产生相同的结果。如果结果不同,则存在BUG。

 

Independent独立的

      编写测试时,确保一次只测试了一样东西,但并不表示一个TestMethod内只能使用一个Assert,而是一个测试函数应该专注于产品代码中的一个函数,或者组合起来并共同提供某个特性的一组函数。

 

Professional专业的

      测试代码必须同产品代码相同的风格来编写。这意味着你需要抽取出共同且重复的代码,并把它们放到一个功能类之中,从而可以复用;单元测试的代码一样讲究------维护封装,DRY原则,降低耦合。

 

三、单元测试的意义


                   技术分享 

        上面有两张图对比,第一张是“立即测试”的图片,表示不用单元测试,自己敲代码,敲完一条线后才可以做调试或者运行看是否符合预期值,第二张图片表示“单元测试”,写一个函数或者方法就立刻进行测试,粒度很细的能够看到每个单元的直接效果,虽然一开始耗费时间比较多,但是在后期的集成测试,功能和性能测试的阶段能够有效保证代码质量,减少测试时间。所以说,单元测试是让我们的工作更加的轻松,并且让我们的设计变得更好,大大减少我们花在调试上面的时间。

 

       单元测试的核心内涵:使用简单有效的技术就是为了令代码变得更加完美

 

ps个人有感:要想做单元测试,首先,你要自己认同单元测试,相信单元测试能够给你带来更多的利益,愿意去做单元测试,总在后面催着赶着大家做单元测试,是没有多大意思的一件事情。

 


初识单元测试

标签:

原文地址:http://blog.csdn.net/caozhangyingfei0109/article/details/43916975

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!