python unittest для тестирования интеграции с управляемой средой контекста - PullRequest
0 голосов
/ 24 марта 2020

У меня есть стенд для тестирования сложной встраиваемой системы. Стенд для тестирования управляется очень сложной базовой кодовой базой из 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. Тем не менее, любой совет будет приветствоваться.

...