测试运行结束时的Django / unittest运行命令

时间:2017-10-04 18:11:29

标签: python django unit-testing python-unittest factory-boy

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

我试图避免不得不

  1. 保持文件删除cron作业正在运行
  2. 如果检测到我们正在测试,请更改我的自定义图像模型代码以删除该文件。相反,我希望在测试运行结束时运行一次命令(并且只运行一次)以清理测试生成的所有文件。
  3. 我写了一个小的管理命令,删除符合预期约定的文件。有没有办法让测试运行器在整个测试套件完成后运行call_command(而不仅仅是在特定测试的tearDowntearDownClass方法中)?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

如果您的测试用例继承自django的TestCase类,您可以创建一个直接从unittest.TestCase继承的虚拟清理测试用例。测试运行器会执行最后一次,你可以在那里进行清理。

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

答案 2 :(得分:0)

所以我们最终做的是通过将以下行添加到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)

这个方法在拆除测试方法时被调用,并且似乎是确保在结束时调用一次并且只调用一次的好地方。