上一章通过实例讲了“第一个单元测试”到底应该怎么做,这一章我们讲讲“对一个工作单元需要测试它哪些方面的内容”?

有6个值得测试的部位,统称为:Right-BICEP

  • Right——结果是否正确
  • B——是否所有的边界条件都是正确的?
  • I——能查一下反向关联吗?
  • C——能用其他手段交叉检查一下结果吗?
  • E——你是否可以强制错误条件发生?
  • P——是否满足性能要求?

1. 结果是否正确

例如对于上一节的取款案例:原有余额10000元,取款2000后,余额应该剩下8000元。我们就要测试这个结果:

assertThat(account.getBalance()).isEqualTo(8000);

断言失败就表明实现代码有错,需要修改后重新测试。

2. 边界条件

代码中的bug往往都出现在“边界条件”附近,也就是说,在那些条件下,代码的行为可能不同于平常的、每天都能运行到的程序路径。例如:

  • 我们期待接受一个代表文件路径的字符串,但客户代码可能传入一个包含回车或冒号的字符串。
  • 我们期待接受一个代表email的字符串,但客户代码可能传入一个没有包含“@”的字符串。
  • 我们期待接受一个正数,但客户代码可能传入0或负数。
  • 我们期待传入一个对象,但客户代码可能传入null。
  • 我们要从传入的集合中选择第一个元素,但客户代码传入了一个空集合。

如果你是一个桥梁工程师,大桥建好之后,你不能只是在风和日丽的日子里,让一辆车缓缓驶过桥面,就宣布大桥经过了充分测试。作为工作单元的实现者,我们的代码交付后,代码的用户可能会用各种奇葩的方式调用我们的代码,我们必须预先针对这种种可能情况预先设计应对策略,并通过单元测试来确保工作单元在各种边界条件下都会按照我们的预设策略那样执行。

一个想到可能的边界条件的简单办法就是记住助记词CORRECT。下一节我们将详细论述CORRECT边界条件。

3. 检查反向关联

例如我们要检查求平方根的函数squareRoot()的正确性,就可以通过检查平方根的平方是否等于当初的参数的当时来检查代码实现的正确性:

@Testvoid testSquareRootUsingInverse() {double a = 8;double result = squareRoot(a);assertThat(result * result).isCloseTo(a, Percentage.withPercentage(0.00001));}

上面的测试代码用于测试squareRoot(double a)函数的正确性。a的平方根的平方应该等于a。

说明:在计算机中浮点数无法精确比较其相等性,因此,两个数只要足够接近,就可以认为相等。在上面的测试例子中,我们把足够接近定义为相差不超过0.00001%。

4. 使用其他手段来实现交叉检查

通常而言,实现一个工作单元有一种以上的算法。我们选用其中一种最好的来作为我们的代码实现,但可以使用其余的算法来作为单元测试。当两者的计算结果都相同时,我们就可以认为我们的代码实现是正确的。当然前提是两种算法不会都是错误的,但恰好都产生相同的结果。

例如JDK标准库中已经有Math.sqrt()这样的一个平方根函数。当我们的平方根函数和标准库中的平方根函数得出的结果相同时,就可以认为我们的的平方根函数是正确的。

@Testvoid testSquareRootUsingStd() {double a = 8;assertThat(squareRoot(a)).isCloseTo(Math.sqrt(a), Percentage.withPercentage(0.00001));}

5. 强制产生错误条件

在真实世界中,错误总会发生:磁盘会满,WIFI会断开,程序会崩溃。你应该能够通过主动强制引发这些错误,来测试你的代码在这样极端状态下是如何应对这些真实世界中的问题的。

这就是使用Mockito这样的测试替身库的作用之一——它们能够模拟各种各样的异常条件,而不需要无限期地消极等待真实世界中异常状态的出现。

6. 性能特性

一般的性能测试是黑盒测试,采用JMeter这样的专门的性能测试工具进行测试。但是对于我们所写的代码,如果里面包含了复杂的循环,或者处理了大量的数据,那就应该在单元测试层面测试一下性能。

通常会有性能问题的测试都会耗时较长。我们不希望被这些测试拖慢进度。这时可以采用JUnit的测试分组策略,将这些耗时的测试分到另外的组,只在某些阶段执行一下测试。而其他的单元测试会经常运行。

这一章我们讲到这里,下一章将讲讲“CORRECT边界条件”!

- THE END -

原创作者 | 杨宇Yangyu

编程道与术原创内容

转载请注明“编程道与术”出处

