Есть ли способ сделать запуск тестов обязательным перед запуском сервера в django? У меня есть проект, над которым будут работать многие люди, поэтому я хочу сделать тестирование обязательным перед его запуском, и все тесты должны пройти перед его запуском. Поэтому в основном блокируйте команду runserver, пока все тесты не пройдут успешно. Эта реализация продлится некоторое время, а не долго.
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)
Если бы я был разработчиком в вашей команде, первым делом я бы удалил этот файл;)
По моему опыту это будет ужасная идея.
Что вы действительно должны изучить, так это Непрерывная интеграция
Когда кто-то что-то нажимает, все тесты должны выполняться, и пользователю, который нажал, будет отправлено электронное письмо, если что-то не получится.
Добавьте эту строку 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'])
Похожие вопросы
Новые вопросы
django
Django - это фреймворк на стороне сервера с открытым исходным кодом, написанный на Python. Он предназначен для уменьшения усилий, необходимых для создания сложных управляемых данными веб-сайтов и веб-приложений, с особым акцентом на меньший объем кода, отсутствие избыточности и более явный, чем неявный.