zoukankan      html  css  js  c++  java
  • Pytest接口自动化框架

    预研背景

    目前系统研发多为前后端分离,当后端接口研发完成后,可以不依赖前端界面通过接口测试提前发现问题并解决。同时由于软件迭代周期不断缩短,开发新功能后又担心影响原有功能,可以通过接口自动化进行原有功能快速回归测试,将更多精力专注于迭代功能测试,这样才能放心地发布产品。由此看来,接口自动化测试可以减轻工作量,提高测试效率和产品质量。市面上的主流接口自动化测试工具或框架很多,需要调研对比各自的特点,挑选出适合项目的工具快速完成自动化测试。

    预研目标

    体验工具主要特性功能使用及便利性,体验内容包含如下:

    l 单接口测试

    l 多接口组合测试

    l 测试报告

    l 测试用例管理

    l 日志查看

    l 脚本调试

    l 持续集成

    工具/框架介绍

    Pytest是一个软件测试框架。它是一款命令行工具,可以直接测试各类程序自动找到测试用例执行,并且汇报测试结果。

    主要特性:

    1) 易于上手,入门简单

    2) 能支持简单的单元测试和复杂的功能测试

    3) 测试用例编写简单可读性强,支持参数化

    4) 灵活指定用例执行方式、顺序等

    5) 丰富的基础库,可以大幅提高用户编写测试用例效率

    6) 详细的日志输出

    7) 灵活、扩展性好,可以很容易地融入已有的开发测试流程如可运行由unittest和node编写的测试用例

    8) 很容易与其他工具集成到一起使用,比如和jenkins持续集成、allure测试报告展示等

     

    官网:https://docs.pytest.org/en/latest/index.html

    工具/框架环境搭建

    使用Python3+Pytest+Request+Jenkins+Allure框架来进行接口自动化测试,并实现持续集成,自动生成html测试报告。

    1、Python安装

    它不依赖与Python版本,Python2(2.6及更高版本)Python3(3.3及更高版本)都可以安装最新版本的pytest

    l 检查本地是否已有python环境:

    python --version

    l python3安装(若已经安装,此步忽略)

    安装可参考:https://blog.csdn.net/weixin_40844416/article/details/80889165

    1、requests安装

    通过命令行安装requests

    pip install request

    3Pytest安装

    通过命令行安装Pytest

        pip install pytest

     

     

    l 命令行检查安装版本

    pytest --version

     

    4Pycharm配置pytest运行程序

    Pycharm File->Settings->Tools->Python Integrated Tools,选择需运行pytest项目,Default test runner下拉选择pytest,设置完成后,编写pytest用例即可直接使用pytest运行

    编写第一个自动化脚本

    脚本实现的用户场景:获取Token-》发起一个HTTP请求-》对响应结果进行断言

    详细步骤:

    1、每个接口都需要用到token,通过conftest.py共享fixture,@pytest.fixture标记返回封装获取token值函数

    conftest.py:

    1.import pytest  
    2.import requests  
    3.  
    4.authentication_url_path = "/v1/tokens"  
    5.  
    6.json_login = {  
    7.    "authType": "password",  
    8.    "params": {  
    9.        "username": "zhuxuefei",  
    10.        "password": "jixlb2tIrjF5t/bYQTXz4Q=="  
    11.    }  
    12.}  
    13.  
    14.def pytest_addoption(parser):  
    15.    parser.addoption("--ip", action="store", default="XX.XX.XX.XX", help="please input target VM ip.")  
    16.    parser.addoption("--port", action="store", default="api", help="please input target service port.")  
    17. 
    18. 
    19.@pytest.fixture(scope="session")  
    20.def ip(request):  
    21.    return request.config.getoption("--ip")  
    22. 
    23. 
    24.@pytest.fixture(scope="session")  
    25.def port(request):  
    26.    return request.config.getoption("--port")  
    27. 
    28. 
    29.@pytest.fixture(scope="session")  
    30.def uri(ip,port):  
    31.    uri = "http://%s/%s" % (ip, port)  
    32.    return uri  
    33. 
    34. 
    35.@pytest.fixture(scope="session")  
    36.def auth_token(uri):  
    37.    headers = {"User-Agent": "automation",  
    38.               "content-type": "application/json;charset=UTF-8"  
    39.               }  
    40.  
    41.    post_response = requests.post(url=uri + authentication_url_path,  
    42.                                  json=json_login,  
    43.                                  headers=headers)  
    44.  
    45.    assert post_response.status_code == requests.status_codes.codes.OK  
    46.    resp_payload = post_response.json()  
    47.    assert resp_payload['status'] == 200  # to be defined.  
    48.    auth_token = resp_payload['data']['key']  
    49.  
    50.    return auth_token  
    51.
    52.@pytest.fixture(scope="session")  
    53.def headers(uri):  
    54.    headers = {"User-Agent": "automation",  
    55.               "content-type": "application/json;charset=UTF-8"  
    56.               }  
    57.  
    58.    post_response = requests.post(url=uri + authentication_url_path,  
    59.                                  json=json_login,  
    60.                                  headers=headers)  
    61.  
    62.    assert post_response.status_code == requests.status_codes.codes.OK  
    63.    resp_payload = post_response.json()  
    64.    assert resp_payload['status'] == 200  # to be defined.  
    65.    auth_token = resp_payload['data']['key']  
    66.  
    67.    headers = {"User-Agent": "automation",  
    68.               "content-type": "application/json;charset=UTF-8",  
    69.               "T-AUTH-TOKEN": auth_token}  
    70.    return headers  
    

      

    2、将获取token值fixture函数传递给http请求接口

    3、用例数据写在excel文件中,实现读取测试用例逻辑,将测试用例数据通过@pytest.mark.parametrize()传入测试函数,循环执行测试数据

    param_create_vlanpool = read_excel_tuple(excelFile, '创建VLAN池')  
    

    4、每次执行assert断言用例结果

     用例名称以test开头,如test_create_vlanpool.py:

    1.@pytest.mark.parametrize('name,tag,ResourcePoolName,vlanTagStart,vlanTagEnd', param_create_vlanpool)  
    2.def test_create_vlanpool(uri, headers, name, tag, ResourcePoolName, vlanTagStart, vlanTagEnd):  
    3.    resourcepoolid = get_resourcepoolid(uri, headers, ResourcePoolName)  
    4.    param = {  
    5.        'name': name,  # VLAN池名称  
    6.        'tag': tag,  
    7.        'vlanPoolResourcePoolList': [{'resourcePoolId': resourcepoolid}],  #作用域调用资源池ID  
    8.        'vlanTagEnd': vlanTagStart,  # 结束VLAN ID  
    9.        'vlanTagStart': vlanTagEnd  # 起始VLAN ID  
    10.    }  
    11.    create_vlanpool_response = requests.post(  
    12.        url=uri + create_vlanpool_url_path,  
    13.        headers=headers,  
    14.        json=param  
    15.    ).json()  
    16.    print(create_vlanpool_response)  
    17.    code = create_vlanpool_response['status']  
    18.    allure.attach("请求响应code", str(create_vlanpool_response['status']))  
    19.    allure.attach("请求响应结果", str(create_vlanpool_response))  
    20.    my_log().info(create_vlanpool_response)  
    

      

    5、Pycharm的Terminal页面进入该py文件路径下,执行pytest test_create_vlanpool.py或直接右击测试用例Run ‘pytest’ in ‘test_create_vlanpool.py.py’运行用例

    编写业务场景接口组合测试脚本

    测试报告查看

    利用Allure框架生成高大上的html报告,allure还支持使用Jenkins持续集成。

    安装allure-pytest插件,通过allure标签自定义完善测试报告

    import allure

    @allure.feature(‘XX’)

    @allure.story(‘XX’)

    @allure.attach(‘XX’)

    执行pytest test.py --alluredir report/allure_raw生成运行后原始结果

    安装Allure工具并配置环境变量,确保allure命令可用

    allure generate <allure测试结果目录> -o <存放报告的目录> --clean 生成html测试报告

    测试用例管理

    • 测试用例编写命名规则

    测试文件应命名为st_xx.pyxx_test.py

    测试类命令以Test开头

    测试函数、测试类方法命令以test开头

    • pytest提供标记机制,使用marker对测试函数标记指定运行用例

    比如选择部分测试用例作为冒烟测试,可以对它们添加@pytest.mark.smoke装饰,运行时在命令中指定-m smoke就可以

    通过@pytest.mark.run(order=X)来标记用例执行顺序

    通过@pytest.mark.skip()@pytest.mark.skipif()来跳过不想执行的测试用例

    • 运行测试用例方式

    运行pytest时可以指定目录和文件。如果不指定,pytest会搜索当前目录及其子目录中以test_开头或以_test结尾的测试函数。

    l 命令方式执行

    pytest -v -s xx.py

    l Pytest.main主程序执行,参数和命令方式一致

    测试方法优化

    在编写第一个自动化脚本中都对应应用

    使用fixture配置、传递初始化测试数据

    通过confest.py共享fixture

    l @pytest.mark.parametriz()数据参数化允许传递多组数据执行批量测试

    日志查看

    Pycharm执行pytest用例可以在终端界面输出详细日志

     

    脚本调试

    持续集成

    l Jenkins上创建工程,配置接口自动化工程代码库

    l 设置需被执行测试环境及调用主程序执行

    l Jenkins安装Allure插件,设置allure report原始执行结果路径

    l Jenkins自动构建运行用例并生成测试报告

  • 相关阅读:
    【题解】Luogu P3217 [HNOI2011]数矩形
    【题解】 Luogu P4312 / SP4155 [COCI 2009] OTOCI / 极地旅行社
    珂朵莉树详解
    数学手法之线性基
    【题解】luogu P3386 【模板】二分图匹配
    【题解】Luogu P2146 [NOI2015]软件包管理器
    css 垂直居中方法汇总
    css3中什么时候用transition什么时候用animation实现动画
    前端进阶(8)
    前端进阶(12)
  • 原文地址:https://www.cnblogs.com/Lina-zhu/p/12874344.html
Copyright © 2011-2022 走看看