Как группировать тесты и запускать их с помощью командной строки в `pytest`?

Группировать тесты в `pytest` можно несколькими способами, а запускать их - используя командную строку с различными параметрами. Основные методы и примеры:

1. Маркировка тестов (Markers):

Используйте декоратор `@pytest.mark.имя_маркера` для пометки тестов.


  import pytest

  @pytest.mark.slow
  def test_slow_feature():
      assert True

  @pytest.mark.fast
  def test_fast_feature():
      assert True
  

Запуск тестов с определенной меткой:


  pytest -m slow
  

Запуск тестов без определенной метки (инверсия):


  pytest -m "not slow"
  


2. Группировка по директориям/файлам:

`pytest` автоматически определяет тесты внутри файлов, начинающихся с `test_` или заканчивающихся на `_test.py`, в указанной директории.


  pytest tests/
  


3. Ключевые слова в названиях тестов:

Можно запускать тесты, в названии которых есть определенное слово.


   pytest -k "login" #Запустит все тесты, содержащие "login" в имени функции/класса.
  


4. Использование классов для группировки:

Тесты можно группировать внутри классов, чтобы логически сгруппировать тесты связанные с определенным функционалом.


  class TestUserAccount:
      def test_login(self):
          assert True

      def test_logout(self):
          assert True

  

Для группировки тестов и запуска их с помощью командной строки в pytest можно использовать несколько подходов:

1. Маркировка тестов (Markers)

Маркеры позволяют назначать тестам произвольные метки и затем запускать только те тесты, которые помечены определенным маркером.

Определение маркеров:

В файле pytest.ini (или pyproject.toml) укажите маркеры, которые вы будете использовать. Это помогает pytest распознать ваши маркеры и избежать предупреждений. Например:

# pytest.ini
[pytest]
markers =
    slow: Тесты, требующие больше времени для выполнения.
    integration: Интеграционные тесты.

Применение маркеров в тестах:

# test_example.py
import pytest

@pytest.mark.slow
def test_long_running_task():
    # ...
    assert True

@pytest.mark.integration
def test_api_integration():
    # ...
    assert True

def test_fast_operation():
    # ...
    assert True

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

pytest -m slow       # Запускает все тесты, помеченные как 'slow'
pytest -m "not slow" # Запускает все тесты, *не* помеченные как 'slow'
pytest -m "slow or integration" # Запускает тесты с меткой slow ИЛИ integration
pytest -m "slow and integration" # Запускает тесты с метками slow И integration

2. Организация тестов по каталогам и файлам

pytest автоматически обнаруживает тесты, расположенные в файлах, имена которых начинаются с test_ или заканчиваются на _test. Также pytest рекурсивно обходит все подкаталоги в поисках тестовых файлов. Таким образом, можно группировать тесты по каталогам и запускать их, указывая путь к каталогу.

Пример структуры каталогов:

tests/
    __init__.py
    unit/
        __init__.py
        test_module1.py
        test_module2.py
    integration/
        __init__.py
        test_api.py
        test_database.py

Запуск тестов по каталогам:

pytest tests/unit       # Запускает все тесты в каталоге tests/unit
pytest tests/integration # Запускает все тесты в каталоге tests/integration
pytest tests             # Запускает все тесты во всех подкаталогах в каталоге tests

3. Ключевые слова (Keywords)

Вы можете запускать тесты, имена которых содержат определенное ключевое слово.

Запуск тестов по ключевому слову:

pytest -k "api"       # Запускает тесты, содержащие 'api' в имени функции или класса
pytest -k "not api"   # Запускает тесты, *не* содержащие 'api' в имени функции или класса

4. Использование классов Test

pytest также обнаруживает тесты, определенные внутри классов, имена которых начинаются с Test.


    class TestMyClass:
        def test_something(self):
            assert True

        def test_another_thing(self):
            assert False
    

5. Комбинирование способов

Эти подходы можно комбинировать. Например, можно запускать тесты, помеченные маркером и содержащие определенное ключевое слово.

Пример комбинирования:

pytest -m slow -k "api"  # Запускает тесты, помеченные как 'slow' и содержащие 'api' в имени

Важно: Убедитесь, что в ваших тестовых файлах содержатся соответствующие операторы assert для проверки ожидаемых результатов.

0