测试一个函数,使用多个测试用例但只使用一个断言?

Sta*_*tec 3 python pytest python-3.x

我有一个类方法,它接受一个列表并根据函数确定该列表是否有效。

我想在存储为静态变量的三个列表上测试它,因为它们稍后在代码中的其他单元测试中使用。

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
Run Code Online (Sandbox Code Playgroud)

删除多个断言语句的正确方法是什么?

我是否定义了多个版本,test__validate或者从最佳实践的角度来看,多个断言语句是否可以?

MrB*_*men 7

正如 @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
Run Code Online (Sandbox Code Playgroud)

这将为您提供输出:

============================= 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 ==============================
Run Code Online (Sandbox Code Playgroud)

如您所见,这将创建 3 个独立的测试,名称中包含参数,因此可以轻松识别失败的测试。

如果您想要显示的测试的自定义名称,您可以使用以下方式提供它们ids

@pytest.mark.parametrize("val_list, result",
                         [(TestValidator.list_slow, True),
                          (TestValidator.list_med, False),
                          (TestValidator.list_fast, False)],
                         ids=('slow', 'med', 'fast'))
...
Run Code Online (Sandbox Code Playgroud)

这将输出:

============================= 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 ==============================
Run Code Online (Sandbox Code Playgroud)