У меня есть стенд для тестирования сложной встраиваемой системы. Стенд для тестирования управляется очень сложной базовой кодовой базой из python сценариев и модулей, причем сценарий верхнего уровня вызывает диспетчер контекста для полной настройки стенда, а P C подключается к тестируемому устройству через один из нескольких абстрактных интерфейсов. Подготовка контролируемого контекста может занять несколько минут.
Мы застряли на Python 3.4 и не можем загрузить pytest. Я хочу использовать unittest, чтобы начать собирать набор регрессионных тестов. Каждый сеанс тестирования будет нуждаться в менеджере контекста для настройки стенда, но мне не нужно переустанавливать каждый тест.
Так что в моем элементарном понимании того, как использовать unittest, я изначально хотел создать экземпляр Контролируемый объект ресурса и вызовите его метод __enter__ в методе setUpClass моего тестового класса, затем добавьте метод __exit__ в метод tearDownClass.
import unittest
from my_bench_lib import MyBench as Bench
class TestBenchRegression(unittest.TestCase):
"""Do regression tests after the bench is setup"""
@classmethod
def setUpClass(cls):
bench = Bench()
cls.bench = bench.__enter__()
@classmethod
def tearDownClass(cls):
cls.bench.__exit__()
def setUp(self):
""" put bench into known state """
pass
def tearDown(self):
pass:
def test_first_test(self):
self.assertEqual(cls.bench.some_feature(), StatusOk)
Другой вариант - использовать только один TestCase и поставить __enter__ в вызовах setUp и __exit__ в вызове addCleanup () (или, возможно, tearDown), затем используйте subTest в единственном TestCase, чтобы изолировать мои отдельные тесты.
import unittest
from bench_lib import MyBench as Bench
class TestBenchRegression(unittest.TestCase):
"""Do regression tests after the bench is setup"""
def setUp(self):
bench = Bench()
self.bench = bench.__enter__()
def tearDown(self):
self.bench.__exit__()
def reset_bench(self):
""" put bench back into known state """
self.bench.fix up();
def first_test(self):
self.assertEqual(self.bench.some_feature(), StatusOk)
def second_test(self):
self.assertEqual(self.bench.some_feature2(), StatusOk)
def third_test(self):
self.assertEqual(self.bench.some_feature3(), StatusOk)
def test_all_tests(self):
self.reset_bench()
with self.subTest("Do first test"):
self.first_test()
self.reset_bench()
with self.subTest("Do second test"):
self.second_test()
self.reset_bench()
with self.subTest("Do third test"):
self.third_test()
Мне также было интересно, могу ли я просто вызвать unittest.main () внутри контекста для запуска тестов.
import unittest
from my_bench_lib import MyBench as Bench
class TestBenchRegression(unittest.TestCase):
def test_first(self):
self.assertEqual(bench.some_feature(), StatusOk)
if __name__ == "__main__":
with Bench() as bench:
unittest.main()
Я понимаю, что это не является обычной целью unittest, и я мог бы sh я мог бы использовать pytest. Тем не менее, любой совет будет приветствоваться.