带有命令行参数的Nose测试脚本

2024-04-25 05:48:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够运行一个接受命令行参数的nose测试脚本。例如,大致如下:

测试.py

import nose, sys

def test():
    # do something with the command line arguments
    print sys.argv

if __name__ == '__main__':
    nose.runmodule()

但是,每当我使用命令行参数运行此命令时,都会得到一个错误:

$ 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)

显然,nose试图处理sys.argv中传递的参数。有没有办法让鼻子忽略这些论点?


Tags: nonameinpytestimport参数sys
3条回答

你可以用另一种方法把东西输入你的代码:

import os

print os.getenv('KEY_THAT_MIGHT_EXIST', default_value)

那就记住在流鼻涕之前要先设定好你的环境。

我认为这是完全可以接受的情况。为了针对不同的场景(dev、qa、prod等)运行测试,我还需要做一些类似的事情,在那里,我需要为每个环境提供正确的url和配置。

我找到的解决方案是使用nose testconfig插件(link here)。它并不完全传递命令行参数,而是创建一个包含所有参数的配置文件,然后在执行nose测试时将此配置文件作为参数传递。

配置文件的格式如下:

[group1]
env=qa

[urlConfig]
address=http://something

[dbConfig]
user=test
pass=test

您可以使用以下命令读取参数:

from testconfig import config

print(config['dbConfig']['user'])

好吧,我讨厌“你为什么要那样做?”答案和其他人一样多,但我得在这里做一个。我希望你不介意。

我认为做任何你想做的事都不在框架鼻子的范围之内。Nose用于自动化测试。如果必须传入命令行参数才能通过测试,则测试不会自动进行。现在,你可以这样做:

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

如果运行该命令,将得到以下输出:

[~] nosetests test_something.py -s
['/usr/local/bin/nosetests', 'arg']
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

(如果您想查看stdout上的内容,请记住传入-s标志)

不过,我还是建议不要这样做,因为如果可以避免的话,在自动化测试中处理全局状态通常是个坏主意。我可能要做的是调整我想测试的任何代码,以获得一个argv列表。然后,您可以在测试期间传入所需的任何内容,并在生产中传入sys.argv

更新

The reason why I need to do it is because I am testing multiple implementations of the same library. To test those implementations are correct I use a single nose script, that accepts as a command line argument the library that it should import for testing.

听起来你可能想试着写一个鼻子插件。这很容易做。Here are the latest docs.

相关问题 更多 >