Python,单元测试 - 将命令行参数传递给settest unittest.TestCase

问题描述:

我有一个脚本,充当使用Python unittest模块编写的单元测试的包装。除了清理一些文件,创建一个输出流,并产生一些代码,它加载测试案例到使用Python,单元测试 - 将命令行参数传递给settest unittest.TestCase

unittest.TestLoader().loadTestsFromTestCase() 

我已经使用optparse拉出用于确定输出几个命令行参数一套房位置,是否重新生成代码以及是否进行一些清理。我还想传递一个配置变量,即一个端点URI,以便在测试用例中使用。

我知道我可以添加一个OptionParser到的TestCase的设置方法,但我想的选项,而不是传递给setUp。这可能使用loadTestsFromTestCase()?我可以遍历返回的TestSuiteTestCases,但是我可以手动调用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为此,其运行方法以TestSuite作为参数。我假设它会自己运行setUp方法,所以我需要XMLTestRunner中的可用参数。

我希望这是有道理的。

嗯,我想做同样的事情,要问这个问题我自己。我想改善以下代码,因为它有重复。它让我在参数发送但是测试的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()) 
+0

这里有什么helppot? – SIslam 2016-03-13 14:50:22

+0

HelpSpot是UserScape的客户服务应用程序。我写了一个Python接口,它的API - https://github.com/JohnSpeno/python-helpspot – jps 2016-03-14 18:55:37

+0

对于这个工作类似于'unittest.main()'你应该加上'sys.exit(未result.wasSuccessful() )'结束。 – abergmeier 2017-04-11 08:48:37

我肯定会建议不要将参数传递给setUp, setUp意图在运行测试时被隐式调用,所以你不应该像这样明确地调用它。你能解决这个

的一种方法是设置您需要设置既可以作为环境变量或值在全球访问的“上下文”模块,这将允许在需要的测试用例来访问它们的值。我会去使用环境变量,因为它在运行测试方面更加灵活(您不再依赖命令行参数)。

+4

然后一些其他的代码依赖于具有相同名称的环境变量,太好了。 – GNUnit 2011-07-08 18:38:52

如果定义在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) 

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() 
+0

非常好。正是我在找什么。 – 2014-07-20 11:46:18

+1

II想添加'-i'选项,并用上面的代码......我通过'.. \ .. \ python的\ python的-m单元测试-v “test_activation.test_activation” -i “INPUT_FILE” 开始我的测试' 。为什么这会给我一个错误'test_activation.py:error:no such option:-m'? – Danijel 2014-11-17 14:53:14

+0

这不适合我。但是,以下行删除参数工作。 del sys.argv [1:] – Indrajeet 2015-08-04 20:07:07