【发布时间】:2020-02-24 03:06:30
【问题描述】:
我正在使用 Pytest 编写一些单元测试,并遇到了两种参数化测试输入的方法。一种是使用参数化的fixtures,另一种是使用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
据我所知,两者都有不同的优点和缺点:
方法一
优势
- 支持多个参数
- 支持惰性求值
缺点
- 更多样板代码用于多种测试方法
- 需要对使用的每个方法进行显式参数映射,即使参数名称相同
方法2
优势
- 更少的样板代码
缺点
- 只允许将单个参数传递给单元测试
我还是 PyTest 的新手,所以也许有一种方法可以解决我上面列出的每种方法的缺点,但考虑到那些我一直很难决定使用哪个方法。我猜想我想要做的事情的预期方法是使用@pytest.mark.parametrize,但是当通过使用夹具仅传递一个具有较少样板代码的单个参数时似乎是一个很大的优势。谁能告诉我不这样做的理由还是这是一个完全有效的用例?
【问题讨论】:
-
如果您只使用一组数据一次,那么 @pytest.mark.parametrize 应该是一种方法,但是,如果您需要为测试设置和拆卸一些东西或使用相同的数据集多个测试然后使用夹具。您可以在夹具中使用 autouse=True,这将为范围内的所有测试实现夹具,而无需在每个测试中显式调用夹具。