单元测试 代码里面都绝对路径怎么处理_原创 | 编写单元测试和实践TDD (六)测试哪些内容:Right-BICEP...相关推荐

  1. smartupload 路径不存在_洞悉复杂金融场景,覆盖完备测试路径

    随着应用系统数量不断增加.系统规模不断扩大以及微服务架构持续推进,系统间模块间的关联关系越来越复杂,全面的测试设计不仅要考虑所测试系统,还要考虑关联交易以及上下游关联系统.通过在工作中不断摸索尝试,本 ...

  2. 原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (一)什么是单元测试

    If builders built buildings the way programmers wrote programs, then the first woodpecker that came ...

  3. JUnit编写单元测试代码注意点小结

    用eclipse编写单元测试的时候,可以直接选中某个类,然后右键new新疆一个junit case,界面如下图1所示: 图1:新建test case 选 择图1中的JUnit Test Case,然后 ...

  4. Wombie Attack—恶意代码传播的新路径

    雷锋网(公众号:雷锋网)编者按:8月16日,第三届中国互联网安全领袖峰会(CSS 2017)在北京国家会议中心召开.作为九大分会场之一的腾讯安全探索论坛(TSec)以"安全新探索" ...

  5. 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是

    多选 编写单元测试代码遵守BCDE原则,以保证被测试模块的交付质量,那么下列说法正确的是:答案在文末 A. Border,边界值测试,包括循环边界.特殊取值.特殊时间点.数据顺序等. B. Corre ...

  6. 在华为写了 13 年代码,都是宝贵的经验

    来源:https://dwz.cn/dqgOrbQo 本文来源华为人:徐宏伟,转给大家观摩下. 一天晚上,我和老婆聊天,说部门要我写个"大咖谈软件"的文章,老婆斜了我一眼,淡淡地说 ...

  7. 你写的代码一点都不 Pythonic

    可能有时候你在论坛上 会看到有人这样说 "你写的代码 一点都不 Pythonic" what? Pythonic? 什么是 Pythonic 呢 其实说白了就是你的 代码风格 有些 ...

  8. java : enum、创建文件和文件夹、删除文件和文件夹、获得项目绝对路径、写入数据到excel中、java代码中两种路径符号写法、读取、写入text文件...

    java : enum http://www.cnblogs.com/hyl8218/p/5088287.html 创建文件和文件夹.删除文件和文件夹 http://www.cnblogs.com/m ...

  9. notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象

    notify()唤醒线程,不会立即释放锁对象,需要等到当前同步代码块都执行完后才能释放锁对象 public class Test3 {public static void main(String[] ...

最新文章

  1. 南通市公积金信息系统goldengate复制软件采购
  2. 在Ubuntu上源码安装MySQL+安装问题解决+安全优化
  3. 【CVPR2020-中科院-腾讯优图】基于注意力卷积二叉神经树的细粒度视觉分类
  4. 2022-03-18 今日工作
  5. 安装lynis_lynis安装和扫描Linux的安全漏洞
  6. 全志 修改485转CAN串口回显 Patch
  7. 关于 redis.properties配置文件及rule
  8. java web教学大纲_《JAVAWEB程序设计》教学大纲.pdf
  9. java日期时间转日期_Java时间和日期指南
  10. 什么叫轻量瓷_为什么说陶瓷是华夏文明的徽章?
  11. [LintCode笔记了解一下]64.合并排序数组
  12. freemarker处理嵌套属性是否为空的判断
  13. 云课堂智慧职教答案python_云课堂智慧职教答案python,云课堂智慧职教数学答案,云课堂智慧职教搜题...
  14. DVB 数字电视基础知识
  15. 基于SWMM及自主开发城市内涝一维二维耦合软件的复杂城市排水系统建模技术及在城市排涝、海绵城市等领域实践
  16. react小书 笔记6
  17. sql注入检测工具之sqlmap
  18. UE4 编辑器脚本-批量创建LOD
  19. matlab在常微分方程的应用,MATLAB在求解常微分方程中的应用
  20. ORB-SLAM Spanning Tree 的作用

热门文章

  1. Python 中的特殊方法(定制类):__str__、__cmp__、__len__、数学运算、类型转换、@property运用、__slots__和__call__函数
  2. 如何设置python程序定时执行?
  3. 给 ABAP ALV 报表的数据行增添颜色效果试读版
  4. SAP 电商云 Spartacus UI CI 脚本分析
  5. SAP 电商云 Spartacus UI 和 SmartEdit 本地测试环境
  6. css property 和 attribute 的区别
  7. 一个css文件里实际并不存在的class,不能给element layout产生任何影响
  8. Angular jasmine单元测试框架fixture.detectChanges的实现原理
  9. Angular jasmine单元测试框架里describe的实现原理
  10. 使用JavaScript调用Microsoft XMLDOM库进行XML字符串的解析