Django/unittest 运行命令测试结束运行ner

Django/unittest run command at the end of the test runner

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

我正在努力避免

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

我写了一个小的管理命令来删除符合预期约定的文件。有没有一种方法可以在完成整个测试套件后对 运行ner 运行 call_command 进行测试(而不仅仅是在 tearDowntearDownClass特定测试的方法)?

如果您在与models.py相同的文件夹中创建一个services.py文件,您可以将清理代码放在那里,然后从管理命令和测试拆解中调用它,同时保留它干

您也许可以利用 django 测试运行器命令测试的方式(参见 https://docs.djangoproject.com/en/1.11/topics/testing/overview/#order-in-which-tests-are-executed

如果您的测试用例继承自 django 的 TestCase class,您可以创建一个直接继承自 unittest.TestCase 的虚拟清理测试用例。测试运行程序将最后执行,您可以在那里进行清理。

但是,如果 Django 开发人员决定更改测试顺序,这将会中断。

所以我们最终做的是通过将以下行添加到 settings.py 来创建自定义测试运行程序:

TEST_RUNNER = 'myapp.test_runner.MyTestRunner'

然后在测试运行器中,我们从继承自现有 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)

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