首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当单元测试失败时清除目录和文件

当单元测试失败时清除目录和文件
EN

Code Review用户
提问于 2022-10-18 07:44:44
回答 2查看 711关注 0票数 4

在使用Python运行单元测试(大部分是集成测试)时,我创建了一些目录。它们需要在测试之后或测试失败时被删除。需要保证清理代码的执行。

  • 一个假的或虚拟的文件系统(例如pyfakefs)或者不是解决方案我的情况,因为我的单元测试通过subprocess.Popen调用外部工具(例如rsync)。另外,分离的基于ramfs的文件系统不是一个选项。
  • 我喜欢香草unittest而不是pytest
  • 目录需要有一个特定的名称。随机的名字是个问题。

我当前的解决方案是一个类,它将pathlib.Path实例作为成员保存,并在其__del__()方法中从文件系统中删除它。

代码语言:javascript
复制
#!/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.Pathclass SelfDestructingPath(pathlib.Path)派生。但是我在某个地方读到,当您不知道自己在做什么时,从Python自己的包中派生通常不是一个好的选择。

有什么建议可以改善这种情况,还是让它更多地成为奏鸣曲?

EN

回答 2

Code Review用户

发布于 2022-10-18 08:33:04

这是情景性的,但是如果它总是一个目录,并且没有太多目录,我会在setUp中创建目录,并在tearDown中清除它。如果有必要,可以使用路径作为参数创建基类。这样,您的测试方法就不会受到代码的污染,而不涉及测试本身。

还有,不管你选择什么方法。首先清理目录,然后再重新创建它。您的清理代码不能保证执行,您可能会以测试启动和目录不为空而结束。

票数 6
EN

Code Review用户

发布于 2022-10-18 08:32:24

看来您已经重新发明了Python的tempfile.TemporaryDirectory类。您的版本略有不同,因为它不尊重用户的$TMPDIR (或等效的)。

这个实现似乎是合理的(除了它的夸夸其谈--我会删除那些print()调用)。

我建议您使用Python的TemporaryDirectory;它可以用作上下文管理器,可以手动清理,也可以等到垃圾收集完成才删除它,所以您比这个类具有更大的灵活性。

票数 5
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/280547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档