tl;dr - 我想编写一个Python unittest
函数,该函数将删除文件,运行测试,然后恢复文件。这会导致竞争条件,因为unittest
会并行运行多个测试,删除和创建一个测试的文件会破坏同时进行的其他测试。
具体示例:
我有一个名为converter.py
的Python模块,并且在test_converter.py
中有相关的测试。如果与converter.py
相同目录下有名为config_custom.csv
的文件,则会使用自定义配置。如果没有自定义CSV配置文件,则内置在converter.py
中有一个默认配置。
我使用Python 2.7标准库中的unittest
编写了一个单元测试来验证此行为。在setUp()
中的单元测试将把config_custom.csv
重命名为wrong_name.csv
,然后运行测试(希望使用默认配置),然后在tearDown()
中它会将文件重命名回原本的名称。
问题: Python单元测试并行运行,我遇到了可怕的竞态条件。文件config_custom.csv
会以不确定的方式在其他单元测试中被重命名。这至少会导致90%的时间中出现一个错误或失败。
理想的解决方法是告诉unittest
:不要与其他测试并行运行此测试,这个测试很特殊,并需要完全隔离。
我的解决方法是向搜索配置文件的函数添加一个可选参数。测试套件才传递该参数。它忽略文件而不删除它。实际上删除测试文件更为优雅,这正是我要测试的内容。
@serial
装饰器,所以谢谢你。关于单一职责原则:我觉得我已经很好地遵守了它。converter.py
只是一个文件,但有多个函数(不是太多)。其中一个函数是load_config()
,它只有一个职责。如果它找到配置文件,它就会加载它,否则它就会使用默认值。实际上它不需要任何参数,但我添加了load_config(use_defaults=False)
,并且仅在单元测试期间传递True
,这正是你建议的。但这并不是最佳选择。 - SerMetAlaconverter.py
的源代码变得更加复杂了。我刚刚向converter.py
添加了一个功能,但实际上没有人会使用它,只有单元测试会使用它。这就是属于测试而不是代码本身的定义。其次:如果所有测试都通过了,但实际上找不到文件导致了严重崩溃怎么办?单元测试将无法发现这个问题。单元测试将通过。如果os.listdir()
发生了变化并出现了回归,我将看不到它。 - SerMetAla