将参数传递给nose.runmodule()

0 投票
1 回答
735 浏览
提问于 2025-04-18 06:51

我从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 来重现这个错误。

如果你打算使用多进程插件,你可能需要花一些时间来设置一个合适的插件,这样它才能正确解析你的参数,类似于这个问题:使用鼻子插件将布尔值传递给我的包

撰写回答