Pytest
  • Введение
  • Пример тестирования
  • fixture (Фикстуры)
    • Параметризация
    • декораторы в питоне
    • Пример использования
  • 📚Практика
    • API OpenWeatherMap
    • API OMDBapi
  • scope
  • Запуск тестов через терминал
    • пример иерархии каталогов для организации тестов и их запуска с помощью Pytest
  • argparse
    • Создание интерфейса командной строки
Powered by GitBook
On this page
  1. fixture (Фикстуры)

Параметризация

Поддержка параметризации: pytest позволяет легко создавать параметризованные тесты, которые выполняются с разными входными данными.

import pytest

@pytest.mark.parametrize("input, expected", [(1, 2), (2, 4), (3, 6)])
def test_multiply_by_two(input, expected):
    result = input * 2
    assert result == expected

@pytest.mark.parametrize - это декоратор, предоставляемый pytest для параметризации тестов. Этот механизм позволяет вам запускать одну и ту же тестовую функцию с разными наборами входных данных. Такие тесты становятся более компактными, легко читаемыми и обеспечивают широкий охват возможных вариантов использования.

В примере:

import pytest

@pytest.mark.parametrize("input, expected", [(1, 2), (2, 4), (3, 6)])
def test_multiply_by_two(input, expected):
    result = input * 2
    assert result == expected
  • @pytest.mark.parametrize("input, expected", [(1, 2), (2, 4), (3, 6)]): Этот декоратор говорит pytest, что функция test_multiply_by_two должна быть выполнена трижды с разными значениями параметров input и expected.

  • def test_multiply_by_two(input, expected): Это сама тестовая функция. В данном случае, она принимает два параметра: input и expected.

Таким образом, тест будет выполнен трижды с параметрами (1, 2), (2, 4) и (3, 6). В каждом случае переменная input принимает первое значение из кортежа, а переменная expected - второе значение. Тест проверяет, что умножение значения input на 2 действительно равно ожидаемому значению expected.

Преимущества использования параметризованных тестов:

  1. Компактность: Вы можете тестировать множество случаев с одной и той же логикой в одной тестовой функции, делая код более компактным.

  2. Читаемость: Параметризованные тесты легко читаются и понимаются. Вы видите все входные значения и ожидаемые результаты в одном месте.

  3. Легкость добавления новых случаев: При необходимости добавить новый тестовый случай, вам просто нужно добавить новую строку в параметризацию, что делает расширение тестов простым.

  4. Легкость отладки: Если один из случаев не проходит, pytest выведет подробные сведения о том, какие именно параметры вызвали проблему, что значительно упрощает отладку.


В pytest, параметризация тестов позволяет вам определить набор различных входных данных для одного и того же тестового случая. Это удобно, когда вы хотите протестировать функцию или метод с разными входами и ожидаемыми результатами. Вот более подробная информация о параметризации и ее возможностях:

Основы параметризации:

  1. Простая параметризация:

    import pytest
    
    @pytest.mark.parametrize("input, expected", [(1, 2), (2, 4), (3, 6)])
    def test_multiply_by_two(input, expected):
        result = input * 2
        assert result == expected

    В этом примере тест test_multiply_by_two будет выполнен трижды с разными значениями input и expected.

  2. Использование множественных параметров:

    import pytest
    
    @pytest.mark.parametrize("a, b, expected", [(1, 2, 3), (2, 3, 5), (3, 4, 7)])
    def test_addition(a, b, expected):
        result = a + b
        assert result == expected

    Этот тест принимает три параметра (a, b, и expected) и будет выполнен трижды с различными значениями.

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

  1. Использование динамических значений с помощью параметризации:

    import pytest
    
    dynamic_values = [(1, 2), (2, 4), (3, 6)]
    
    @pytest.mark.parametrize("input, expected", dynamic_values)
    def test_multiply_by_two(input, expected):
        result = input * 2
        assert result == expected

    Можно определить набор значений вне декоратора parametrize и использовать его для параметризации теста.

  2. Использование маркеров в параметризации:

    import pytest
    
    @pytest.mark.parametrize("input, expected", [(1, 2), (2, 4), pytest.mark.xfail((3, 7))])
    def test_multiply_by_two(input, expected):
        result = input * 2
        assert result == expected

    Маркеры, такие как xfail (ожидание неудачи), могут быть использованы в параметризации для обработки особых случаев.

  3. Параметризация с использованием функции:

    import pytest
    
    def data_provider():
        return [(1, 2), (2, 4), (3, 6)]
    
    @pytest.mark.parametrize("input, expected", data_provider())
    def test_multiply_by_two(input, expected):
        result = input * 2
        assert result == expected

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

Расширенная параметризация:

  1. Параметризация с помощью фикстур:

    import pytest
    
    @pytest.fixture(params=[1, 2, 3])
    def input_data(request):
        return request.param
    
    def test_square(input_data):
        result = input_data ** 2
        assert result == input_data * input_data

    Вы можете использовать фикстуры для параметризации тестов. В этом примере, тест test_square будет выполнен трижды с параметрами 1, 2 и 3.

  2. Комбинированная параметризация:

    import pytest
    
    @pytest.mark.parametrize("input", [1, 2])
    @pytest.mark.parametrize("expected", [2, 4])
    def test_multiply_by_two(input, expected):
        result = input * 2
        assert result == expected

    Можно комбинировать несколько декораторов parametrize для создания всех возможных комбинаций параметров.

Важно отметить, что pytest предоставляет широкие возможности для параметризации, и эти примеры представляют лишь некоторые из вариантов использования. Параметризация тестов делает код более читаемым, легким в поддержке и улучшает общую эффективность тестирования.

Previousfixture (Фикстуры)Nextдекораторы в питоне

Last updated 1 year ago