Рубрики
Без рубрики

Добавление светильников и параметризованных функций в Pytest

Как мы обсуждали в нашем посте о начале работы с Pytest, структура позволяет нам повторно использовать тесты B … Tagged с помощью Python, тестирования, начинающих, учебного пособия.

Python (6 серии деталей)

Как мы обсуждали в нашем посте на Начало работы с Pytest Фреймворк позволяет нам повторно использовать тесты, используя тестовые приспособления и параметризованные функции. В этом посте мы узнаем, как это сделать.

Мы будем опираться на наш простой пример калькулятора, который мы обсуждали в предыдущем посте, и добавим к нему. Без лишних слов, давайте начнем.

Добавление тестовых приборов

Как мы видели в нашем небольшом примере, есть некоторое повторение в двух основных тестах, которые мы написали:

# calculator_test.py
from calculator import add

def test_add():
    firstNumber = 2
    secondNumber = 1
    assert add(firstNumber, secondNumber) == 3

def test_add():
    firstNumber = 2
    secondNumber = 1
    assert subtract(firstNumber, secondNumber) == 1

В этом случае это может показаться тривиальным, но это одно из улучшений производительности, которое мы можем получить с Pytest. Мы можем избежать повторения и настроить некоторый вспомогательный код, который выполняется перед любыми тестами. Эти приспособления являются идеальными местами для инициализации ресурсов, которые будут необходимы для тестов.

Мы можем создавать функции приспособления, отмечая их, используя декоратор @pytest.fixture. Это дает нам способ инъекции зависимостей в наши тесты посредством параметров функций.

Функции, которые требуют этих приборов, могут затем принять их в качестве аргумента. Таким образом, наше определение приспособления станет:

import pytest

@pytest.fixture
def numbers():
    firstNumber=2
    secondNumber=1
    return [firstNumber,secondNumber]

Поскольку приспособление является функцией, мы могли бы определить две функции, чтобы вернуть два числа, либо мы можем объединить их в списке и вернуть их из одного. И теперь мы можем иметь доступ к этому списку в нашем тестовом примере, и наш тест упрощает:

def test_add(numbers):
    assert add(numbers[0], numbers[1]) == 3

И для вычитания мы можем просто сделать:

def test_add(numbers):
    assert subtract(numbers[0], numbers[1]) == 1

Несколько вещей, которые нужно отметить о светильниках:

  • Мы можем определить несколько приборов для одного файла. Затем они могут быть индивидуально доступны их именами в аргументе функции теста.

  • Тест может запросить несколько приспособлений.

  • Каждый тест получает недавно инициализированное значение переменных, объявленных в приборе. Значения не используются среди тестов.

  • Матчи доступны только среди конкретного файла.

  • Матчи могут запросить другие приспособления.

Conftest.py

Мы могли бы также повторно использовать некоторые из наших приборов в файлах. Мы можем сделать это, создав файл с именем conftest.py в нашем каталоге. Тесты, определенные в этом файле, доступны для всех тестов в каталоге.

У нас даже есть несколько файлов conftest.py в проекте, но только один на модуль Python. Тесты, определенные в модуле, могут использовать все приспособления, определенные в конфигурации для этого модуля, а также те, которые определены во всем мире.

Прицелы

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

Например, если бы мы позвонили API, мы будем делать запрос каждый раз, замедляя наши тесты. Мы можем определить прицелы для светильников, которые дают нам возможность повторного использования экземпляров приспособления между тестами.

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

# content of conftest.py
import pytest
import smtplib
@pytest.fixture(scope="module")
def smtp_connection():
   return smtplib.SMTP("smtp.gmail.com", 587, timeout=5)

Объект SMTP будет повторно использован по всему модулю.

Параметризованные функции испытаний

Когда дело доходит до написания тестов, мы обычно хотим проверить функцию с несколькими значениями. И чаще всего мы заканчиваем тем, что пишем несколько тестовых случаев для этого. Pytest предоставляет нам функцию, известную как параметризованные функции тестирования, которая позволяет тестировать различные сценарии в одной функции.

Мы используем декоратор @pytest.mark.parametize. Прежде чем вступить в реализацию, давайте сначала поймем, что такое маркеры.

Маркеры

Маркеры – это декораторы, которые разрешают классификацию тестов или дают нам возможность выполнять определенное действие. Некоторые из соответствующих маркеров:

@pytest.mark.skip(reason=None): skip the given test function with an optional reason

@pytest.mark.filterwarnings(warning): add a warning filter to the given test

@pytest.mark.xfail(condition, reason=None, run=True, raises=None, strict=False): mark the test function as an expected failure if eval(condition) has a True value

@pytest.mark.parametrize(argnames, argvalues): call a test function multiple times passing in different arguments in turn. argvalues generally needs to be a list of values if argnames specifies only one name or a list of tuples of values if argnames specifies multiple names.

Чтобы увидеть список всех маркеров, мы можем использовать:

pytest --markers

Написание параметризованных функций

Как мы узнали, мы можем параметризировать наши тестовые примеры с использованием маркеров. Давайте предположим, что мы хотим проверить не только положительные числа, но и отрицательные числа. Вместо того, чтобы писать несколько тестов, мы бы вместо этого использовали:

# calculator_test.py
from calculator import add

@pytest.mark.parametrize("firstNumber,secondNumber,expected", [
    (1, 2, 3),
    (2, -2, 0),
])
def test_add():
    assert add(firstNumber, secondNumber) == expected

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

Вывод

И это завершает наше исследование светильников и параметризованных функций в Pytest. А теперь идите и напишите несколько потрясающих тестов! И если у вас есть какие -либо вопросы, не стесняйтесь бросить комментарий ниже.

Первоначально опубликовано в https://www.wisdomgeek.com 11 марта 2021 года.

Python (6 серии деталей)

Оригинал: “https://dev.to/saranshk/adding-fixtures-and-parameterized-functions-to-pytest-255d”