Утепление Python: запуск тестов в другом модуле
Я хочу, чтобы файлы моего приложения находились в папке /Files, тогда как тестовые модули в /UnitTests, так что у меня явно отделенное приложение и тест.
Чтобы иметь возможность использовать те же маршруты модулей, что и 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]
Я попытался с тестом, который не имеет зависимостей, и если выполняется как " main", но при вызове извне выводит то же самое:
import unittest
def tested_unit():
return True
class TestMyUnit(unittest.TestCase):
def test_stupid(self):
self.assertTrue(tested_unit())
if __name__ == '__main__':
unittest.main()
Вопрос: как я могу заставить это работать?
Ответы
Ответ 1
В 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')
Ответ 2
Метод unittest.main() рассматривает все классы unittest.TestCase, присутствующие в контексте.
Поэтому вам просто нужно импортировать тестовые классы в файл testController.py и вызвать unittest.main() в контексте этого файла.
Итак, ваш файл testController.py должен выглядеть так:
import unittest
from UnitTests.test_something import *
unittest.main()
Ответ 3
Существует обходной путь использования subprocess.call() для запуска тестов, например:
import subprocess
args = ["python", "test_something.py"]
subprocess.call(args)