我正在使用 Pytest 编写一些单元测试,并遇到了两种参数化测试输入的方法。一种是使用参数化夹具,另一种是使用pytest.mark.parametrize
方法。
我的两个例子是:
# method 1
def tokens():
yield from ["+", "*", "?"]
@pytest.mark.parametrize("token", tokens())
def test_stuff(token):
assert stuff
和
# method 2
@pytest.fixture(params=["+", "*", "?"])
def token(request):
return request.param
def test_stuff(token):
assert stuff
据我所知,两者都有不同的优点和缺点:
方法一
优点
- 支持多种参数
- 支持惰性求值
缺点
- 用于多种测试方法时的样板代码更多
- 需要对使用的每个方法进行显式参数映射,即使参数名称相同
方法二
优点
- 更少的样板代码
缺点
- 只允许将单个参数传递给单元测试
我还是 PyTest 的新手,所以也许有一种方法可以解决我上面列出的每种方法的缺点,但考虑到那些我一直很难决定使用哪个方法。我猜想做我想做的事情的预期方法是使用@pytest.mark.parametrize
,但是当通过使用夹具仅传递具有较少样板代码的单个参数时似乎是一个很大的优势。谁能告诉我不这样做的理由还是这是一个完全有效的用例?