我正在研究pyTest。因此,在这种情况下,同一个pyTest具有多个测试数据,但是,不同的测试数据在灯具中具有不同的设置。我浏览了pyTest的文档,并弄清楚了如何使用parametrized
函数来独立完成这两个任务,如下所示:
对于数据驱动的测试数据:
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)
在这种情况下,test_data
是一个json文件,其中包含大约6种不同的测试数据,而test_data_ids
是测试数据ID的列表。
然后将参数传递到夹具:
@pytest.mark.parametrize('setup_person', [['student']], indirect=True)
。在这种情况下,setup_person
是我的灯具名称,student
是灯具接受的参数之一。
但是,现在我需要将它们结合起来才能工作,但我找不到与此有关的任何文档或资源。我想要实现的是数据驱动测试,同时向夹具发送不同的参数。这是我的装置:
@pytest.fixture(params=['student', 'teacher', 'outsider'])
def setup_person(request):
if request.param is 'student':
setup = 'This is student.'
elif request.param is 'teacher':
setup = 'This is teacher.'
elif request.param is 'outsider':
setup = 'This is outsider'
else:
setup = 'Incorrect parameter passed'
return setup
这是我的灯具外观的一个简单示例,如您所见,我在灯具中有3个参数,每个参数都会将不同的东西返回到测试中。
这是我的测试结果:
@pytest.mark.parametrize('setup_person', [['student']], indirect=True)
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)
def test_person(setup_person, valid_data):
response = setup_person
assert response == 'This is student.'
但是,当我尝试组合两个参数化函数时,似乎参数student
仅在第一个参数运行时才传递一次,然后第二个参数与测试数据将不会传递{{1 }}和灯具也不会保存。
因此,当我运行测试时,它将导致总是进入student
部分,因为当我运行测试数据参数化函数时,什么都没有通过。
是否还有其他方法可以将两个功能组合在一起,或者还有其他解决方法?感谢您的阅读,感谢您的帮助!
答案 0 :(得分:1)
我认为您只是通过使用列表中的列表在第一个@pytest.mark.parametrize
装饰器中犯了一个错误。像这样的简单列表:
@pytest.mark.parametrize('setup_person', ['student'], indirect=True)
@pytest.mark.parametrize('valid_data', test_data, ids=test_data_ids)
...应该从第一个parametrize
装饰器(在这种情况下,student
将始终传递到Fixture函数)和第二个parametrize
装饰器产生值的所有可能组合这意味着test_data
包含的内容。
答案 1 :(得分:0)
我通常使用此类:
class parameterized:
'''
Use this decorator on test methods like this:
@parameterized(actual=[5,6],expected=[5,6])
def test3(self, actual, expected):
self.shouldEqual(actual,expected)
The example uses parameters actual and expected, but they can be anything you like, as long
as the parameters match in number and name.
This decorator uses unittest.TestCase.subTest to separately markup every failing test.
'''
def __init__(self, **kwargs):
self.kwargs = kwargs
def __call__(self, fn):
def test_wrapped(itself):
size = len(self.kwargs[list(self.kwargs.keys())[0]])
for index in range(size):
test_method_parameters = {k: self.kwargs[k][index] for k in self.kwargs}
with itself.subTest(**test_method_parameters):
fn(itself, **test_method_parameters)
return test_wrapped
我将其与unittest
结合使用,因此由于使用pytest
,我不确定它是否可以与subTest
一起使用。