将参数传递给nose.runmodule()
我从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
我需要灵活性,可以传入额外的选项给nose,比如--processes和--process-timeout,而不需要在解析器中指定它们。
有什么想法吗?谢谢阅读...
1 个回答
1
你提到的第二个鼻子实例(你让鼻子用两个核心运行,使用了 --processes 2
)不会执行 __main__
这部分代码,所以你的浏览器变量就不会被设置。你可以通过运行 nosetests test.py
来重现这个错误。
如果你打算使用多进程插件,你可能需要花一些时间来设置一个合适的插件,这样它才能正确解析你的参数,类似于这个问题:使用鼻子插件将布尔值传递给我的包