首先写unit test之前,要确认自己的测试遵循两个原则:
1、尽量不要干涉原来的代码。从阅读代码的体验来说,不要让你的测试(哪怕是一小段if..else...的代码)出现在你准备测试的代码中。
2、代码要只是测试某个class里面的一个特定的function。这个function不能太简单,太简单就没有测试的意义;也不能太复杂,不应该牵涉太多其他的class,如果太复杂就不应该写unit test,而考虑其他的测试方法。
(以上两个原则其实大家都知道,但是写的时候很多人都没有严格遵守,所以这里强调一下)
这里把单元测试分为了5个级别:
Level1:正常流程可用,即一个函数在输入正确的参数时,会有正确的输出。
Level2:异常流程可抛出逻辑异常,即输入参数有误时,不能抛出系统异常,而是用自己定义的逻辑异常通知上层调用代码其错误之处。
Level3:极端情况和边界数据可用,对输入参数的边界情况也要单独测试,确保输出是正确有效的。
Level4:所有分支、循环的逻辑走通,不能有任何流程是测试不到的。
Level5:输出数据的所有字段验证,对有复杂数据结构的输出,确保每个字段都是正确的。
在做项目中,一般只做到Level2,重要系统或者底层服务,要做到Level3或Level4。而很少做到Level5。即便如此,就已经实现了很难被黑盒测试工程师发现bug。
除了级别外,测试方法也要区分不同系统的玩法。比如基于WEB的系统,就需要确保单元测试里可以模拟发送请求,这个一般是WEB框架提供支持的。比如常用的web.py、Flask、Django都有支持。不仅仅可以模拟简单的请求,还可以模拟POST、cookie等。另外一般建议单独写个函数来模拟登录过程,这样系统登录后行为的测试就不必反复模拟登录了。
单元测试一大痛苦是构造测试数据。我的看法是测试数据应该是人造的,而不是随便从产品环境dump出来一份。只有人造的数据能确保环境可控,每次运行不会因为环境改变而频繁修改testcase。常用玩法是测试数据分为基础数据和附加数据两部分。基础数据是所有testcase共享的,比如建立几个常用角色的用户等等。附加数据是testcase内部自己建立的。这样每次testcase运行时,先清空数据库,导入基础数据,导入附加数据,然后执行测试,验证结果。
各类程序的函数可以分为纯函数和副作用函数。纯函数对应的是数学里函数的概念,输出和输入是一一对应的。对一个输入有确定的输出。比如1+1=2。而副作用函数则相反,同样的输入,在不同时间和环境里,可能有不同的输出。比如任何涉及IO、网络、数据库的。副作用函数的测试比纯函数麻烦的多,因为你必须要完整的构造其所依赖的所有环境,才能够复现一个副作用函数的行为。也正因为如此,副作用函数出bug的概率比纯函数高的多。理解这个概念以后,应该尽可能的把程序里的纯函数和副作用函数进行拆解,降低副作用函数的比例和逻辑复杂度。还有,副作用函数是会传染的,一个函数如果调用了副作用函数,那么它也会变成副作用函数。文章来源:https://www.toymoban.com/news/detail-631472.html
【整整200集】超超超详细的Python接口自动化测试进阶教程,真实模拟企业项目实战!!文章来源地址https://www.toymoban.com/news/detail-631472.html
到了这里,关于如何快速做单元测试?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!