是否可以将命令行参数传递给 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/