Python,单元测试-将命令行参数传递给unittest.TestCase的设置
我有一个脚本,它充当一些使用PythonPython,单元测试-将命令行参数传递给unittest.TestCase的设置,python,unit-testing,Python,Unit Testing,我有一个脚本,它充当一些使用Pythonunittest模块编写的单元测试的包装器。除了清理一些文件、创建输出流和生成一些代码外,它还使用 unittest.TestLoader().loadTestsFromTestCase() 我已经在使用optparse提取几个命令行参数,用于确定输出位置、是否重新生成代码以及是否进行一些清理。我还想传递一个配置变量,即端点URI,以便在测试用例中使用 我意识到我可以在TestCase的setUp方法中添加一个OptionParser,但是我想把这个选项
unittest
模块编写的单元测试的包装器。除了清理一些文件、创建输出流和生成一些代码外,它还使用
unittest.TestLoader().loadTestsFromTestCase()
我已经在使用optparse
提取几个命令行参数,用于确定输出位置、是否重新生成代码以及是否进行一些清理。我还想传递一个配置变量,即端点URI,以便在测试用例中使用
我意识到我可以在TestCase的setUp方法中添加一个OptionParser
,但是我想把这个选项传递给setUp
。使用loadTestsFromTestCase()
是否可以实现这一点?我可以迭代返回的TestSuite
的TestCases
,但是我可以手动调用TestCases
上的setUp吗
**编辑**
我想指出,如果我迭代测试并手动调用setUp
,我可以将参数传递给setUp
,如:
(options, args) = op.parse_args()
suite = unittest.TestLoader().loadTestsFromTestCase(MyTests.TestSOAPFunctions)
for test in suite:
test.setUp(options.soap_uri)
但是,我使用了
xmlrunner
,它的run方法将TestSuite
作为参数。我假设它将运行setUp方法本身,因此我需要XMLTestRunner
中可用的参数,我建议不要像这样向setUp传递参数;安装程序是在运行测试时隐式调用的,所以您不应该像这样显式调用它
解决这个问题的一种方法是将需要设置的值设置为环境变量或全局可访问的“上下文”模块中的值,这将允许测试用例根据需要访问它们。我会选择使用环境变量,因为它在运行测试方面更加灵活(您不再依赖命令行参数)。好吧,我也想做同样的事情,我自己也会问这个问题。我想改进下面的代码,因为它有重复。它确实允许我向TestCase发送参数,但是:
import unittest
import helpspot
class TestHelpSpot(unittest.TestCase):
"A few simple tests for HelpSpot"
def __init__(self, testname, path, user, pword):
super(TestHelpSpot, self).__init__(testname)
self.hs = helpspot.HelpSpot(path, user, pword)
def test_version(self):
a = self.hs.version()
b = self.hs.private_version()
self.assertEqual(a, b)
def test_get_with_param(self):
a = self.hs.filter_get(xFilter=1)
def test_unknown_method(self):
self.assertRaises(helpspot.HelpSpotError, self.hs.private_wuggienorple)
if __name__ == '__main__':
import sys
user = sys.argv[1]
pword = sys.argv[2]
path = sys.argv[3]
test_loader = unittest.TestLoader()
test_names = test_loader.getTestCaseNames(TestHelpSpot)
suite = unittest.TestSuite()
for test_name in test_names:
suite.addTest(TestHelpSpot(test_name, path, user, pword))
result = unittest.TextTestRunner().run(suite)
sys.exit(not result.wasSuccessful())
如果在init方法中定义属性,则可以像下面这样将它们全部传递到构造函数中
import unittest
import helpspot
class TestHelpSpot(unittest.TestCase):
"A few simple tests for HelpSpot"
def __init__(self, testname, path, user, pword):
super(TestHelpSpot, self).__init__(testname)
self.path = path
self.user = user
self.pword = pword
....
....
....
if __name__ == '__main__':
True
suite = unittest.TestSuite()
suite.addTest(TestHelpSpot("test_version", path, user, pword))
unittest.TextTestRunner().run(suite)
然后其他一些代码依赖于同名的环境变量,很好,非常好。正是我要找的。我想添加
-I
选项,并使用上面的代码。。。我通过。\..\python\python-m unittest-v“test\u activation.test\u activation”-I“input\u file”
启动测试。为什么这会给我一个错误test\u activation.py:error:没有这样的选项:-m
?这对我不起作用。但是,下面的删除args行起作用了。del sys.argv[1:]这里的helpspot是什么?helpspot是来自UserScape的客户服务应用程序。我为它的API编写了一个Python接口——为了让它类似于unittest.main()
,应该在末尾添加sys.exit(而不是result.wassuctive())
。
if __name__ == '__main__':
from optparse import OptionParser
parser = OptionParser()
parser.add_option("-z", "--zebra",
action="store_true", dest="zebra", default=False,
help="run like a zebra")
(options, args) = parser.parse_args()
if options.zebra:
zebrafy()
# remove our args because we don't want to send them to unittest
for x in sum([h._long_opts+h._short_opts for h in parser.option_list],[]):
if x in sys.argv:
sys.argv.remove(x)
unittest.main()