Pytest从测试类外为测试用例动态注入数据

今天Nelly问我Pytest能不能支持从TestClass类外传入参数?从类外批量传入各个test方法需要的参数。因为数据文件可能有很多情况,不方便依次匹配。
然而又必须用类对用例进行归类及复用,数据要通过类外进行遍历。不能直接使用pytest.mark.parametrize。

这里采取的一个做法是:

  1. 添加命令行选项 --data,接受一个yaml文件
  2. data这个fixture方法里,获取--data传进来的文件路径,打开并加载所有数据,从request中获取调用data 的用例名,从所有数据中取出该条用例的数据返回

具体参考以下代码:
data.yaml文件内容,注意数据字段要与测试方法名一致,方便自动对应数据。

test_a: 
  a: 1
  b: 2

test_b:
  a: 3
  b: 4

conftest.py文件内容

import pytest
import yaml

def pytest_addoption(parser):   # 添加运行参数
    parser.addoption("--data", action="store", help="data file")

@pytest.fixture
def data(request):
    file_path = request.config.getoption("--data")  # 获取--data参数传的文件路径
    with open(file_path) as f:   # 加载所有数据
        all_data = yaml.safe_load(f) 

    test_case_name = request.function.__name__  # 获取调用的data这个fixture方法的测试方法名称

    return all_data.get(test_case_name)   # 只返回指定用例的数据

测试模块test_demo3.py内容

import pytest

class TestDemo(object):
    def test_a(self, data):  # 所有用例要带上data这个fixture参数
        print(data)

    def test_b(self, data):
        print(data)


if __name__ == '__main__':
    pytest.main(['test_demo3.py', '-sq', '--data=data.yaml'])

猜你喜欢

转载自www.cnblogs.com/superhin/p/11694919.html