【问题标题】:Make running tests mandatory before runserver in django在 django 中的 runserver 之前强制运行测试
【发布时间】:2018-08-21 07:51:17
【问题描述】:

在 django 中运行服务器之前,有什么方法可以强制运行测试?我有一个项目,很多人都在做这个项目,所以我想在运行它之前强制进行测试,并且所有测试都必须在它运行之前通过。所以基本上锁定runserver命令,直到所有的测试都成功通过。 这种实施只会持续一段时间,不会持续很长时间。

【问题讨论】:

  • 他们是开发人员。当这第一次阻止他们做他们想做的事情时,他们会注释掉一行来绕过它。

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


【解决方案1】:

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

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

    你真正应该研究的是Continuous integration

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

    【讨论】:

    • 是的,我明白这一点,但它会在短时间内出现,而不是长期实施。
    • 在这种情况下,您可以制作一个快速的 bash 脚本,例如 ./manage.py test && ./manage.py runserver
    【解决方案3】:

    在模块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'])

    【讨论】:

      猜你喜欢
      • 2011-05-05
      • 1970-01-01
      • 2019-06-11
      • 2010-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      相关资源
      最近更新 更多