2016-12-14 41 views
0

我試圖使用load_tests protocol來參數化一些測試用例。這裏是我的MCVE:load_tests()未在unittests中調用

# mytests.py 
import unittest 

class MyTests(unittest.TestCase): 
    def __init__(self, x, y): 
    super(MyTests, self).__init__("testMyMethod") 
    self.x = x 
    self. y = y 

    def testMyMethod(self): 
    self.assertEqual(self.y, my_method(self.x)) 

def load_tests(loader, tests, pattern): 
    print("load_tests()") 
    foobar = zip(range(5), range(5)) 
    test_suite = unittest.TestSuite() 
    for x, y in foobar: 
    test_suite.addTest(MyTests(x, y)) 
    return test_suite 

def my_method(x): 
    return x 

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

當我運行此我得到以下輸出:

myrdraal% python mytests.py 
Traceback (most recent call last): 
    File "mytests.py", line 24, in <module> 
    unittest.main() 
    File "/usr/lib/python3.5/unittest/main.py", line 93, in __init__ 
    self.parseArgs(argv) 
    File "/usr/lib/python3.5/unittest/main.py", line 140, in parseArgs 
    self.createTests() 
    File "/usr/lib/python3.5/unittest/main.py", line 144, in createTests 
    self.test = self.testLoader.loadTestsFromModule(self.module) 
    File "/usr/lib/python3.5/unittest/loader.py", line 123, in loadTestsFromModule 
    tests.append(self.loadTestsFromTestCase(obj)) 
    File "/usr/lib/python3.5/unittest/loader.py", line 92, in loadTestsFromTestCase 
    loaded_suite = self.suiteClass(map(testCaseClass, testCaseNames)) 
    File "/usr/lib/python3.5/unittest/suite.py", line 24, in __init__ 
    self.addTests(tests) 
    File "/usr/lib/python3.5/unittest/suite.py", line 57, in addTests 
    for test in tests: 
TypeError: __init__() missing 1 required positional argument: 'y' 

看來,我load_tests()甚至沒有被調用。我究竟做錯了什麼?

類似MCVE運行到就好了:

# parameterized.py 
import unittest 

class ParameterizedTest(unittest.TestCase): 
    def __init__(self, value): 
    super(ParameterizedTest, self).__init__("test") 
    self.value = value 

    def test(self): 
    self.assertEqual(self.value, self.value) 

def load_tests(loader, tests, pattern): 
    test_suite = unittest.TestSuite() 
    for i in range(5): 
    test_suite.addTest(ParameterizedTest(i)) 
    return test_suite 

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

輸出2:

myrdraal% python parameterized.py 
..... 
---------------------------------------------------------------------- 
Ran 5 tests in 0.001s 

OK 

顯然我失去了一些東西,因爲這些看起來與我相似。

回答

0

問題似乎是unittest框架在unittest.TestCase的每個子類上調用__init__()對於以「test」開頭的每個方法。它傳遞一個包含測試方法名稱的字符串參數。這一切都發生在撥打load_tests()之前。一種解決方案是修改__init__()以允許此機制運行:

class MyTests(unittest.TestCase): 
    def __init__(self, testName, x=None, y=None): 
    super(MyTests, self).__init__(testName) 
    self.x = x 
    self. y = y 

    def testMyMethod(self): 
    self.assertEqual(self.y, my_method(self.x)) 

def load_tests(loader, tests, pattern): 
    print("load_tests()") 
    foobar = zip(range(5), range(5)) 
    test_suite = unittest.TestSuite() 
    for x, y in foobar: 
    test_suite.addTest(MyTests('testMyMethod', x, y)) 
    return test_suite 
相關問題