Как интегрировать `unittest` и `pytest` в одном проекте?

Для интеграции unittest и pytest в одном проекте, pytest автоматически обнаруживает и запускает тесты, написанные с использованием unittest. Дополнительной настройки обычно не требуется. Просто запустите pytest, и он найдет и выполнит ваши существующие тесты unittest наряду с тестами pytest. Важно обеспечить, чтобы обе системы тестирования не пересекались в именовании тестовых классов/функций для избежания неоднозначности. Если необходима особая конфигурация, можно использовать файлы pytest.ini или conftest.py для управления поведением pytest.

Интеграция unittest и pytest в одном проекте вполне возможна и может быть полезна для постепенного перехода от старого фреймворка тестирования (unittest) к более современному и гибкому (pytest).

Почему может понадобиться:

  • Постепенный переход: Вместо того, чтобы переписывать все тесты сразу, можно постепенно переводить их на pytest.
  • Совместимость: Некоторые сторонние библиотеки могут иметь тесты, написанные под unittest, и вам может потребоваться запускать их в вашем проекте.

Как это работает:

pytest автоматически обнаруживает и запускает тесты, написанные в стиле unittest. Вам не нужно вносить никаких изменений в существующие тесты unittest для того, чтобы pytest их запустил. pytest распознает классы, унаследованные от unittest.TestCase, и методы, начинающиеся с test_ внутри этих классов.

Пример структуры проекта:

    
      my_project/
      ├── my_module/
      │   ├── __init__.py
      │   └── my_code.py
      ├── tests/
      │   ├── __init__.py
      │   ├── test_pytest.py   # Тесты, написанные с использованием pytest
      │   └── test_unittest.py # Тесты, написанные с использованием unittest
      └── ...
    
  

Пример теста unittest (tests/test_unittest.py):

    
      import unittest

      class MyTestCase(unittest.TestCase):
          def test_addition(self):
              self.assertEqual(1 + 1, 2)

          def test_subtraction(self):
              self.assertEqual(5 - 3, 2)

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

Пример теста pytest (tests/test_pytest.py):

    
      def test_multiplication():
          assert 2 * 2 == 4

      def test_division():
          assert 10 / 2 == 5
    
  

Запуск тестов:

Просто запустите pytest из корня вашего проекта:

    
      pytest
    
  

pytest обнаружит и запустит как тесты unittest, так и тесты pytest.

Дополнительные возможности:

  • Конфигурация: pytest имеет мощные возможности конфигурации. Вы можете использовать файл pytest.ini, tox.ini или pyproject.toml для настройки поведения pytest, например, для указания каталогов с тестами, добавления дополнительных аргументов командной строки и т.д.
  • Фикстуры: Хотя тесты unittest не используют фикстуры pytest напрямую, pytest может использовать фикстуры для настройки окружения, которое необходимо для ваших тестов unittest.
  • Маркировка: Можно использовать маркировку pytest (@pytest.mark.marker_name) для фильтрации тестов, например, для запуска только тестов pytest или только тестов unittest. Однако, маркировка применяется к функциям и классам тестов pytest, и не применяется напрямую к классам unittest. Для фильтрации тестов unittest можно использовать другие механизмы фильтрации, предоставляемые pytest.

Заключение:

pytest обеспечивает отличную совместимость с тестами unittest, что позволяет интегрировать их в один проект и плавно переходить на новый фреймворк тестирования. Просто установите pytest и запускайте тесты, написанные с использованием обоих фреймворков, без каких-либо дополнительных настроек в большинстве случаев.

0