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

Как запустить несколько классов в Single Test Suite при тестировании модулей Python?

Как запустить несколько классов в одном тестовом наборе в тестировании модулей Python.....

4b9b3361

Ответ 1

Если вы хотите запустить все тесты из определенного списка тестовых классов, а не все тесты из всех тестовых классов в модуле, вы можете использовать метод TestLoader loadTestsFromTestCase, чтобы получить TestSuite тестов для каждого класса, а затем создайте один TestSuite, который объединяет список наборов, которые вы можете использовать с run:

import unittest

# Some tests

class TestClassA(unittest.TestCase):
    def testOne(self):
        # test code
        pass

class TestClassB(unittest.TestCase):
    def testOne(self):
        # test code
        pass

class TestClassC(unittest.TestCase):
    def testOne(self):
        # test code
        pass

if __name__ == '__main__':
    # Run only the tests in the specified classes

    test_classes_to_run = [TestClassA, TestClassC]

    loader = unittest.TestLoader()

    suites_list = []
    for test_class in test_classes_to_run:
        suite = loader.loadTestsFromTestCase(test_class)
        suites_list.append(suite)

    big_suite = unittest.TestSuite(suites_list)

    runner = unittest.TextTestRunner()
    results = runner.run(big_suite)

    # ...

Ответ 2

Я немного не уверен в том, что вы здесь просите, но если вы хотите узнать, как тестировать несколько классов в одном и том же пакете, обычно вы просто создаете несколько тестовых классов в одном файле python и запускаете их вместе:

import unittest

class TestSomeClass(unittest.TestCase):
    def testStuff(self):
            # your testcode here
            pass

class TestSomeOtherClass(unittest.TestCase):
    def testOtherStuff(self):
            # testcode of second class here
            pass

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

И запустите, например,:

python mytestsuite.py

Более хорошие примеры можно найти в официальном документе.

Если, с другой стороны, вы хотите запустить несколько тестовых файлов, как описано в "Как организовать тест python таким образом, чтобы я мог запускать все тесты в одной команде?" , то другой ответ, вероятно, лучше.

Ответ 3

Метод unittest.TestLoader.loadTestsFromModule() обнаружит и загрузит все классы в указанном модуле. Поэтому вы можете просто сделать это:

import unittest
import sys

class T1(unittest.TestCase):
  def test_A(self):
    pass
  def test_B(self):
    pass

class T2(unittest.TestCase):
  def test_A(self):
    pass
  def test_B(self):
    pass

if __name__ == "__main__":
  suite = unittest.TestLoader().loadTestsFromModule( sys.modules[__name__] )
  unittest.TextTestRunner(verbosity=3).run( suite )

Ответ 4

Я нашел nose, чтобы быть хорошим инструментом для этого. Он обнаруживает все модульные тесты в структуре каталогов и выполняет их.

Ответ 5

Обычно вы будете делать следующим образом (который добавляет только один класс для каждого пакета):

# Add tests.
alltests = unittest.TestSuite()
alltests.addTest(unittest.makeSuite(Test1))
alltests.addTest(unittest.makeSuite(Test2))

Если вы хотите иметь несколько классов для каждого пакета, вы можете использовать эти тесты следующим образом:

for name in testnames:
    suite.addTest(tc_class(name, cargs=args))

Вот тот же пример для запуска всех классов в отдельном пакете, который вы можете определить для собственного метода make_suite:

# Credits: http://codereview.stackexchange.com/a/88662/15346
def make_suite(tc_class):
    testloader = unittest.TestLoader()
    testnames = testloader.getTestCaseNames(tc_class)
    suite = unittest.TestSuite()
    for name in testnames:
        suite.addTest(tc_class(name, cargs=args))
    return suite

# Add all tests.
alltests = unittest.TestSuite()
for name, obj in inspect.getmembers(sys.modules[__name__]):
    if inspect.isclass(obj) and name.startswith("FooTest"):
        alltests.addTest(make_suite(obj))

result = unittest.TextTestRunner(verbosity=2).run(alltests)

Если выше не установлено, вы можете преобразовать вышеприведенный пример в метод, который может принимать несколько классов.