Django/unittest 在测试运行程序末尾运行命令

Rob*_*ley 2 python django unit-testing factory-boy python-unittest

我正在使用 Django 测试运行程序来运行我的单元测试。其中一些测试使用工厂在我的本地系统上创建大量文件。它们都有一个可检测的名称,并且可以相当容易地删除。

我试图避免

  1. 保持文件删除 cron 作业运行
  2. 如果检测到我们正在测试,请更改我的自定义图像模型的代码以删除该文件。相反,我希望在测试运行结束时运行一次(且仅一次)命令来清理测试生成的所有文件。

我编写了一个小型管理命令,用于删除符合预期约定的文件。有没有办法让测试运行程序call_command在完成整个测试套件后运行(而不仅仅是在特定测试的tearDown或方法中)?tearDownClass

Rob*_*ley 5

因此,我们最终要做的是通过将以下行添加到 settings.py 来创建自定义测试运行器:

TEST_RUNNER = 'myapp.test_runner.MyTestRunner'
Run Code Online (Sandbox Code Playgroud)

然后在测试运行程序中,我们从继承自现有 juno 测试运行程序的测试运行程序的“teardown_test_environment”方法中删除图像。

import os                                                                                  
import shutil

from django.conf import settings
from junorunner.testrunner import TestSuiteRunner


class MyTestRunner(TestSuiteRunner):

    def teardown_test_environment(self, *args, **kwargs):
        # Remove test-created media files
        if all([
            os.path.isdir(settings.MEDIA_ROOT),
            'test' in settings.MEDIA_ROOT,
        ]):
            shutil.rmtree(settings.MEDIA_ROOT)
        super(MyTestRunner, self).teardown_test_environment(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

该方法在测试方法的拆卸时被调用,并且似乎是确保它在最后被调用一次并且仅被调用一次的好地方。