带命令行参数的鼻子测试脚本

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生产中.

更新:

我需要这样做的原因是因为我正在测试同一个库的多个实现.为了测试这些实现是否正确,我使用单个鼻子脚本,它接受它应该导入用于测试的库作为命令行参数.

听起来你可能想尝试编写一个鼻子插件.这很容易做到. 这是最新的文档.

  • 请注意,传递额外上下文有很多充分的理由.考虑到测试启动Web服务器,您可能希望控制服务器运行的端口以避免与其他测试(或其他正在运行的程序)冲突. (7认同)

Bem*_*mis 11

您可以使用其他方法将内容添加到代码中:

import os

print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)
Run Code Online (Sandbox Code Playgroud)

然后记住在运行鼻子之前设置你的环境.


Thi*_*gos 7

我认为这是一个完全可以接受的方案.我还需要做类似的事情,以便针对不同的场景(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)