在 django 中运行服务器之前强制运行测试



在 django 中运行服务器之前,有没有办法强制运行测试?我有一个很多人将从事的项目,所以我想在运行它之前强制进行测试,并且在运行之前必须通过所有测试。所以基本上锁定运行服务器命令,直到所有测试成功通过。这种实现将只持续一段时间,而不是很长时间。

在模块manage.py中的函数main()execute_from_command_line(sys.argv)之前execute_from_command_line([sys.argv[0], 'test'])添加此行。它可以解决您的问题。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'])

我同意@LFDMR的观点,这可能是一个坏主意,会使你的开发过程非常低效。即使在测试驱动开发中,使用开发服务器也是完全明智的,例如,找出测试未通过的原因。我认为在您的版本控制系统中使用 Git 预提交或预推送钩子或等效物会更好。

话虽如此,以下是您实现所追求的目标的方法:

您可以通过向其中一个应用添加同名的管理命令来覆盖现有管理命令。

因此,您必须在其中一个应用程序中创建文件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) 

如果我是你团队中的开发人员,我要做的第一件事就是删除这个文件;)

根据我的经验,这将是一个糟糕的主意。

您真正应该研究的是持续集成

每当有人推送某些内容时,所有测试都应该运行,并且将向推送失败的用户发送电子邮件。

最新更新