我使用Django测试运行器来运行我的单元测试。其中一些测试使用工厂在我的本地系统上创建TONS文件。它们都有一个可检测的名称,可以很容易地删除。
我试图避免不得不
我写了一个小的管理命令,删除符合预期约定的文件。有没有办法让测试运行器在整个测试套件完成后运行call_command
(而不仅仅是在特定测试的tearDown
或tearDownClass
方法中)?
答案 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)
这个方法在拆除测试方法时被调用,并且似乎是确保在结束时调用一次并且只调用一次的好地方。