浅谈如何提高自动化测试的稳定性和可维护性 (pytest&allure)
装饰器与出错重试机制
谈到稳定性,不得不说的就是“出错重试”机制了,在自动化测试中,由于环境一般都是测试环境,经常会有各种各种的抽风情况影响测试结果,这样就为测试的稳定性带来了挑战,毕竟谁也不想自己的脚本一天到晚的出各种未知问题,而往往这种环境的抽风(通常是前端页面的响应速度和后端接口的响应速度)带来的影响是暂时的,可能上一秒失败了,下一秒你再执行又好了,在这种情况下,如果你有一个出错重试机制,起码可以在这种暂时性的影响下让你的脚本安然无恙,下面我们具体的说一下做法。
什么是装饰器?
因为我们的做法依赖装饰器,所以在去做之前,先简单介绍一下装饰器。
装饰器,表现形式为,在方法(或者类)的上面加上@xxx这样的语句,假如我们已经实现了一个装饰器名叫retry,那么我们想用它就这么用:
@retry def test_login(): print("test") error = 1/0
如果retry实现了出错再次重试(稍后再说如何实现),那么这么使用的话,就会让test_login这个case在执行出错的时候再次执行。
很神奇,让我们来看看实现retry的代码:
def retry(func): def warp(): for time in range(3): try: func() except: pass return warp
就结果而言,执行以下代码:
@retry def test_login(): print("test") error = 1/0 test_login()
和执行:
retry(test_login)()
是等价的,由此我们可以看出,装饰器其实本质上就是一个函数,这个函数接收其他函数(或者类)作为参数,通过对这个函数(或者类)的调用或者修改,完成不更改原始函数而修改该函数的功能。
在这里还有一个知识点,你有没有想过,在retry内部的函数warp(),是怎么拿到func这个参数来执行的?执行retry函数return的是warp这个函数,而warp并没有接受func这个传参啊。
这就是python里的闭包的概念,闭包就是指运行时自带上下文的函数,比如这里的warp这个函数,他运行的时候自带了上层函数retry传给他的func这个函数,所以才可以在运行时对func进行处理和输出。
了解了装饰器和闭包,那么下面就很容易做到对测试用例的出错重试机制了。
如果对软件测试、接口测试、自动化测试、性能测试、LR脚本开发、面试经验交流。感兴趣可以来加群:747981058,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。
编写一个出错重试装饰器
现在,我们来尝试自己编写一个用于测试用例的出错重试装饰器,代码如下:
def retry(times=3,wait_time=10): def warp_func(func): def fild_retry(*args,**kwargs): for time in range(times): try: func(*args,**kwargs) return except: time.sleep(wait_time) return fild_retry return warp_func
这个装饰器可以通过传入重试次数(times)和重试等待时间(wait_time),对待测用例实行重试机制。
pytest里的出错重试机制实现
在测试框架pytest里,已经实现了有关出错重试的策略,我们首先需要安装一个此类的插件,在cmd内执行以下命令安装:
pip install pytest-rerunfailures
如果你需要将此机制应用到所有的用例上,那么请在执行的时候使用如下命令(reruns是重试次数):
pytest --reruns 5
来执行你的用例;
如果你期望加上出错重试的等待时间,请使用如下命令(reruns-delay是等待时间):
pytest --reruns 5 --reruns-delay 1
来执行你的用例;
如果你只想对某几个测试用例应用重试策略,你可以使用装饰器:
@pytest.mark.flaky(reruns=5, reruns_delay=2)
例如:
@pytest.mark.flaky(reruns=5, reruns_delay=2) def test_example(): import random assert random.choice([True, False])
更详细的介绍请参阅官方文档 。
Allure里的测试用例分层
刚刚我们实现了用例的出错重试机制,但是这仅仅解决了脚本在不稳定环境下的稳定性;如果还想要脚本变得更加容易维护,除了传统的po模式使用例和元素分离之外,我们还可以引入测试用例分层机制。
为什么要采用分层机制?
传统的po模式,仅仅实现了用例和元素分离,这一定层面上保障了用例的可维护性,起码不必头疼于元素的变更会让用例到处失效;但是这还不够,例如,现在有三个case,他们都包含了以下步骤:登录、打开工作台、进入个人中心;那么如果不做分层,这三个用例会把这三个步骤都写一遍,如果某天页面的变动导致其中一个步骤需要更改,那么你不得不去每个用例里去更新那个步骤。
而如果,我们把用例当做是堆积木,登录、打开工作台、进入个人中心这三个步骤都只是个积木,那么我们写用例的时候,只需要在用到这个步骤时,把积木搭上去;如果某一天,其中一个积木的步骤有变动,那么只需要去更改这个积木的内容,而无需在每个使用了这个积木的用例里去改动。
这大大增强了用例的复用性和可维护性,这就是采用分层机制的原因,下面,我会就allure里的分层机制做介绍来讨论具体如何实现。
allure的装饰器@step
在allure里,我们可以通过装饰器@step完成分层机制,具体的,当你用@step装饰一个方法时,当你在用例里执行这个方法,会在报告里,表现出这个被装饰方法;而@step支持嵌套结构,这就意味着,你可以像搭积木一样去搭你的步骤,而他们都会一一在报告里被展示。
下面直接用allure的官方示例作做举例:
import allure import pytest from .steps import imported_step @allure.step def passing_step(): pass @allure.step def step_with_nested_steps(): nested_step() @allure.step def nested_step(): nested_step_with_arguments(1, 'abc') @allure.step def nested_step_with_arguments(arg1, arg2): pass def test_with_imported_step(): passing_step() imported_step() def test_with_nested_steps(): passing_step() step_with_nested_steps()
运行这个case后,报告是这样的:
可以看到,
test_with_nested_steps由passing_step()和step_with_nested_steps()这两个方法组成;
而step_with_nested_steps()又由nested_step()组成;
nested_step()又由nested_step_with_arguments(1, 'abc')组成;
这样就像搭积木一样,组成了测试用例;而在报告里,也层级分明的标识了步骤的嵌套结构。
这样,我们就可以通过一个又一个@step装饰的方法,组成测试用例;同时报告里也会支持层级显示;从而完成我们的分层机制。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
以太坊和IPFS如何存储数据
如何将JSON文件存储在IPFS上,并使用Oraclize访问智能合约中的数据呢? 以太坊是一个成熟的区块链,使开发人员能够创建智能合约,在区块链上执行的程序可以由交易触发。人们经常将区块链称为数据库,但使用区块链作为数据存储非常昂贵。 以目前的价格(530美元,4gwei)在以太坊上存储250GB将花费你106,000,000美元。一般来说,我们可以忍受高成本因为我们: 不会在以太坊区块链上保存那么多数据。 区块链的审查制度,透明度和稳健性是值得的。 如果你是以太坊的新手,请查看此介绍。 去中心化存储 IPFS(星际文件系统)对区块链存储有一些保证,即去中心化和防篡改,但不比传统的磁盘空间花费更多费用。使用EBS 250GB存储运行EC2 t2.micro实例将花费你大约15美元/月。IPFS的一个独特功能是它处理文件的方式。它不使用基于位置的寻址(如域名,IP地址,文件路径等),而是使用基于内容的寻址。将文件(或目录)添加到IPFS存储库后,可以通过其加密哈希来引用它。 $ ipfs add article.json added Qmd4PvCKbFbbB8krxajCSeHdLX...
- 下一篇
HTTP API 自动化测试从手工测试到平台的演变
不管是 Web 系统,还是移动 APP,前后端逻辑的分离设计已经是常态化,相互之间通过 API 调用进行数据交互。在基于 API 约定的开发模式下,如何加速请求 / 响应的 API 测试,让研发人员及早参与到调试中来呢?既然 API 是基于约定开发,为何不按照这个规范编写测试用例,直接进入待测试状态,使用自动化的方式来推进研发过程的质量改进呢?遵循:测试 -> 重构 -> 测试 -> 重构,这样的闭环,过程产出的质量会更加可控,在重构的同时进行快速的功能回归验证,大大提高效率。下面主要讲解基于 HTTP 协议的 API 测试,从手工测试到平台的演变过程。 手工测试带来的困惑 测试团队采用《敏捷脑图用例实践之路》的方式编写测试用例: 图 -1- 分计费单元查询带宽 优点: 要点清晰简洁展现 所有测试故事点经过用例评审,产生质量高,研发参与感强; 版本同步保持一份 API 测试脑图带来的问题: 脑图用例对测试人员的素质要求相当高 完善的脑图用例编写,需要有资深的测试人员,对业务精通、对测试技能精通,很强的思维能力;如果研发人员仅仅参考这个脑图用例进行测试,往往很多时候需要...
相关文章
文章评论
共有0条评论来说两句吧...