如果觉得文章对您提升有所帮助,请帮忙点赞、收藏、转发、留言提升下热度让更多人看到,关注随意,仅依赖平台的推广流量太有限了,谢谢大家!
接口自动化测试框架一直是测试同学进阶时绕不开的一项技术,目前python的解决方案大家应该都很清楚,一般都是单元测试库+http协议处理库+测试报告库这个结构,比如:unitest/pytest/nose+request+HtmlTestRunner。在单元测试库的选择上,unittest和pytest一直是大家讨论的话题,在网络上很多人都诟病unitest不如pytest,甚至说unitest是过时的,pytest才符合主流,其实unittest和pytest加载用例的设计不一样,按需求选择适合的单元测试框架即可。如果你是框架的搭建者,unitest和pytest确实需要你做技术选型,但是如果你只是在别人开发好的框架上去开发测试用例代码,那unitest和pytest对你来说没有任何区别,因为无论是unittest还是pytest实现的框架,在开发测试用例代码层面最终都只是3个步骤:a、入参;b、发起请求;c、断言。
另外,网上诟病unitest过时,还有两个原因:
1、unittest没有类似pytest给用例打标签的功能
2、unittest没有失败重跑的功能
那么,这篇文章将会给大家带来这两点的解决方案,并且会附上解决后实际的效果。
先说结论,unitest是完全可以实现这两点功能的,下面我将讲解我的实现方案及思路。
一、实现给测试用例打标签,在测试执行时达到过滤的效果。
1、众所周知unittest加载测试用例的设计依赖于测试类的概念,就是测试类都必须继承unittest.TestCase类,在测试加载的时候,也是基于此测试类去加载测试方法,unittest会加载测试类中所有的测试方法,因此没有类似pytest的给用例打mark标签,选择性执行测试方法的功能。那么如何实现呢?如果给unittest的测试类的方法加上1个属性,在discover测试方法时找到这个属性,把有这个属性的方法加载进来,是不是就解决了问题。当然,这只是一种思路,在加载时做过滤,其实还有1种思路,就是我不修改加载,discover时依旧是加载全量的测试方法,但是运行的时候我可以只运行有属性的测试方法,理论上两种思路都是可以实现的,我是按照第1种思路做的实现方案。
2、那么如何实现给测试类的测试方法加上属性呢,会让开发测试用例代码的同学会有一个比较好的用户使用体验呢,其实很简单,就按照pytest的设计来就行了,通过装饰器的方式。定义一个mark装饰器,用于给测试方法加上属性,属性值可以自由定义,最终也是根据这个属性值去过滤加载的测试方法,而这个属性值会在运行时通过命令行参数传入。
3、给测试方法打上了属性,接下来就是依据属性值去筛选测试方法,以便在测试执行的时候只执行打了mark标签的测试方法。那么如何让unittest在加载用例时,可以精准的加载到打了标签的测试方法呢,我们会按照上面的设计去重写discover方法,定义一个模式变量mode,布尔型,如果是True则定义为过滤模式,如果是False则是全量模式,这个mode的值也设计成在命令行参数传入
以上就是实现打标签功能的设计思路,下面给大家演示下实现