在使用Python运行单元测试(大部分是集成测试)时,我创建了一些目录。它们需要在测试之后或测试失败时被删除。需要保证清理代码的执行。
pyfakefs)或者不是解决方案我的情况,因为我的单元测试通过subprocess.Popen调用外部工具(例如rsync)。另外,分离的基于ramfs的文件系统不是一个选项。unittest而不是pytest。我当前的解决方案是一个类,它将pathlib.Path实例作为成员保存,并在其__del__()方法中从文件系统中删除它。
#!/usr/bin/env python3
import unittest
import pathlib
import shutil
import time
class SelfDestructingPath:
def __init__(self, path):
print('init')
self._path = pathlib.Path(path)
self._path.mkdir()
def __del__(self):
shutil.rmtree(self._path)
print('del')
@property
def path(self):
return self._path
class MyTest(unittest.TestCase):
def test_foobar(self):
print('test start')
sdp = SelfDestructingPath('auto_delete')
self.assertTrue(sdp.path.exists())
time.sleep(5)
self.assertTrue(False)
print('test end')
if __name__ == '__main__':
unittest.main()这里的问题是是否有一个更优雅的解决方案。
我知道上下文管理器。但就我而言,我看不出他们有什么优势。我的解决方案确实为我节省了一个缩进,因为我不需要创建一个with块。在我的应用程序中,我大量使用该特性。
另一种选择是从pathlib.Path:class SelfDestructingPath(pathlib.Path)派生。但是我在某个地方读到,当您不知道自己在做什么时,从Python自己的包中派生通常不是一个好的选择。
有什么建议可以改善这种情况,还是让它更多地成为奏鸣曲?
发布于 2022-10-18 08:33:04
这是情景性的,但是如果它总是一个目录,并且没有太多目录,我会在setUp中创建目录,并在tearDown中清除它。如果有必要,可以使用路径作为参数创建基类。这样,您的测试方法就不会受到代码的污染,而不涉及测试本身。
还有,不管你选择什么方法。首先清理目录,然后再重新创建它。您的清理代码不能保证执行,您可能会以测试启动和目录不为空而结束。
发布于 2022-10-18 08:32:24
看来您已经重新发明了Python的tempfile.TemporaryDirectory类。您的版本略有不同,因为它不尊重用户的$TMPDIR (或等效的)。
这个实现似乎是合理的(除了它的夸夸其谈--我会删除那些print()调用)。
我建议您使用Python的TemporaryDirectory;它可以用作上下文管理器,可以手动清理,也可以等到垃圾收集完成才删除它,所以您比这个类具有更大的灵活性。
https://codereview.stackexchange.com/questions/280547
复制相似问题