Pytest学习笔记(七)参数化parametrize
可以使用pytest.mark.parametrize装饰器来对测试用例进行参数化。
对列表中的对象进行循环,然后一一赋值,这个对象可以是列表,元组,字典。
import pytest def add(a, b): return a + b @pytest.mark.parametrize("a,b,expect", [ [1, 1, 2], [2, 3, 5], [4, 5, 7] ]) def test_add(a, b, expect): assert add(a, b) == expect
执行结果:
还可以对每组参数进行标识,如下:
import pytest def add(a, b): return a + b @pytest.mark.parametrize('a,b,expect', [ pytest.param(1, 1, 2, id="first case"), pytest.param(2, 3, 5, id="second case"), pytest.param(4, 5, 8, id="third case") ]) def test_add(a, b, expect): assert add(a, b) == expect
或者用ids进行统一标记
import pytest def add(a, b): return a + b @pytest.mark.parametrize("a,b,expect", [ [1, 1, 2], [2, 3, 5], [4, 5, 9] ],ids=["第一个测试用例","第二个测试用例","第三个测试用例"]) def test_add(a, b, expect): assert add(a, b) == expect
解决标记中文显示unicode编码
标记时,中文在控制台显示unicode编码
在项目目录下新建一个conftest.py文件,添加如下函数:
def pytest_collection_modifyitems(items): for item in items: item.name = item.name.encode('utf-8').decode('unicode-escape') item._nodeid = item.nodeid.encode('utf-8').decode('unicode-escape')
再次执行就可以显示中文了
使用mark.xfail对参数进行标识
import pytest def add(a, b): return a + b @pytest.mark.parametrize('a,b,expect', [ pytest.param(1, 1, 2, id="first case"), pytest.param(2, 3, 5, id="second case"), pytest.param(4, 5, 8, id="third case", marks=pytest.mark.xfail(reason="这是个bug")) ]) def test_add(a, b, expect): assert add(a, b) == expect
执行结果:
读取外部数据进行参数化
在自动化测试用例编写中,我们一般遵循数据分离的原则,在使用pytest.mark.parametrize装饰器进行参数化时,数据来源也可以是json,yaml,csv等文件。
如下:
我们把数据放在json文件中
# param.json { "par": [ {"a": 1,"b": 2,"expect": 3}, {"a": 2,"b": 4,"expect": 6}, {"a": 4,"b": 5,"expect": 9} ] }
测试用例:
import pytest import json def read_json(): with open("param.json", "r") as f: return json.load(f)["par"] def add(a, b): return a + b @pytest.mark.parametrize('data', read_json()) def test_add(data): a = data.get("a") b = data.get("b") expect = data.get("expect") assert add(a, b) == expect