单元测试基础 (2)

单元测试是非常有魔力的魔法,也是一把双刃剑。使用得当,可以很有效的提高我们的编码质量,提升研发效率,但是如果使用不恰当亦会浪费大量的时间在测试编码、维护和调试上从而影响代码和整个项目,徒劳而无功!
因此做好单元测试至关重要!而想要做好单元测试,我们首先应该知道优秀的单元测试有哪些特性。
一个好的单元测试一定是有以下几个特性的
• 自动化
• 彻底的
• 可重复的
• 独立的
• 专业的
回顾一下自己以前写过的单元测试问自己几个问题。

它是不是可以自动化一键运行、并且可以重复运行

几个月后它是不是仍可以运行、并且得到期望的结果

它是否可以在几分钟内运行结束

在运行之前你是否不需要需要进行一系列的配置

每次运行是否能够得到相同的结果

外部的系统因素是否不会影响你的测试结果

测试代码是否很简单就可以编写完成

如果针对以上问题有任何一个的回答是“否”,那么你应该好好的思考一下到底如何去做好单元测试。

4. 如何进行单元测试

对于一个方法或者类,乍一看就能找出其隐藏深处的bug是很不容易的,因此在bug挖掘方面通常会有一些经验和套路,来指导我们更好的进行单元测试。

3.1 测试哪些内容

一般来说有六个值得测试的具体方面,可以把这六个方面统称为Right-BICEP:

Right——结果
对于单元测试测试而言,首要的也是最明显的任务就是查看所期望的结果是否正确,例如判断一个方法的返回值是否为序列中的最大值......

B——边界条件
找边界条件是做单元测试中最有价值的工作之一,因为bug一般就出现在边界上。关于边界条件2会有详细总结

I——检查反向关联
对于一些方法,我们可以使用反向的逻辑关系来验证它们。例如,你可以用对结果进行平方的方式来检查一个计算平方根的函数,然后测试结果是否和原数据很接近

C——交叉检查
有些时候我们实现一个问题会有不同的算法,在生产系统中我们使用一种算法,而在测试中我们可以使用另一种算法来验证其结果是否一致。

E——强制产生错误条件
在实际运行过程中,有时候会发生一些意外的难以避免的错误,例如磁盘会满,网络连线会断开.....从而导致程序崩溃。我们应该在测试中强制引发错误,来测试代码是否能够按照预期处理这些异常。

P——是否满足性能条件
性能同样是我们测试过程中需要验证的指标

3.2 注意边界条件

代码中的许多Bug经常出现在边界条件附近,对于边界条件的测试我们可以从CORRECT七个方面进行考虑

一致性----值是否满足预期的格式

有序性----一组值是否满足预期的排序要求

区间性----值是否在一个合理的最大值最小值范围内

引用、耦合性----代码是否引用了一些不受代码本身直接控制的外部因素

存在性----值是否存在(例如:非Null,非零,存在于某个集合中)

基数性----是否恰好具有足够的值

时间性----所有事情是否都按照顺序发生的?是否在正确的时间、是否及时

3.3 使用Mock对象

单元测试的目标是验证我们的工作单元,但是如果这个工作单元依赖一些其他的对象或是一些难以操控的东西,比如网络、数据库等。这时我们就要使用mock对象,使得在运行UT的时候使用的那些难以操控的东西实际上是我们mock的对象,而我们mock的对象则可以按照我们的意愿返回一些值用于测试。通俗来讲,Mock对象就是真实对象在我们调试期间的测试品。对于外部对象内的逻辑我们并不关心,我们只需要让它给我们返回我们想要的值,来验证我们的业务逻辑即可

IFileExtensionManager fileManager; public bool IsValidFileName(){ //获取文件扩展名 string extName=fileManager.GetExtName(); if(extName=="jpg"){ return true; } return false; }

如上示例,假设从文件系统中读取一个文件,获取文件的扩展名,如果扩展名是jpg就返回true,否则返回false。
注意,这里我们要测试的逻辑是如果扩展名是jpg就返回true,否则返回false。而对于fileManager.GetExtName()方法内部的逻辑是什么样的的我们是不关心的,我们只需要mock这个方法使其返回我们想要的值就可以了。
关于具体如何去mock工作单元中的一些外部依赖,会在存根与模拟对象里面详细进行总结。

总结

本文总结了什么是单元测试、什么不是单元测试以及优秀的单元测试有哪些特性,简单介绍了如何进行单元测试。
编写差劲的单元测试是没有意义的,我看到过很多公司尝试去实践单元测试,但最终要么在某个阶段放弃了,要么并没有真正执行单元测试。最终还是依赖集成测试或者人工测试来发现问题,不得不以失败而告终,并堂而皇之的认为单元测试是一个耗时好力而无功的鸡肋东西。
因此如果你想要真正的去实践单元测试,那么必须充分的理解到底什么是单元测试,已经如何去更好的进行实践优秀的单元测试。
而对于如何更好的去实践单元测试,后续会结合实践用更多的篇幅去总结分享。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wspdps.html