前言
第一篇介绍了如何获取接口的登录凭据,接下来这篇主要分析Pytest 框架和allure 需要注意的一些点。
为什么不适用现有的框架和平台
接口自动化的框架其实非常多,有很多的是现成的平台或者封装好的前后端都有的平台,那么如果选择这类平台你可能面临如下问题:
1. 平台学习成本,有些平台是非常复杂的,你要使用起来需要深刻理解它的的内部原理
2. 平台是否满足你现有的项目业务需求? 毕竟你的自动化项目的出发点还是为了业务测试,加上让你的项目必须上报给公司的其他平台,或者回传一些信息,你怎么办?
3. 现有的平台框架在前2点下已经能淘汰95%, 目前接口自动化国内非常活跃的有httprunner, 很多开发者借助这个框架自研了很多接口平台,而我这边不选择它是因为接口用例需要和功能用例相关联起来
这种情况下httprunner的录制功能就很鸡肋了,因为你无法录制的时候关联你的功能用例。
Pytest 的基本使用方法
1. # 定义测试集 (注意带了-s -q 的话,用例里面print 的内容将不会出现在报告里面)
args = ['--alluredir', xml_report_path]
# args = ['-s', '-q', '--alluredir', xml_report_path]
pytest.main(args)
2. 只执行某一个套件
pytest.main("-v -s subpath1/")
pytest.main("-v -s spec_001_modul_test.py")
3. 只执行某一个优先级的用例套件
pytest --alluredir=./report/xml_report_path --allure-severities=blocker,critical
4. 测试文件统一用test 开头
5. 测试文件里面的class 名称要首字母大写
6. 测试文件里面的方法 def ,也要用test 开头
7. 常用的一些声明:
@pytest.mark.skip(reason="调试") # 跳过该测试 # @pytest.mark.repeat(10) 重复执行该用例10次
常见的一条pytest 用例:
@allure.story('menu接口1: XXXXX') def test_CDN_244511(self): temp = self.console_host + '/xxxx?' data = 'workspaceId=' + self.workspace_id + '&domain=cdn.header&locale=zh-cn' payload = {} url = temp + data response = self.session.request("GET", url, data=payload) print("-------------------查询 menu/GetTree 接口-------------------") print('请求url: ' + url) print("请求data: " + data) print("返回: " + response.text) print("重点验证:" " expect: 返回码与响应时间") assert response.status_code == 200 assert 'core.ok' in response.text assert response.elapsed.total_seconds() < 3
Pytest 的监听器机制
pytest在运行的时候有类似testng的监听机制,这套机制可以广泛运用到 执行过程中对 正确,错误的判断加上一些附加操作, 例如失败的时候自动进行截图,或者进行一些成功,失败计算
几个常用的pytest 钩子, 注意必须放在conftest.py里面
conftest 有层级,例如root_dir放了一个, 测试suite里面也放了一个, 那么将不会生效。
如下的例子可以保证2个钩子都生效。
case_nums = 0
# 这个钩子用于收集用例总数,方法名固定, 参数固定为items @pytest.hookimpl(tryfirst=True) def pytest_collection_modifyitems(items): # print("len::", len(items)) global case_nums case_nums = case_nums + int(len(items)) print("用例总数case_nums: ", case_nums) return case_nums # 这个钩子用于监听执行过程中,方法名与参数也是固定的 @pytest.hookimpl(hookwrapper=True) def pytest_runtest_makereport(item, call): out = yield rep = out.get_result() # setattr(item, "rep_" + rep.when, rep) # print("rep:", rep) ''' rep: <TestReport 'test_cert.py::Test_cert::test_CDN_238495' when='teardown' outcome='passed'> ''' # print("nodeid: ",rep.nodeid) i = 0 if rep.when == 'call': i = i + 1 if rep.outcome == 'skipped': ispass = 2 # resultinfo = "测试skipped" elif rep.outcome == "failed": ispass = 0 else: ispass = 1 # resultinfo = "测试通过"
Allure 的一些使用总结
常用的声明
# @allure.feature # 用于定义被测试的功能,被测产品的需求点 # @allure.story # 用于定义被测功能的用户场景,即子功能点 # @allure.severity #用于定义用例优先级 # @allure.issue #用于定义问题表识,关联标识已有的问题,可为一个url链接地址 # @allure.testcase #用于用例标识,关联标识用例,可为一个url链接地址 # @allure.attach # 用于向测试报告中输入一些附加的信息,通常是一些测试数据信息 # @pytest.allure.step # 用于将一些通用的函数作为测试步骤输出到报告,调用此函数的地方会向报告中输出步骤 # allure.environment(environment=env) #用于定义environment
allure的用例分级
[1.用例优先级]
使用:@allure.severity("normal")
'''
blocker 阻塞缺陷(功能未实现,无法下一步)
critical 严重缺陷(功能点缺失)
normal 一般缺陷(边界情况,格式错误)
minor 次要缺陷(界面错误与ui需求不符)
trivial 轻微缺陷(必须项无提示,或者提示不规范)
'''
[2.Allure 的层级关系]
epic>feature>story>testcase>step>description=attach
需要注意的是,除了attach可以放在def下面进行打印,其他的都不能放在def下面,只能作为一个声明放在class或者def上面
allure 的报告文件:
suites.csv 会显示每一条用例的执行情况和耗时, 方便接受结果并将它发送到其他平台 (有了这个,其实做接口就不用Pytest 的钩子了)
执行的总体结果在:
allure的测试报告详解:
环境变量参数需要在xml文件夹下面加载这个:
Allure 挂载到Jenkins
由于没有拿到项目jenkins 的管理员权限,这边还未尝试,可以参考: https://www.jianshu.com/p/b74d8b444681