将args传递给nose.runmodule()

时间:2014-05-17 14:06:38

标签: python argparse nose

我从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

失败并显示错误

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

我需要灵活地传递额外的选项,例如--processes, - process-timeout,而不必在解析器中指定它们。

有什么想法吗?谢谢你的阅读...

1 个答案:

答案 0 :(得分:1)

鼻子的第二个实例(你要求鼻子用--processes 2两个核心运行)不会评估__main__,因此你的浏览器变量永远不会被设置。您可以通过运行nosetests test.py来重现此错误。

如果您打算使用多处理插件,您可能需要投入一些时间并获得适当的插件,以便正确解析您的参数,类似于以下问题:Using nose plugin to pass a boolean to my package