为什么我在将列表传递给“pytest\u generate\u tests”中的“metafunc.parametrize”时得到“valueerror:duplicate”`

ki0zmccv  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(353)

我正在传入一个json文件,其中包含以下内容:


# config.json

[
{
    "id" : 1,
    "description" : "test1",
    "data1": [1, 2, 3],
    "data2": ["foo", "bar", "baz"]

},
{
    "id" : 2,
    "description" : "test2",
    "data1": [4, 5, 6],
    "data2": ["baz", "foo"]
}
]

正在尝试使用data1创建测试置换。造成问题的最基本方法是:


####################### 

# conftest.py

import json
import pathlib
import pytest

def pytest_generate_tests(metafunc):
    print("pytest_generate_tests")
    config = pathlib.Path(metafunc.module.__file__).with_name('config.json')
    testdata = json.loads(config.read_text())
    for test in testdata:
        metafunc.parametrize('testdata', testdata)
        metafunc.parametrize('data', test.get('data1'))

####################### 

# test_example.py

import pytest

def test_example(testdata, data):
    pass

给出了错误:

external_data/conftest.py:11: in pytest_generate_tests
    metafunc.parametrize('data', test.get('data1'))
/usr/local/lib/python3.9/site-packages/pytest-6.2.3-py3.9.egg/_pytest/python.py:1100: in parametrize
    newcallspec.setmulti2(
/usr/local/lib/python3.9/site-packages/pytest-6.2.3-py3.9.egg/_pytest/python.py:932: in setmulti2
    self._checkargnotcontained(arg)
/usr/local/lib/python3.9/site-packages/pytest-6.2.3-py3.9.egg/_pytest/python.py:909: in _checkargnotcontained
    raise ValueError(f"duplicate {arg!r}")
E   ValueError: duplicate 'data'

我想看到的是,这两个更广泛的结构都要测试data1(最终是data2)的所有排列

external_data/test_example.py::test_example[testdata0-1] PASSED
external_data/test_example.py::test_example[testdata0-2] PASSED
external_data/test_example.py::test_example[testdata0-3] PASSED
external_data/test_example.py::test_example[testdata1-4] PASSED
external_data/test_example.py::test_example[testdata1-5] PASSED
external_data/test_example.py::test_example[testdata1-6] PASSED
0x6upsns

0x6upsns1#

你必须把名单传给参数化,否则你就是在打电话 parametrize('data',...) 多次使用不同的参数。
这样的方法应该有用:

def pytest_generate_tests(metafunc):
    print("pytest_generate_tests")
    config = pathlib.Path(metafunc.module.__file__).with_name('config.json')
    testdata = json.loads(config.read_text())
    data = [test.get('data') for test in testdata]
    metafunc.parametrize('data', data)

参数化将iterable作为第二个参数。

相关问题