Как запустить несколько классов в одном тестовом наборе в тестировании модулей Python.....
Как запустить несколько классов в Single Test Suite при тестировании модулей Python?
Ответ 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)
Если выше не установлено, вы можете преобразовать вышеприведенный пример в метод, который может принимать несколько классов.