2010-08-23 62 views
2

我想要一個單獨的類來運行我所有的測試,然後從main調用該類來顯示結果。不幸的是,我得到這樣的錯誤:使用python的unittest模塊的未綁定錯誤

Traceback (most recent call last): 
    File "/home/dhatt/workspace/pyqt_DALA_ServiceTracker/src/Main.py", line 21, in <module> 
    allsuite = unittest.TestLoader.loadTestsFromModule(TestAllSuite) 
TypeError: unbound method loadTestsFromModule() must be called with TestLoader instance as first argument (got type instance instead) 

如何更改我的代碼,以便我可以運行我的測試?

我正在使用python 2.6.5。

如果您發現我的測試結構本身也存在問題(主調用主測試類,然後調用所有其他測試類),請告訴我。我願意接受建議,以我的測試代碼更好的佈局(在互聯網上傳播的例子只是使用單元測試時給你最基礎的)

下面是從TestAllClass我的代碼(這是調用其他的測試類)

import unittest 
from TestSettings import TestSettings 
from TestConnectDB import TestConnectDB 


class TestAllSuite(unittest.TestCase): 

    def testsuite(self): 
     suite_settings = TestSettings.suite() 
     suite_connectDB = TestConnectDB.suite() 
     alltests = unittest.TestSuite([suite_settings, suite_connectDB]) 
     return alltests 

,這裏是我的主要的組成部分,調用TestAllClass

if __name__ == '__main__': 
    allsuite = unittest.TestLoader.loadTestsFromModule(TestAllSuite) 
    unittest.TextTestRunner(verbosity=2).run(allsuite) 

這裏是我的測試類的一個實例(如果這能幫助):

from Settings import Settings 
import unittest 


class TestSettings(unittest.TestCase): 
    def suite(self): 
     suite = unittest.TestSuite() 
     tests = ['test_confirm_ip', 'test_valid_conn','test_correct_location'] 
     return unittest.TestSuite(map(suite, tests)) 

    def setUp(self): 
     self._test_settings = Settings('/home/dhatt/ServiceTrackerSettings.ini') 
     self.ip_add, self.conn, self.digby = self._test_settings._get_config_variables() 

    def tearDown(self): 
     self._test_settings = None 
     self.ip_add = None 
     self.conn = None 
     self.digby = None 

    def test_confirm_ip(self): 
     self.assertEqual((str(self.ip_add)), ('142.176.195.250')) 

    def test _confirm_conn(self): 
     self.assertEqual((str(self.conn)), ('conn1')) 

    def test_confirm_location(self): 
     self.assertEqual((self.digby), (True)) 

回答

4

的參數loadTestsFromModule(你的情況TestAllSuite),應該是一個模塊,而不是unittest.TestCase一個子類:

allsuite = unittest.TestLoader.loadTestsFromModule(TestAllSuite) 

例如,這裏是一個運行在文件中找到的所有單元測試的小腳本表格test_*.py

import unittest 
import sys 
import os 

__usage__=''' 
%prog  # Searches CWD 
%prog DIR 
''' 

if __name__=='__main__': 
    if len(sys.argv)>1: 
     unit_dir=sys.argv[1] 
    else: 
     unit_dir='.' 
    test_modules=[filename.replace('.py','') for filename in os.listdir(unit_dir) 
        if filename.endswith('.py') and filename.startswith('test_')] 
    map(__import__,test_modules) 

    suite = unittest.TestSuite() 
    for mod in [sys.modules[modname] for modname in test_modules]: 
     suite.addTest(unittest.TestLoader().loadTestsFromModule(mod)) 
    unittest.TextTestRunner(verbosity=2).run(suite) 
+0

好的。感謝您的澄清。感謝劇本,我從來沒有想過要這樣看。稍後我會看到它如何在添加更多測試的情況下執行,但目前看起來不錯。 – 2010-08-24 12:12:36

+0

另外,如果我有2.7版本的Python,我可以做到這一點。 http://docs.python.org/library/unittest.html#unittest.TestLoader.discover 可惜... – 2010-08-24 14:43:44

+0

@丹尼:感謝您指出這一點。我不知道「TestLoader.discover」。 – unutbu 2010-08-24 14:50:14