单元测试,测试什么?

我们一直强调单元测试的重要性,但是有一个问题可能没有认真去想过,测试是重要的,但是我们测试什么呢?最近重读《单元测试之道》,书中给出了答案:Right-BICEP

1.Right——正确

很显然,如果代码运行的结果与你预期的不符合,那么这段代码肯定是有问题的。需要注意的是,Right并意味着正确,因为正确只是相对你所期望的结果而言,而对于用户需求也许就是错误的。

2.B——边界条件
寻找边界条件是单元测试最有价值的工作之一,因为bug一般出现在边界条件上,你常常需要考虑下面这些边界条件:
1)完全伪造或者不一直的数据进行输入
2)格式错误的数据,比如错误的URL,Email地址
3)空值或者不完整值,比如0,null
4)与常理相去甚远的数据,比如人有10000岁?
5)如果要求传入的是一个不允许重复数据的list,你传入一个有重复数据的看看出现什么情况
6)如果需要传入的有序的集合,你传入一个无序的看看结果
7)不按照次序地执行,比如未登录就尝试操作某功能等
对于边界条件,可以按照CORRECT的顺序去尝试:
Conformance——一致性,值是否和预期的一样
Ordering——顺序性,值是否如预期的那样,有序或者无序
Range——区间性,值是否处于合理的范围内
Reference——引用,值是否引用了代码无法空值的外部资源
Existence——值是否存在,为空?为0?不在集合内?
Cardinatity——基数性,检查你的函数能否正确地计数,不多不少
Time——所有的事件的发生是否按照预期的顺序,性能上满足要求?

3.Inverse——检查反向引用
如果方法导致某个结果,尝试以另一个方法能否返回最初的状态?与原状态是否符合预期?

4。Cross——交叉检查
通过不同的方法检查一个方法产生的结果是否正确,比如用Math.sqrt方法检查自己编写的求平方根的方法是否正确。另外的方式,以一种数量去检查另一种数量,比如图书馆借出的书加上架上的书的总数是固定,可以用借出的书来检查架上的书的数量是否正确。

5.E——强制错误条件的产生

一般我们所能想到的环境因素:
1)内存耗光
2)磁盘用满
3)时钟出问题
4)网络不可用或者有问题
5)系统过载
6)调色板颜色数目有限
7)显示分辨率过高

再比如JDK版本差异,我就为这个问题头痛过:)

6.Performance——性能
每天或者每隔几天运行一下一个粗糙简单的性能测试,能够保证你不会在给用户演示的时候出现尴尬的场面。

尽管书上是讲了这么多测试这个、测试那个,我想真实的项目场景中应该根据需要采取特定的测试策略,比如你总不能对于一个单机应用需要考虑地震震断海底光缆引发的问题。就我自己而言,因为项目组中似乎只有我对JUnit等单元测试工具充满兴趣,有经验的老程序员是自己写一个带Main方法的Test类进行测试,而更多的人根本就不知道单元测试或者知道也不感兴趣,在没有压力的情况下,要求自己考虑这么多的测试内容,难矣。今天试用了下NUnit,感觉比JUnit难用多了,JUnit与Eclipse的结合非常简便。

文章转自庄周梦蝶  ,原文发布时间5.17

时间: 2025-01-02 23:44:47

单元测试,测试什么?的相关文章

单元测试培训系列:(一)单元测试概念以及必要性

说起单元测试,多数同学应该都知道或听过,可能不少同学认为自己也写过,甚至觉得单元测试很简单有什么好培训的?其实这个事情还真没想象的那么简单!我基本可以比较负责任的说,你若没深入对单元测试做过研究,不知道Mock对象为何物的话,那么可能你以前写过的单元测试压根就不是单元测试. 单元测试是什么? 这个问题其实并不太容易一两句话说得特别清楚.先借用下百度百科的定义: 单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试. 从以

通向架构师的道路(第二十五天)SSH的单元测试与dbunit的整合

一.前言 在二十三天中我们介绍了使用maven来下载工程的依赖库文件,用ant来进行war包的建立.今天我们在这个基础上将使用junit+dbunit来进行带有单元测试报告的框架的架构. 目标: 每次打包之前自动进行单元测试并生成单元测试报告 生成要布署的打包文件即war包 单元测试的代码不能够被打在正式的要布署的war包内,单元测试仅用于unit test用 使用模拟数据对dao层进行测试,使得dao方法的测试结果可被预料 二.Junit+Ant生成的单元测试报告 上面是一份junit生成的测

在Python中进行自动化单元测试的教程_python

