dzh*_*lil 15 python nose command-line-arguments
我希望能够运行一个接受命令行参数的鼻子测试脚本.例如,有些事情:
test.py
import nose, sys
def test():
# do something with the command line arguments
print sys.argv
if __name__ == '__main__':
nose.runmodule()
Run Code Online (Sandbox Code Playgroud)
但是,每当我使用命令行参数运行它时,我都会收到错误:
$ python test.py arg
E
======================================================================
ERROR: Failure: ImportError (No module named arg)
----------------------------------------------------------------------
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 368, in loadTestsFromName
module = resolve_name(addr.module)
File "/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/site-packages/nose-0.11.1-py2.6.egg/nose/util.py", line 334, in resolve_name
module = __import__('.'.join(parts_copy))
ImportError: No module named arg
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (errors=1)
Run Code Online (Sandbox Code Playgroud)
显然,nose试图用sys.argv中传递的参数做一些事情.有没有办法让鼻子忽视这些论点?
Jas*_*ker 17
好吧,我讨厌"你为什么要那样做?" 答案和任何人一样,但我必须在这里做一个.我希望你不介意.
我认为做任何你想做的事都不在框架鼻子的范围内.鼻子用于自动化测试.如果必须传入命令行参数以使测试通过,那么它不会自动化.现在,你可以做的是这样的:
import sys
class test_something(object):
def setUp(self):
sys.argv[1] = 'arg'
del sys.argv[2] # remember that -s is in sys.argv[2], see below
def test_method(self):
print sys.argv
Run Code Online (Sandbox Code Playgroud)
如果你运行它,你会得到这个输出:
[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
Run Code Online (Sandbox Code Playgroud)
(如果你想看看stdout上发生了什么,请记住传入-s标志)
但是,我可能仍然建议不要这样做,因为如果你能避免它,那么在自动化测试中弄乱全局状态通常是个坏主意.我可能会做的是调整我想要测试的任何代码来获取argv列表.然后,您可以在测试期间传递任何您想要的内容并传入sys.argv生产中.
更新:
我需要这样做的原因是因为我正在测试同一个库的多个实现.为了测试这些实现是否正确,我使用单个鼻子脚本,它接受它应该导入用于测试的库作为命令行参数.
听起来你可能想尝试编写一个鼻子插件.这很容易做到. 这是最新的文档.
Bem*_*mis 11
您可以使用其他方法将内容添加到代码中:
import os
print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
Run Code Online (Sandbox Code Playgroud)
然后记住在运行鼻子之前设置你的环境.
我认为这是一个完全可以接受的方案.我还需要做类似的事情,以便针对不同的场景(dev,qa,prod等)运行测试,在那里我需要为每个环境提供正确的URL和配置.
我找到的解决方案是使用nose-testconfig插件(链接在这里).它不是完全传递命令行参数,而是创建包含所有参数的配置文件,然后在执行nose-tests时将此配置文件作为参数传递.
配置文件具有以下格式:
[group1]
env=qa
[urlConfig]
address=http://something
[dbConfig]
user=test
pass=test
Run Code Online (Sandbox Code Playgroud)
你可以使用以下方法阅读参数:
from testconfig import config
print(config['dbConfig']['user'])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19083 次 |
| 最近记录: |