последовательный запуск тестов c помощью python + unittest

Здравствуйте!

Подскажите пожалуйста как сделать последовательный запуск тестов в Python / Unittest ?

У меня есть 5 тесткейсов: test1.py, test2.py, test3.py …Каждый модуль содержит класс, наследуемый от TestCase, c одним тестом.

Хочу сделать из них набор, чтобы последовательно запускались. Прочитал про методы TestLoader() и run() в библиотеке unittest, но никак не получается правильно скрипт написать. Пробовал определить функцию suite(), в которой бы компоновался набор из разных модулей, но в лучшем случае только первый тесткейс запускается.

Спасибо!

Ну вы хотя бы кодом поделились бы, чтобы посмотреть что там не так.

В общем, попытался написать за вас.

Есть модули test_1.py test_2.py test_3.py которые выглядят вот так вот:

import unittest


class TestClass1(unittest.TestCase):
    def test_something(self):
        pass

Для того чтобы сформировать запуск с определенной последовательностью я сделал еще один файл run.py где необходимо переоределить load_tests protocol, который запускается автоматически TestLoader. Как работает unittest можно посмотреть в документации или же например посмотреть вот этот урок Поиск 🔍 организации или лица - Предоставление сведений из ЕГРЮЛ/ЕГРИП в электронном виде.

from test_1 import TestClass1
from test_2 import TestClass2
from test_3 import TestClass3
import unittest
from unittest import TestSuite


def load_tests(loader, tests, pattern):
    suite = TestSuite()
    for test_class in (TestClass1, TestClass2, TestClass3):
        tests = loader.loadTestsFromTestCase(test_class)
        suite.addTests(tests)
    return suite


unittest.main(verbosity=2)

Так вот Вы сами определяете себе последовательность загрузки (TestClass1, TestClass2, TestClass3) и потом запускаете тест. Можно пойти еще дальше и не хардкодить такую последовательность, а формировать ее автоматически по определенной логике, чтобы каждый раз не записывать сюда новоразработанные тест классы. Но это уже совсем другая история :smile:

На выходе получаем вот такую последовательность

test_something (test_1.TestClass1) ... ok
test_something (test_2.TestClass2) ... ok
test_something (test_3.TestClass3) ... ok

----------------------------------------------------------------------
Ran 3 tests in 0.000s

OK

***Repl Closed***

Я думаю подход понятен, и я надеюсь это то что нужно было.

4 лайка

Здравствуйте! Спасибо, то что надо!!! Я начал идти по этому пути, но сразу в лоадер свои модули писал.

В качестве альтернативного решения можно попробовать использовать py.test.

В нем есть возможность установить модуль odering и жестко задавать последовательность тестов вне зависимости от их названия.

Если задача завязана именно на unittest - добавить к ответу @polusok нечего

1 лайк

Ещё можно посмотреть подход из proboscis (Proboscis — proboscis 1.0 documentation) там используется depends_on как в TestNG, но опять-таки вопрос - для какого вида тестов, наверное пробоскис больше для функциональных.