Команда запуска Django/unittest в конце запуска теста

Я использую средство запуска тестов Django для запуска своих модульных тестов. Некоторые из этих тестов используют фабрики, которые создают ТОННЫ файлов в моей локальной системе. Все они имеют обнаруживаемое имя и могут быть легко удалены.

Я пытаюсь избежать

  1. Продолжайте выполнять задание cron по удалению файлов
  2. Измените код моей пользовательской модели изображения, чтобы удалить файл, если он обнаружит, что мы тестируем. Вместо этого я хотел бы, чтобы команда выполнялась один раз (и только один раз) в конце тестового прогона, чтобы очистить все файлы, созданные тестами.

Я написал небольшую команду управления, которая удаляет файлы, соответствующие предполагаемому соглашению. Есть ли способ запустить средство запуска тестов call_command после завершения всего набора тестов (а не только в методах tearDown или tearDownClass конкретного теста)?


person Robert Townley    schedule 04.10.2017    source источник


Ответы (3)


Итак, в итоге мы создали собственный тест-раннер, добавив следующую строку в 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)

Этот метод вызывается при демонтаже тестового метода и, по-видимому, является хорошим местом для обеспечения того, чтобы он вызывался один раз в конце и только один раз.

person Robert Townley    schedule 30.11.2017

Если вы создадите файл services.py в той же папке, что и models.py, вы можете поместить туда код очистки, а затем вызвать его из команды управления и из теста tearDown, сохраняя его СУХИМ.

person Jeff C Johnson    schedule 04.10.2017

Возможно, вы могли бы использовать способ, которым средство запуска тестов django упорядочивает тесты (см. -executed" rel="nofollow noreferrer">https://docs.djangoproject.com/en/1.11/topics/testing/overview/#order-in-what-tests-are-executed)

Если ваши тестовые примеры наследуются от класса TestCase django, вы можете создать фиктивный тестовый пример очистки, наследующий непосредственно от unittest.TestCase. Средство запуска тестов выполнит его последним, и вы сможете выполнить свою очистку там.

Однако это сломается, если разработчики django решат внести изменения в порядок тестов.

person spin    schedule 05.10.2017