一.软件测试 大型软件系统的开发是一个很复杂的过程,其中因为人的因素而所产生的错误非常多,因此软件在开发过程必须要有相应的质量保证活动,而软件测试则是保证质量的关键措施.正像软件熵(software entropy)所描述的那样:一个程序从设计很好的状态开始,随着新的功能不断地加入,程序逐渐地失去了原有的结构,最终变成了一团乱麻(其实最初的"很好的状态"得加个问号).测试的目的说起来其实很简单也极具吸引力,那就是写出高质量的软件并解决软件熵这一问题. 可惜的是,软件开发人员很少能在编码

《精通移动App测试实战:技术、工具和案例》一2.2 JUnit在Android开发中的应用

2.2 JUnit在Android开发中的应用 2.2.1 单元测试的重要性 前面我们提到了单元测试,那么什么叫单元测试呢?单元测试(Unit Testing),是指对软件中的最小可测试单元进行的检查和验证.对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如在Java中单元指一个类,在C语言里单元指一个函数等.单元测试是在软件开发过程中要进行的最低级别的测试活动,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试.通常,我们在编写大型应用系统的时候,都要写成千上万个方法

jQuery性能优化的38个建议

 想必大家对于jQuery这个最流行的javascript类库都不陌生,而且只要是前端开发人员肯定或多或少的使用或者接触过,在这篇文章中,参考了一些资料及实际使用效率,将介绍一些书写高质量jQuery代码的原则,不单单会告诉你如何去书写,也会告诉你为什么这样书写,希望大家会觉得有所帮助 一.注意定义jQuery变量的时候添加var关键字 这个不仅仅是jQuery,所有javascript开发过程中,都需要注意,请一定不要定义成如下: $loading = $('#loading'); //这个是

新技术、新观念与商业应用的开发——也谈AJAX和NUnit

ajax      最近比较忙,起初是对以前开发的一个C/S模式的系统进行升级,比较痛苦而且出了不少问题,好在系统连同另外两个子系统一块顺利发布,经过几天的调整总算可以全力投入到B/S这边来,说来惭愧的不行,一个不大的系统应用拖了这么久(找点客观理由:其实一直很乱,根本没时间静下来琢磨它),本来以为可以潜心的好好做好,但是经理又提出硬性要求--下周四必须拿出演示版来,至少要保证业务顺畅,我觉得这样的要求根本不是什么,我想的是要把它做得更人性化一些,毕竟这是公司首个大规模的web应用,准备引入一些

不做代码审查又怎样?

从一次回顾会议开始 "要不--我们不做--代码审查了--试试?"还记得当有人抛出这个建议时周围同学的表情,那种表情用两个字加两个标点符号就可以形容:"什么?!" 对了,先介绍一下背景,这是项目一次普通的回顾会议,我们正在讨论的是如何让代码审查更有效率和效果.我们做代码审查的方式比较简单直接,就是每日站会后,大家围在一台开发机周围,逐一轮换讲解昨天所有提交的内容,就像下图中的那样.还有,这是一个已经超过了7年的比较大型的项目,代码审查是我们从项目开始就坚持的一个实践,

JavaScript代码风格要素

1920年,由威廉·斯特伦克(William Strunk jr .)撰写的<英语写作手册:风格的要素(The Elements of Style)>出版了,这本书列举了7条英文写作的准则,过了一个世纪,这些准则并没有过时.对于工程师来说,你可以在自己的编码风格中应用类似的建议来指导日常的编码,提高自己的编码水平. 需要注意的是,这些准则不是一成不变的法则.如果违背它们,能够让代码可读性更高,那么便没有问题,但请特别小心并时刻反思.这些准绳是经受住了时间考验的,有充分的理由说明:它们通常是正确

Facebook工程师是如何高效工作的?

编者按 Facebook的工程师有哪些高效工作的经验呢?软件工程师访谈了多位Facebook的高产工程师,总结了他们的共同经验以及晋级之路,供各位参考. 成为高效开发者这件事你可以通过经验.书本.或者试验和错误来学习.但成为高效开发者的最有效方式之一是直接向高效开发者学习.我访谈了Facebook的几位最高产的工程师,想找到这些开发者实现最高生产力的基础结构是什么. 第一级:减少不必要的干扰 这一点似乎很明显,但是正是这些累积起来的小事情最影响我们的生产力. 避免开会 我尽量少开会.例会我一般都

开发者需知的10类工具

原文 http://www.csdn.net/article/2013-05-09/2815204-10-Software-Tools-You-Should-Know 摘要:作为一个软件开发者,你不可避免地需要用到各种工具来设计.理解.编辑任何程序,本文中按类型总结了10类开发者须知的工具,并各列举了一些知名应用软件. 作为一个软件开发者,你不可避免地需要用到各种工具来设计.理解.编辑任何程序,本文作者按类型总结了10类开发者须知的工具.CSDN摘译如下: 免责声明:"最好"的软件工具