我从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,而不必在解析器中指定它们。
有什么想法吗?谢谢你的阅读...
答案 0 :(得分:1)
鼻子的第二个实例(你要求鼻子用--processes 2
两个核心运行)不会评估__main__
,因此你的浏览器变量永远不会被设置。您可以通过运行nosetests test.py
来重现此错误。
如果您打算使用多处理插件,您可能需要投入一些时间并获得适当的插件,以便正确解析您的参数,类似于以下问题:Using nose plugin to pass a boolean to my package