2010-08-23 2 views
2

Мне хотелось бы, чтобы отдельный класс запускал все мои тесты, а затем вызывал этот класс из main, чтобы отобразить результаты. К сожалению, я получаю сообщение об ошибке:Ошибка Unbound с использованием unittest модуля python

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.

Если вы обнаружите, что сама моя структура тестирования также создает проблему (где основной вызов вызывает основной класс тестирования, который затем вызывает все мои другие классы тестирования), дайте мне знать. Я открыт для предложений к лучшему макету моего кода тестирования (примеры из интернета только дать вам самые основы при использовании UnitTest)

Вот мой код из 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

ОК. Спасибо за разъяснения. И спасибо за сценарий, я никогда не думал о том, чтобы выглядеть так. Я посмотрю, как это происходит позже, когда добавлено больше тестов, но пока это хорошо. –

+0

Кроме того, если бы у меня была версия python версии 2.7, я мог бы просто сделать это. http://docs.python.org/library/unittest.html#unittest.TestLoader.discover Pity ... –

+0

@ Danny: Спасибо, что указали это. Я не знал о «TestLoader.discover». – unutbu

Смежные вопросы