在django中的runserver之前强制执行运行测试

时间:2018-08-21 07:51:18

标签: django python-3.x unit-testing testing django-rest-framework

在Django中运行服务器之前,是否有任何方法可以强制运行测试?我有一个项目,很多人将在该项目上进行,因此我想在运行之前强制进行测试,并且所有测试必须在运行之前通过。因此,基本上锁定runserver命令,直到所有测试成功通过为止。 此实施过程将持续一段时间,不会持续很长时间。

3 个答案:

答案 0 :(得分:0)

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

您真正应该研究的是Continuous integration

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

答案 1 :(得分:0)

我同意@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) 

如果我是您团队中的开发人员,那么我要做的第一件事就是删除该文件;)

答案 2 :(得分:0)

在模块execute_from_command_line([sys.argv[0], 'test'])的功能execute_from_command_line(sys.argv)main()的{​​{1}}之前添加此行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'])