2013-03-11 5 views
12

Я хочу, чтобы файлы моего приложения находились в папке/Files, тогда как тестовые модули в/UnitTests, так что я четко отделил приложение и тест.Python unittesting: запуск тестов в другом модуле

Чтобы использовать те же маршруты модулей, что и mainApp.py, я создал testController.py в корневой папке.

mainApp.py 
testController.py 
Files 
    |__init__.py 
    |Controllers 
    | blabla.py 
    | ... 
UnitTests 
    |__init__.py 
    |test_something.py 

Так что, если в test_something.py я хочу проверить одну функцию, которая в /Files/Controllers/blabla.py, я стараюсь следующее:

import unittest 
import Files.Controllers.blabla as blabla 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(blabla.some_function()) 


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


, а затем из файла testController.py, я выполнить следующий код:

import TestUnits.test_something as my_test 
my_test.unittest.main() 

Что не выводит никаких сбоев, но тесты не выполняются

---------------------------------------------------------------------- 
Ran 0 tests in 0.000s 

OK 
[Finished in 0.3s] 


Я попытался с помощью теста, который не имеет зависимостей, и если выполнены как «главный» работает, но при вызове извне, выводит то же самое:

import unittest 


def tested_unit(): 
    return True 


class TestMyUnit(unittest.TestCase): 

    def test_stupid(self): 
     self.assertTrue(tested_unit()) 


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

Вопрос: как я могу заставить это работать?

ответ

4

В test_something.py, сделайте следующее:

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(unittest.makeSuite(TestMyUnit, 'test')) 
    return suite 

В testController.py, сделайте следующее:

from TestUnits import test_something 

def suite(): 
    suite = unittest.TestSuite() 
    suite.addTest(test_something.suite()) 
    return suite 

if __name__ == '__main__': 
    unittest.main(defaultTest='suite') 
+0

Это немного бит многословный, но он работает, спасибо. – bgusach

15

метод unittest.main() смотрит на все классы unittest.TestCase присутствующих в контексте. Поэтому вам просто нужно импортировать тестовые классы в файл testController.py и вызвать unittest.main() в контексте этого файла.

Так что ваш файл testController.py должен просто выглядеть следующим образом:

import unittest  
from UnitTests.test_something import * 
unittest.main() 
+0

Спасибо, но это не сработает. Результат один и тот же: он не тестирует. – bgusach

+0

Хорошо, что я плохой. Вы должны импортировать все тестовые примеры из файла test_something. Попробуйте с UnitTests.test_something импортировать TestMyUnit (или *), и он должен работать! – rparent

+0

Он работает, спасибо. – bgusach

0

Существует обходной путь использования subprocess.call() для выполнения тестов, как:

import subprocess 

args = ["python", "test_something.py"] 
subprocess.call(args) 
Смежные вопросы