参数化火试夹具

2022-03-01 00:00:00 python pytest

问题描述

就我从文档中了解到的有关pytest装置参数化的内容而言,它使用给定的参数创建装置的副本,从而使用不同的副本调用需要该装置的每个测试。

我的需求有点不同。假设有一个装置:

@pytest.fixture
def sample_foo():
    return Foo(file_path='file/path/test.json')

def test1(sample_foo):
    pass

def test2(sample_foo):
    pass

问题是测试test1test2需要类Foo的相同实例,但file_path

的值不同

所以目前我这样做:

def build_foo(path):
   return Foo(file_path=path)

 def test1():
     sample_foo = build_foo('file/path/some.json')

 def test2():
     sample_foo = build_foo('file/path/another.json')

这看起来有点代码重复。我可以为每个文件创建单独的装置,但这看起来更糟。看起来每个测试都需要自己唯一的文件,所以也许可以通过查看请求装置的测试函数的名称来确定文件的名称,从而解决这个问题。但这不能保证。


解决方案

您需要fixture parameters

fixture函数可以参数化,在这种情况下,它们将被多次调用,每次执行依赖测试集,即依赖于此fixture的测试。

def build_foo(path):
   return Foo(file_path=path)

@pytest.fixture(params=["file/path/some.json", "file/path/another.json"])
def file_path(request):
    return request.param

def test(file_path):    
    sample_foo = build_foo(file_path) 

也许您可以直接

def test(file_path):    
    sample_foo = Foo(file_path) 

相关文章