我什么时候应该创建多个测试函数,我应该为全局变量使用 pytest fixtures?
When should I create multiple test functions and should I use pytest fixtures for global variables?
我有一种方法可以根据正则表达式过滤数据。我有多个函数,每个函数 return 一个正则表达式列表,我将它们组合成一个正则表达式字符串。然后我遍历我的数据列表,如果任何数据与组合字符串匹配,我从我的数据列表中删除该项目。
我想测试一下,当函数针对一组数据运行时,已过滤的项目被删除并且 non_filtered 项目未被删除。我想测试这个数据是否匹配我的来自上述函数的每组正则表达式。
我想创建一个元组列表,我可以将其传递给参数化。每个元组将包括原始列表、已删除项目的列表和剩余项目的列表。与其为参数化创建元组列表作为全局变量,不如为此使用固定装置更好?
此外,编写单独的函数来检查不同的行为是否更好?如:
test that the function removes matched items
test that the function does not remove unmatched items
还是编写一个函数并在同一个函数中测试这两个东西更好?
就个人而言,我喜欢每个测试用例一个测试函数。如果您要测试不同的东西,我倾向于将它们分开。那是因为当测试失败时,我想知道 什么功能损坏了 而不仅仅是一个大的测试功能失败了。这通常会加快恢复工作的周期时间。
如果及时设置,这可能会变得很麻烦,但我认为这更多的是单元测试应该有更好隔离的标志,例如使用 in-memory 数据库或在 [=29 上操作=] 对象而不是文件等..
至于global or not part的问题,我一般都是匿名罗列,而不做变量。但是,底部的 link 使用变量。
作为参考,这里有一个创建 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
至于什么应该是夹具,什么不是夹具,这是一个可能被广泛争论的难题。我建议对不同的选项进行原型设计并进行比较。
我有一种方法可以根据正则表达式过滤数据。我有多个函数,每个函数 return 一个正则表达式列表,我将它们组合成一个正则表达式字符串。然后我遍历我的数据列表,如果任何数据与组合字符串匹配,我从我的数据列表中删除该项目。
我想测试一下,当函数针对一组数据运行时,已过滤的项目被删除并且 non_filtered 项目未被删除。我想测试这个数据是否匹配我的来自上述函数的每组正则表达式。
我想创建一个元组列表,我可以将其传递给参数化。每个元组将包括原始列表、已删除项目的列表和剩余项目的列表。与其为参数化创建元组列表作为全局变量,不如为此使用固定装置更好?
此外,编写单独的函数来检查不同的行为是否更好?如:
test that the function removes matched items
test that the function does not remove unmatched items
还是编写一个函数并在同一个函数中测试这两个东西更好?
就个人而言,我喜欢每个测试用例一个测试函数。如果您要测试不同的东西,我倾向于将它们分开。那是因为当测试失败时,我想知道 什么功能损坏了 而不仅仅是一个大的测试功能失败了。这通常会加快恢复工作的周期时间。
如果及时设置,这可能会变得很麻烦,但我认为这更多的是单元测试应该有更好隔离的标志,例如使用 in-memory 数据库或在 [=29 上操作=] 对象而不是文件等..
至于global or not part的问题,我一般都是匿名罗列,而不做变量。但是,底部的 link 使用变量。
作为参考,这里有一个创建 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
至于什么应该是夹具,什么不是夹具,这是一个可能被广泛争论的难题。我建议对不同的选项进行原型设计并进行比较。