2017-10-04 144 views
0

我正在使用Django测试运行器来运行我的单元测试。其中一些测试使用工厂,在我的本地系统上创建文件的吨数。他们都有一个可检测的名字,并且可以很容易地被删除。Django/unittest在测试运行结束时运行命令

我试图避免要么

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

我写了一个小的管理命令,删除符合预期约定的文件。在完成整个测试套件(而不仅仅是在特定测试的tearDowntearDownClass方法中)时,是否有办法让测试运行器运行call_command

回答

0

所以我们落得这样做创建自定义的测试运行中添加以下行settings.py中:

TEST_RUNNER = 'myapp.test_runner.MyTestRunner' 

然后在测试运行中,我们从“teardown_test_environment”法中删除图像从我们现有的juno测试跑步者继承的一个测试跑步者。

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) 

这种方法在测试方法的拆解被调用,似乎是一个好地方,以确保它能够在年底调用一次,只有一次。

0

如果您在与models.py相同的文件夹中创建了services.py文件,则可以将清理代码放在那里,然后从管理命令和testDownDown中调用它,同时保持干燥。

0

也许你可以利用的方式Django的测试运行的订单试验(见https://docs.djangoproject.com/en/1.11/topics/testing/overview/#order-in-which-tests-are-executed

如果你的测试用例从Django的TestCase类继承,你可以创建一个虚拟清理测试用例直接继承unittest.TestCase生成。测试运行人员将最后执行,并且您可以在那里进行清理。

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

相关问题