我有一个类方法,它接受一个列表,并根据函数确定该列表是否有效。
我想在存储为静态变量的三个列表上测试它,因为它们稍后会在代码中的其他单元测试中使用。
def test__validate(self):
decoder = Validator()
slow_valid = Validator.validate(TestValidator.list_slow)
med_valid = Validator.validate(TestValidator.list_med)
fast_valid = Validator.validate(TestValidator.list_fast)
assert slow_valid == True
assert med_valid == False
assert fast_valid == False
删除多个断言语句的正确方法是什么?
我是否定义了test__validate
的多个版本,或者从最佳实践的角度来看,多个断言语句是否可以?
正如@IanShelvington所提出的,在输入(以及结果(发生变化的情况下进行重复测试的最佳实践是测试参数化。使用pytest
,您可以执行以下操作:
import pytest
@pytest.mark.parametrize("val_list, result",
[(TestValidator.list_slow, True),
(TestValidator.list_med, False),
(TestValidator.list_fast, False)])
def test_validate(val_list, result):
assert Validator().validate(val_list) == result
这会给你输出:
============================= test session starts =============================
...
collecting ... collected 3 items
param_result.py::test_validate[val_list0-True] PASSED [ 33%]
param_result.py::test_validate[val_list1-False] PASSED [ 66%]
param_result.py::test_validate[val_list2-False] PASSED [100%]
============================== 3 passed in 0.04s ==============================
正如您所看到的,这创建了3个单独的测试,名称中包含参数,因此可以很容易地识别失败的测试。
如果您想要所示测试的自定义名称,可以使用ids
:提供它们
@pytest.mark.parametrize("val_list, result",
[(TestValidator.list_slow, True),
(TestValidator.list_med, False),
(TestValidator.list_fast, False)],
ids=('slow', 'med', 'fast'))
...
这将输出:
============================= test session starts =============================
...
param_result.py::test_validate[slow] PASSED [ 33%]
param_result.py::test_validate[med] PASSED [ 66%]
param_result.py::test_validate[fast] PASSED [100%]
============================== 3 passed in 0.06s ==============================