zoukankan      html  css  js  c++  java
  • 【接口自动化】 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

  • 相关阅读:
    小素典会员订阅协议
    vue项目自动构建工具1.0,支持多页面构建
    spring boot 框架根據 sql 創建語句自動生成 MVC層類代碼
    使用 docsify 創建自己的 markdown 文檔系統
    “衣”及其部分屬字
    js原型鏈與js繼承解析
    js 中怎么获取session 值和HTML标签的属性值
    layui table动态表头 改变表格头部 重新加载表格的方法
    throw throws Throwable 关联于区别
    静态代理和动态代理的区别和联系
  • 原文地址:https://www.cnblogs.com/Ronaldo-HD/p/13749933.html
Copyright © 2011-2022 走看看