Python 将参数传递给nose.runmodule()

Python 将参数传递给nose.runmodule(),python,argparse,nose,Python,Argparse,Nose,我从unittest切换到nose,以便能够指定并发处理和xunit报告生成。我的python文件包含几个测试函数和测试函数在测试期间调用的一个非测试函数。我知道测试应该自动化,在测试时不需要传入任何参数。但是,如果用户愿意,我希望用户能够更改默认值。因此,我使用argparse来解析参数。下面是测试脚本的示例。我没有在原始文件中包含其他几个测试函数 from selenium import webdriver from nose.tools import nottest from nose.t

我从unittest切换到nose,以便能够指定并发处理和xunit报告生成。我的python文件包含几个测试函数和测试函数在测试期间调用的一个非测试函数。我知道测试应该自动化,在测试时不需要传入任何参数。但是,如果用户愿意,我希望用户能够更改默认值。因此,我使用argparse来解析参数。下面是测试脚本的示例。我没有在原始文件中包含其他几个测试函数

from selenium import webdriver
from nose.tools import nottest
from nose.tools import assert_equals
import nose
import unittest
import argparse
import sys

@nottest
def open_browser():
    browser = eval('webdriver.%s()'%browserType)
    return browser

def test_google_title():
    browser = open_browser()
    browser.get("http://www.google.com")
    assert_equals("Google", browser.title)
    browser.quit()

def test_yahoo_title():
    browser = open_browser()
    browser.get("http://www.yahoo.com")
    assert_equals("Yahoo", browser.title)
    browser.quit()

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--browser", choices=['PhantomJS', 'Chrome'],default='PhantomJS')
    args, unknown = parser.parse_known_args()
    browserType = args.browser

    try:
        sys.argv.remove('--browser')
        sys.argv.remove(args.browser)
    except ValueError:
        pass

    nose.runmodule()
我将args.browser读入browserType,之后由open_browser()使用。当我跑步时

python test.py --browser 'Chrome' -v --with-xunit
python test.py --browser 'Chrome' -v --with-xunit --processes 2 --process-timeout 10
运行良好

但是我跑的时候,

python test.py --browser 'Chrome' -v --with-xunit
python test.py --browser 'Chrome' -v --with-xunit --processes 2 --process-timeout 10
它失败并出现错误

Traceback (most recent call last):
  File "/Users/indrajeet/.virtualenv/virtualenv/lib/python2.7/site-packages/nose/case.py", line 197, in runTest
    self.test(*self.arg)
  File "/Users/indrajeet/scripts/test.py", line 15, in test_google_title
    browser = open_browser()
  File "/Users/indrajeet/scripts/test.py", line 11, in open_browser
    browser = eval('webdriver.%s()'%browserType)
NameError: global name 'browserType' is not defined
我需要灵活地向nose传递额外的选项,比如--processs,-processtimeout,而不必在解析器中指定它们


有什么想法吗?感谢阅读…

nose的第二个实例(您要求nose使用两个内核运行,其中包含
--processs 2
)不会计算
\uuuuu main\uuuu
,因此您的浏览器变量永远不会被设置。您可以通过运行
nosetests test.py
来重现此错误


如果您打算使用多处理插件,您可能需要投入一些时间并安装适当的插件,以正确解析您的参数,类似于以下问题:

我认为您需要向我们提供错误堆栈。如果用一个简单的
environment='a'
语句替换
argparse
调用,会发生什么情况?@Indrajeet我会错过一些导入吗?请提供完整的例子。我错过了argparse,@非测试可能是
@nottest
,应该从
nose导入。工具
@hpaulj我已经用错误堆栈更新了我的问题。将argparse替换为静态分配浏览器不会改变任何内容。另外,我刚刚意识到,只有当我要求nose同时运行测试时,它才会抛出错误。@JanVlcinsky我用一个更新的示例更新了我的问题。因此,
nose
unittest
将被测试的函数与
\uu主命名空间隔离开来。