【接口自动化】 Pytest+Allure+Request 搭建接口自动化测试二

前言

第一篇介绍了如何获取接口的登录凭据,接下来这篇主要分析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

原文地址:https://www.cnblogs.com/Ronaldo-HD/p/13749933.html