单元测试中 Right-BICEP 和 CORRECT
My Blog:http://www.outflush.com/
在单元测试中,有6个总结出的值得测试的方面,这6个方面统称为 Right-BICEP,通过这6个方面的指导,可以较完全的测试出代码中的bug。本文就是简单的介绍 Right-BICEP 到底指的哪6个方面,以及其中边界测试中的 CORRECT 助记短语。
- Right – Are the results right? 结果是否正确?
- B – are all the boundary conditions correct? 所有边界条件都是正确的么?
- I – can you check the inverse relationships? 能否检查一下反向关联?
- C – can you cross-check results using other means? 能够使用其他手段交叉检查一下结果?
- E – can you force error conditions to happen? 是否可以强制错误条件产生?
- P – are performance characteristics within bounds? 是否满足性能要求?
Right Result
对于测试而言,最首要的任务就是查看所期望的结果是否正确。
Boundary Conditions 边界条件
代码中的bug大多出现在边界条件附近。
一些需要考虑的边界条件:
- 完全伪造或者不一致的输入数据
- 格式错误的数据
- 空值或不完整的值
- 一些与意料中的合理值相去甚远的值
- 要求一个无重复值的序列,但是传入一个有重复值的序列
- 要求一个有序许刘,但是传入一个无需序列
- 事件到达的次序是错误的,或碰巧和期望的次序不一致
边界条件助记短语 CORRECT:
- Conformance(一致性):值是否和预期一致。可以理解为当输入并不是预期的标准数据时,被测试方法是否可以正确输出预期结果(或抛出异常)。
- Ordering(顺序性):值是否像应该的那样是无序或有序的。
- Range(区间性):值是否位于合理的最小值和最大值之间。
- Reference(依赖性):代码是否引用了一些不在代码本身控制范围之内的外部资源,当这些外部资源存在或不存在、满足或不满足时,代码是否可以产生相应的预期结果。
- Existence(存在性):值是否存在(是否为null、0、在一个集合中)。测试方法是否可以处理值不存在的情况。
- Cardinatity(基数性):是否恰好有足够的值。这里的基数指的是计数,测试方法是否可以正确计数,并检查最后的计数值。
- Time(相对或绝对时间性):所有事情的发生是否是有序的、是否在正确的时刻、是否恰好及时。与时间相关问题有:相对时间(时间上的顺序)、绝对时间(消耗的时间和钟表上的时间)、并发问题。例如:方法调用的时间顺序、代码超时、不同的本地时间、多线程同步等。
- 注意:在考虑边界条件时,需要同时考虑方法的传入参数以及其内部数据。
Inverse Relationships 检查反向关联
即使用反向的逻辑关系验证某些方法。
比如检查一个计算平方根的函数,可以通过对其结果进行平方来检查。但是要注意的是,应该使用不同与被测试方法的原理来编写反向测试,因为如果原理错误可能会使得测试与被测试方法都包含bug。
Cross-Check 使用其他手段交叉检查结果
通过其他经过验证的途径来测试当前被测试方法的结果是否正确
例如被测试方法存在多个备用算法,这时选择被测试方法没有使用的,并且已经经过验证的算法在测试方法中使用,最后比较测试算法和被测试方法的结果是否一致。
另外也可以通过一些数据从侧面验证被测试方法结果是否正确,例如图书馆中借出的书籍数和在库的书籍数的总和是不变的,这时便可以使用交叉检查,即使用一种数量检查另一种数量。
Force Error 强制产生错误
通过强制引发一些现实中的错误来测试代码是如何处理这些错误,这些现实错误可能是:内存耗光、硬盘用满、时钟错误、断网等。
Performance 性能特性
即测试在数据量逐渐增加的时候,性能曲线是否能达到预期(稳定)。
参考资料:《单元测试之道Java版:使用JUnit》
单元测试中 Right-BICEP 和 CORRECT相关推荐
- Java中单元测试中:@BeforeClass,@Before,@Test,@After,@AfterClass中的问题详解
在Junit4中还有的测试注解有: @BeforeClass ,@Before,@Test,@After,@AfterClass 1.其中:@BeforeClass,@AfterClass是Juni ...
- 9 单元测试中不得不知的概念
单元测试中不得不知的概念 前言 软件单元及单元测试 驱动函数和桩函数 总结 前言 做单元测试,如果不弄清楚什么是单元,那十八般武器也无的放矢了.可能在单元测试中听到最多的就是驱动函数.桩函数和逻辑覆盖 ...
- 单元测试中,模拟一个新对象
在单元测试中,会遇到有上百个属性的实体,而这些属性中,大多都是以String Int32 等类型为主,而如果模拟这个实体,给这个实体赋随机值,也要写上百行代码,效率极低 因此,我们可以通过反射来处理. ...
- mockito mock void方法_纯干货,浅谈Mockito在单元测试中的实际应用
本文接上文"接口方没写代码,对接方只能停工吗?",在这里简单介绍Mockito在单元测试中的实际应用.本文使用场景较单一,如有雷同,不甚荣幸,闲言少叙,开门见山.本文将使用mock ...
- Mock和Java单元测试中的Mock框架Mockito介绍
什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象.程序员通常创造模拟对象(mock object)来测试其他对象 ...
- 如何在单元测试中测试异步函数,block回调这种
大概有四种方法: runloop 阻塞主进程等待结果 semphaore 阻塞主进程等待结果 使用XCTestExpectation 阻塞主线程等待(我用这个,xcode自带的,为啥不用) 使用第三方 ...
- 继承能够访问父类私有字段_在单元测试中访问私有字段
继承能够访问父类私有字段 首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很 ...
- 在单元测试中访问私有字段
首先,让我大声说一下,您需要将代码设计为可测试的,以便通过公共方法测试私有字段. 但是,(" buts"是人们仍在编程而不是计算机本身的原因,所以在这里很高兴)有时您想要并且应该更 ...
- python单元测试mock_Mock 在 Python 单元测试中的使用
本文讲述的是 Python 中 Mock 的使用. 如何执行单元测试而不用考验你的耐心 很多时候,我们编写的软件会直接与那些被标记为"垃圾"的服务交互.用外行人的话说:服务对我们的 ...
最新文章
- CLion报错解决:allocating an object of abstract class type--unimplemented pure virtual method
- 表格检测开源网络推荐
- Visual Studio常用快捷键(非常实用)
- 软件开发人员需要的不仅是技术,也不是文档,也不是管理,而是……
- bootstrap 图片轮询_消息通知功能之前端Ajax定时轮询_后端接口获取数据一
- ABAP新的关键字:BASE
- Nginx 反向代理 websocket 协议
- Linux:十条为系统管理员节省时间的命令
- 小白学习Python的一点建议
- Redis Web版客户端工具——TreeNMS
- stm32智能避障小车(三)之L298N
- 二维图像(数组)的fftshift
- html都是纯文本文件吗,关于“什么是纯文本文件”的思考
- PHP实现密钥分发中心,密钥分发中心(KDC)
- 男主龙失忆java_男主失忆的小说推荐:我忘了全世界,却记得对你的爱,一生不变...
- 编写一段李志坤喜欢杨静,杨静不喜欢李志坤的世纪虐恋
- 计算机类研究生双证,想要报考计算机专业来攻读双证在职研究生最终是不是可以获得双证...
- TCP/IP卷一:20---链路层之(环回地址)
- SpringBoot控制台打印SQL
- Python工程师悄悄收藏的Python学习网站