Django 管理.py : Is it possible to pass command line argument (for unit testing)

标签 django django-testing django-manage.py

是否可以将命令行参数传递给 Django 的 manage.py 脚本,特别是用于单元测试?即如果我做类似的事情

manage.py test myapp -a do_this

我可以在单元测试的setUp函数中接收值do_this吗?

P.S. @Martin 询问在测试中使用命令行参数的理由:

  • 一些广泛的测试需要花费大量时间,并且不需要在每次提交之前运行。我想让它们成为可选的。

  • 我的测试用例偶尔打印的调试消息应该是可选的

  • 有时我只是想让测试变得疯狂并尝试更多的数据排列。

使用命令行选项,上述所有内容都会非常方便。有时测试可能会更加广泛或冗长,否则会很快。

最佳答案

我自己也遇到了这个问题,我想避免在命令行上设置环境变量。环境变量当然有效,但很难跟踪哪些变量会产生影响,而且如果您输错了其中一个变量,也不会出现任何错误消息来通知您。

为了解决这个问题,我使用了 argparse 来提取命令行参数的额外参数。例如,我的 manage.py 文件现在看起来像这样:

#!/usr/bin/env python
import os
import sys
import argparse


if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "project.settings")

    argv = sys.argv
    cmd = argv[1] if len(argv) > 1 else None
    if cmd in ['test']:  # limit the extra arguments to certain commands
        parser = argparse.ArgumentParser(add_help=False)
        parser.add_argument('--foo', default='bar')
        args, argv = parser.parse_known_args(argv)
        # We can save the argument as an environmental variable, in
        # which case it's to retrieve from within `project.settings`,
        os.environ['FOO'] = args.foo
        # or we can save the variable to settings directly if it
        # won't otherwise be overridden.
        from django.conf import settings
        settings.foo = args.foo

    from django.core.management import execute_from_command_line

    # parse_known_args strips the extra arguments from argv,
    # so we can safely pass it to Django.
    execute_from_command_line(argv)

argparse 是一个非常好的库,具有很多功能。有一个很好的tutorial Python 文档中对此进行了介绍。

关于Django 管理.py : Is it possible to pass command line argument (for unit testing),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28229864/

相关文章:

python - 探戈与 Django - Django 2.0

Django如何为电子邮件激活链接生成自动激活 key

python - Django依赖: hmac?

mysql - 如何从我的 django 网站连接到集中式 MySQL 数据库?

django - S3Boto存储和单元测试

django - 选择测试数据库?

python - Pycharm打不开manage.py任务

django - Django manage.py:迁移在依赖之前应用

python - 将代码推送到 Jenkins 时随机测试失败

python - Django 管理服务器在 127.0.0.1 :<port>/admin/URL is hit 时关闭