Python unittesting: запуск тестов в другом модуле

Я хочу иметь файлы моего приложения в папке / 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()

вопрос: как мне заставить это работать?

3 ответов


In test_something.py, сделайте это:

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

In 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')

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

Итак, ваш файл testController.py должно просто выглядеть так:

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

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

import subprocess

args = ["python", "test_something.py"]
subprocess.call(args)