2013-06-23 38 views
10

我想遍历项目列表,并在每个项目上运行断言。一个例子可能是检查列表中的每个数字是否是奇数。使用参数实例化Python unittest.TestCase

TestCase

class TestOdd(unittest.TestCase): 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(NUMBER %2==1, "Number should be odd") 

测试suite

if __name__ == '__main__': 
    suite = unittest.TestSuite() 
    suite.addTest(TestOdd()) 
    # I would like to have: 
    # suite.addTest(TestOdd(1)) 
    # suite.addTest(TestOdd(2)) 
    # suite.addTest(TestOdd(3)) 
    # ... 
    unittest.main() 

我如何实例化一个对象TestOdd用一个参数 - 例如,要测试多少?

更新:根据2011年的博客文章(发布为答案),没有内置的参数化测试机制。我会很乐意接受任何更清洁的解决方案。

+0

参见://codereview.stackexchange:(HTTP [从类访问argparse参数。 com/q/88655/15346) – kenorb

回答

4

可以使用类属性实现相同。

class TestOdd1(unittest.TestCase): 
    NUMBER=1 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd2(TestOdd1): 
    NUMBER=2 

if __name__ == '__main__': 
    unittest.main() 

的单元测试会自动发现它们,所以没有必要建立一个套件。

如果你想避免使用基类一个TestCase,您可以使用多重继承:

from unittest import TestCase, main 

class TestOdd: 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd1(TestOdd, TestCase): 
    NUMBER=1 
class TestOdd2(TestOdd, TestCase): 
    NUMBER=2 

if __name__ == '__main__': 
    main() 
9

据“Python unit testing: parametrized test cases”,发表于礼Bendersky的博客:

Python的标准单元测试库是伟大的,我用它所有的时间。 然而,它缺少的一件事是运行 参数化测试用例的简单方法。换句话说,你不能轻易地将 参数从外部传入unittest.TestCase。

Eli的解决方案是继承unittest.TestCaseParametrizedTestCase。我不确定版权问题,所以我不会在这里复制粘贴代码。

如果有更好的解决方案,我会很乐意接受它。