Подтвердить что ты не робот

Утепление 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()

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

4b9b3361

Ответ 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)