【问题标题】:Django/unittest run command at the end of the test runner测试运行器结束时的 Django/unittest 运行命令
【发布时间】:2018-03-16 05:43:01
【问题描述】:
我正在使用 Django 测试运行程序来运行我的单元测试。其中一些测试使用在我的本地系统上创建大量文件的工厂。它们都有一个可检测的名称,并且可以相当容易地删除。
我尽量避免这样做
- 让删除文件的 cron 作业保持运行
- 如果它检测到我们正在测试,请更改我的自定义图像模型的代码以删除该文件。相反,我希望在测试运行结束时运行一次(且仅一次)命令,以清理测试生成的所有文件。
我写了一个小的管理命令来删除符合预期约定的文件。有没有办法让测试运行器在完成整个测试套件后运行call_command(而不仅仅是在特定测试的tearDown 或tearDownClass 方法中)?
【问题讨论】:
标签:
python
django
unit-testing
python-unittest
factory-boy
【解决方案1】:
所以我们最终要做的是通过在 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)
这个方法在测试方法被拆解时被调用,并且似乎是一个很好的地方来确保它在最后被调用一次,并且只被调用一次。
【解决方案2】:
如果您在与 models.py 相同的文件夹中创建一个 services.py 文件,您可以将清理代码放在那里,然后从管理命令和测试 tearDown 调用它,同时保持它 DRY。