Есть ли способ сделать запуск тестов обязательным перед запуском сервера в django? У меня есть проект, над которым будут работать многие люди, поэтому я хочу сделать тестирование обязательным перед его запуском, и все тесты должны пройти перед его запуском. Поэтому в основном блокируйте команду runserver, пока все тесты не пройдут успешно. Эта реализация продлится некоторое время, а не долго.

1
Abhinav Agnihotry 21 Авг 2018 в 10:51

3 ответа

Лучший ответ

Я согласен с @LFDMR, что это, вероятно, плохая идея и сделает ваш процесс разработки действительно неэффективным. Даже в случае разработки через тестирование совершенно разумно использовать сервер разработки, например, чтобы выяснить, почему ваши тесты не проходят. Я думаю, что вам лучше использовать Git pre-commit или pre-push hook или аналог в вашей системе контроля версий.

Это, как говорится, вот как вы можете достичь того, что вы после:

Вы можете перезаписать существующую команду управления, добавив команду управления с тем же именем в одно из ваших приложений.

Поэтому вам нужно создать файл management/commands/runserver.py в одном из ваших приложений, который выглядит следующим образом:

from django.core import management
from django.core.management.commands.runserver import BaseRunserverCommand


class Command(BaseRunserverCommand):

    def handle(self, *args, **kwargs):
         call_command('test')  # calls `sys.exit(1)` on test failure
         super().handle(*args, **kwargs) 

Если бы я был разработчиком в вашей команде, первым делом я бы удалил этот файл;)

0
Daniel Hepper 21 Авг 2018 в 11:18

По моему опыту это будет ужасная идея.

Что вы действительно должны изучить, так это Непрерывная интеграция

Когда кто-то что-то нажимает, все тесты должны выполняться, и пользователю, который нажал, будет отправлено электронное письмо, если что-то не получится.

0
LFDMR 21 Авг 2018 в 07:59

Добавьте эту строку execute_from_command_line([sys.argv[0], 'test']) перед execute_from_command_line(sys.argv) в функции main() в модуле manage.py. Это может решить вашу проблему. main() будет выглядеть так:

def main():
    # settings, import execute_from_command_line in 'try except' block
    if (os.environ.get('RUN_MAIN') != 'true') & (sys.argv[1] == 'runserver'): # just run once when execute command 'manage.py runserver' but not other commands
        execute_from_command_line([sys.argv[0], 'test']) # run ALL the test first
    execute_from_command_line(sys.argv)

Или вы можете указать модуль для тестирования: execute_from_command_line([sys.argv[0], 'test', 'specific_module']) или с шаблоном файла: execute_from_command_line([sys.argv[0], 'test', '--pattern=tests*.py'])

0
Phong Bui 6 Апр 2020 в 11:34
51944034