我应该何时创建多个测试函数,是否应该将pytest fixture用于全局变量?

时间:2016-01-19 14:48:28

标签: python unit-testing pytest

我有一种方法可以根据正则表达式对数据进行一些过滤。我有多个函数,每个函数都返回一个正则表达式列表,我将它组合成一个正则表达式字符串。然后迭代我的数据列表,如果任何数据与组合字符串匹配,我从我的数据列表中删除该项。

我想测试当函数针对一组数据运行时,过滤后的项目将被删除,并且未删除未过滤的项目。我想测试这个数据,以匹配来自上述函数的每组正则表达式。

我考虑过创建一个可以传递给参数化的元组列表。每个元组都包括原始列表,已删除项目列表以及剩余项目列表。而不是为参数化创建这个元组列表作为全局变量,为此使用夹具会更好吗?

另外,编写单独的函数来检查不同的行为是否更好?如:

test that the function removes matched items
test that the function does not remove unmatched items

或者编写一个函数并在同一函数中测试这两个函数是否更好?

1 个答案:

答案 0 :(得分:3)

就个人而言,我是每个测试用例的测试功能的粉丝。如果您正在测试不同的东西,我倾向于将它们分开。那是因为当测试失败时,我想知道什么功能破坏而不仅仅是一个大的测试功能失败了。这通常会加快周期时间,使事情恢复正常。

如果有及时的设置,这可能变得很麻烦,但我认为这更多地表明单元测试应该有更好的隔离,例如使用内存数据库或操作类文件对象而不是文件等等。

至于全局或不是问题的一部分,我通常只是匿名列出它们而不是制作任何变量。但是,底部的链接使用变量。

这里的参考是一个创建9个测试的例子,使用函数的参数化和灯具的参数参数:

@pytest.fixture(params=[1, 2, 3])
def number(request):
    return request.param

@pytest.mark.parametrize('letter', ['a', 'b', 'c'])
def test_combinations(number, letter):
    pass  # test assertions, etc.

如果您认为它看起来更整洁,那么就去做吧!毕竟,它只是测试模块...

有一些官方的例子: https://docs.pytest.org/en/latest/fixture.html#fixture-parametrize

至于应该是什么,这是一个很难被广泛争论的难题。我建议对不同的选项进行原型设计并进行比较。