39-pytest-使用yaml文件编写测试用例


前言

  • 本篇来学习在pytest中使用yaml编写测试用例

项目结构

在这里插入图片描述

conftest.py

  • 只需在 conftest.py 即可实现使用yaml编写测试用例
# -*- coding: utf-8 -*-
# @Time    : 2021/10/13
# @Author  : 大海

import jsonpath
import pytest
import requests

def pytest_collect_file(parent, file_path):
    if file_path.suffix == ".yaml" and file_path.name.startswith("test"):
        return YamlFile.from_parent(parent, path=file_path)


class YamlFile(pytest.File):
    def collect(self):
        import yaml
        yml_raw = self.fspath.open(encoding='utf-8').read()
        print('yml_raw', yml_raw)
        yml_var = Template(yml_raw).safe_substitute(os.environ)
        raw = yaml.safe_load(yml_var)
        print('raw', raw)
        for yaml_case in raw:
            name = yaml_case["test"]["name"]
            values = yaml_case["test"]
            yield YamlItem.from_parent(self, name=name, spec=values)


class YamlItem(pytest.Item):
    def __init__(self, name, parent, spec):
        super().__init__(name, parent)
        self.name = name
        self.values = spec
        self.request = self.values.get("request")
        self.validate = self.values.get("validate")
        self.s = requests.session()

    def values_render_variable(self, values):
        # 替换测试用例中的关联值
        yaml_test = Template(json.dumps(values)).safe_substitute(os.environ)
        values = yaml.safe_load(yaml_test)
        print('values', values)
        return values

    def runtest(self):
        values = self.values_render_variable(self.values)
        print('values:', values)
        request_data = values["request"]

        response = self.s.request(**request_data)
        print("响应数据:", response.text)

        # 判断是否有extract提取参数,实现参数关联
        if values.get("extract"):
            for key, value in values.get("extract").items():
                os.environ[key] = jsonpath.jsonpath(response.json(), value)[0]
                print('key', key)
                print('value', jsonpath.jsonpath(response.json(), value)[0])
        # 断言
        print('validate:', self.validate)
        self.assert_response(response, self.validate)

    def assert_response(self, response, validate):
        """自定义断言"""
        for i in validate:
            if "eq" in i.keys():
                yaml_result = i.get("eq")[0]
                actual_result = jsonpath.jsonpath(response.json(), yaml_result)
                expect_result = i.get("eq")[1]
                print("实际结果:%s" % actual_result[0])
                print("期望结果:%s" % expect_result)

                assert actual_result[0] == expect_result

yaml文件

  • test_method.yaml

说明:
此yaml支持参数化

  • extract :提取关键字
    • name: 后面引用变量的key值
    • $.args.name:jsonpath 提取变量表达式

引用变量

  • $name : $key
- test:
    name: get case
    request:
      url: https://postman-echo.com/get
      method: GET
      headers:
        Content-Type: application/json
        User-Agent: python-requests/2.18.4
      params:
        name: DH
        city: Beijing
    extract:
      name: $.args.name
    validate:
      - eq: [$.args.name, DH]
      - eq: [$.args.city, Beijing]
- test:
    name: post case
    request:
      url: https://postman-echo.com/post
      method: POST
      headers:
        Content-Type: application/json
        User-Agent: python-requests/2.18.4
      json:
        name: $name
        city: Beijing
    validate:
      - eq: [$.json.name, DH]
      - eq: [$.json.city, Beijing]

执行并查看结果

pytest -s -v

在这里插入图片描述

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
pytestPython中最流行的测试框架之一,它支持使用yaml格式来编写测试用例。以下是使用pytestyaml编写测试用例的步骤: 1. 安装pytest和pyyaml: ```python pip install pytest pyyaml ``` 2. 创建一个yaml文件文件名可以是任意的。在文件中,我们可以定义多个测试用例,每个测试用例包含以下信息: - name: 测试用例名称 - input: 测试用例输入 - expected_output: 测试用例预期输出 例如: ```yaml - name: addition_test input: a: 1 b: 2 expected_output: 3 - name: subtraction_test input: a: 5 b: 2 expected_output: 3 ``` 3. 在pytest测试文件使用yaml文件中的测试用例。我们可以使用pyyaml库将yaml文件解析为Python对象,然后在pytest使用它。 ```python import yaml def test_yaml_cases(): with open('test_cases.yaml', 'r') as f: test_cases = yaml.load(f, Loader=yaml.FullLoader) for case in test_cases: input_data = case['input'] expected_output = case['expected_output'] assert your_function(*input_data.values()) == expected_output ``` 在上面的代码中,我们首先打开yaml文件使用pyyaml库将其解析为Python对象。然后,我们迭代测试用例并执行测试。对于每个测试用例,我们使用字典的values()方法获取输入数据的值并将其作为参数传递给被测试的函数。最后,我们断言函数的实际输出与测试用例的预期输出相同。 4. 运行pytest测试框架来验证我们的测试用例是否可以正常工作。 ```python pytest test_yaml_cases.py ``` 通过上述步骤,我们可以快速有效地设计和执行测试用例使用pytestyaml编写测试用例不仅可以提高代码质量,还可以帮助开发人员减少繁琐的测试工作,从而更好地专注于软件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习de测试小白

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值