pytest+yaml+allure框架接口自动化测试教程

框架简介:使用pytest库,去运行测试用例,用yaml做数据驱动,allure生成测试报告。

测试报告效果
pytest+yaml+allure框架接口自动化测试教程_第1张图片
pytest+yaml+allure框架接口自动化测试教程_第2张图片

项目目录结构
pytest+yaml+allure框架接口自动化测试教程_第3张图片

一、pytest.ini文件
pytest的配置文件,用来配置运行规则和运行命令。
addopts 为运行命令,命令之间用空格隔开.。-vs:表示显示详细调试信息;./temps 为allure测试报告生成目录 ;–clean 为清除历史报告。
testpaths 填写测试用例的目录。
python_files、python_classes、python_functions分别定义了文件名、类名、函数名的规则,只有满足规则才会被执行。

[pytest]
addopts = -vs --alluredir ./temps --clean-alluredir
testpaths = ./test_cases
python_files = test_*.py
python_classes = Test*
python_functions = test_*

二、封装基本接口请求方法
封装GET和POST请求,根据method去执行并返回res。

import requests
import json


class RequestMethod:
    session = requests.session()  # 会话

    def all_send_request(self, method, url, data, headers, **kwargs):
        method = str(method).lower()
        if method == "get":
            res = RequestMethod.session.request(method=method, url=url, params=data, **kwargs)
        elif method == "post":
            str_data = json.dumps(data)
            # print(str_data)
            res = requests.request(method=method, url=url, data=str_data, headers=headers)
        else:
            print("不支持的请求方式")
        return res

三、Yaml文件测试用例
写完用例后可以用 BEJSON 去校验一下格式是否正确。
Yaml语法可以参考 菜鸟教程

-
  title: 消费记录订单列表
  method: post
  url: https://xxxxxxx.com/bes/getOrderList
  payload:
    pageNum: 1
    pageSize: 10
    packageName:
    oendTime:
    beginTime:
  validate:
    equals: 200

-
  title: 消费记录订单列表
  method: post
  url: https://xxxxxxxxx.com/bes/getOrderList
  payload:
    pageNum: 2
    pageSize: 1
    packageName:
    oendTime:
    beginTime:
  validate:
    equals: 200

四、读取Yaml文件数据
这里使用YamlUtil().read_extract_yaml(“文件路径”)函数去读取文件数据。

import os
import yaml


class YamlUtil:

    # 读取extract.yml文件
    def read_extract_yaml(self,path):
        with open(path, mode="r", encoding='utf-8')as f:
            value = yaml.load(stream=f, Loader=yaml.FullLoader)
            return value

        # 写入save.yml文件

    def write_save_yaml(self, data):
        with open(os.getcwd() + "/data/save.yml", mode="a", encoding='utf-8')as f:
            yaml.dump(data=data, stream=f, allow_unicode=True)

    # 清除yaml文件
    def clear_save_yaml(self):
        with open(os.getcwd() + "/data/save.yml", mode="w", encoding='utf-8')as f:
            f.truncate()

五、用例执行文件
下面附上allure装饰器的用法。
pytest+yaml+allure框架接口自动化测试教程_第4张图片
@pytest.mark.parametrize(‘args’,
YamlUtil().read_extract_yaml(os.getcwd() + “/data/Consumption/consumption_list.yml”))
@pytest.mark.parametrize装饰期能参数化数据,多组数据会执行多次。如上三所示的Yaml文件中的两组数据会执行两次,这样便于同一个接口设计多条测试用例。

import os
import re

import allure
import pytest
from common.yaml_util import YamlUtil
from method.request_method import RequestMethod


@allure.feature("消费记录")  # 一级菜单
class TestConsumption:
    token = YamlUtil().read_extract_yaml(os.getcwd() + "/data/token.yml")["token"]

    @allure.severity(allure.severity_level.CRITICAL)  # 设置用例优先级
    @allure.story("订单列表")  # 二级菜单
    @pytest.mark.parametrize('args',
                             YamlUtil().read_extract_yaml(os.getcwd() + "/data/Consumption/consumption_list.yml"))
    def test_consumption_list(self, args):
        """
        订单列表,post请求,/bes/order/getOrderList,正例:正常参数请求,获取订单列表
        """
        print(f"当前驱动数据:{args}")
        response = RequestMethod().all_send_request(method=args["method"], url=args["url"],
                                                    headers=TestConsumption.token, data=args["payload"])
        with allure.step("响应结果"):
            allure.attach(response.text)
        assert response.status_code == 200

六、前后置用例
在目录下建一个conftest.py文件,文件名称固定的,使用其他名称无效。

实现部分前置
    @pytest.fixture(scope="作用域",params="数据驱动",autouse="自动执行",ids="自定义参数名",name="重命名")
     作用域:function,class,module,package/session
    yieldreturn都表示返回,yield返回多次多个数据,return只会返回一次,return后不能接代码
    @pytest.fixture()一般会和conftest.py文件一起使用
@pytest.fixture(scope="class",autouse=True)
def login_alipay():
    pass
    yield
    pass

七、运行文件

import os

import pytest

if __name__ == '__main__':
    pytest.main()
    os.system("allure generate ./temp -o ./report --clean")

你可能感兴趣的:(pytest,python)