Django/unittest在测试运行结束时运行命令
问题描述:
我正在使用Django测试运行器来运行我的单元测试。其中一些测试使用工厂,在我的本地系统上创建文件的吨数。他们都有一个可检测的名字,并且可以很容易地被删除。Django/unittest在测试运行结束时运行命令
我试图避免要么
- 保持一个文件删除cron作业运行
- 更改我的自定义图像模型的代码删除该文件,如果它检测到我们正在测试。相反,我想在测试运行结束时运行一次(并且只运行一次)命令,以清理测试生成的所有文件。
我写了一个小的管理命令,删除符合预期约定的文件。在完成整个测试套件(而不仅仅是在特定测试的tearDown
或tearDownClass
方法中)时,是否有办法让测试运行器运行call_command
?
答
所以我们落得这样做创建自定义的测试运行中添加以下行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)
这种方法在测试方法的拆解被调用,似乎是一个好地方,以确保它能够在年底调用一次,只有一次。
答
如果您在与models.py相同的文件夹中创建了services.py文件,则可以将清理代码放在那里,然后从管理命令和testDownDown中调用它,同时保持干燥。
答
也许你可以利用的方式Django的测试运行的订单试验(见https://docs.djangoproject.com/en/1.11/topics/testing/overview/#order-in-which-tests-are-executed)
如果你的测试用例从Django的TestCase类继承,你可以创建一个虚拟清理测试用例直接继承unittest.TestCase生成。测试运行人员将最后执行,并且您可以在那里进行清理。
但是,如果django开发者决定对测试排序进行更改,这将会中断。