python - 我什么时候应该创建多个测试函数,我应该为全局变量使用 pytest fixtures?

标签 python unit-testing pytest

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

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

我想创建一个元组列表,我可以将其传递给参数化。每个元组将包括原始列表、已删除项目的列表和剩余项目的列表。与其为参数化创建元组列表作为全局变量,不如为此使用固定装置会更好吗?

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

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

还是编写一个函数并在同一个函数中测试这两个东西更好?

最佳答案

就个人而言,我很喜欢每个测试用例都有一个测试函数。如果您要测试不同的东西,我倾向于将它们分开。那是因为当测试失败时,我想知道什么功能坏了,而不仅仅是一个大的测试函数失败了。这通常会加快恢复工作的周期时间。

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

至于global or not part的问题,我一般只是匿名罗列,而不做任何变量。但是,底部的链接使用了变量。

作为引用,这里有一个创建 9 个测试的示例,同时使用函数的参数化和 fixture 的参数参数:

@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

至于什么是 fixture ,什么不是 fixture ,这是一个可能被广泛争论的难题。我建议制作不同选项的原型(prototype)并进行比较。

关于python - 我什么时候应该创建多个测试函数,我应该为全局变量使用 pytest fixtures?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34879792/

相关文章:

python - 如何从给定的一组单词中打印出最长和最短的单词?

python - 使用 Python 的 optparse 模块时如何遵守 PEP 257 文档字符串?

python - 用于测试和开发的模拟 python http 请求

unit-testing - Nunit 中的经典和约束模型断言有什么区别?

python - 使用 pytest fixture 下载一次数据,但每次测试都使用新副本

python - Pytest:使用 python 线程在程序中模拟/修补 sys.stdin

python - Scrapy - 发送新请求/使用回调

python - 具有版本控制的 HDF5 文件 (h5py) - 每次保存时都会更改哈希值

c# - 单元测试内部列表<String>

python - Pytest:需要缓慢初始化的参数化测试