[автоматизация Python] серия pytest (завершено)
[автоматизация Python] серия pytest (завершено)

Расширенное использование Pytest

(1) Параметризация

Язык кода:javascript
копировать
@pytest.mark.parametrize("Имя параметра", данные списка)
'''
Имя параметра:использовать для получения каждого элемента данных в качестве примера тестиспользовать параметра.
Данные списка: набор данных.
'''
Язык кода:javascript
копировать
@pytest.mark.parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None)):

параметр

иллюстрировать

argnames

Должно пройти, имя параметра,строка, разделенная запятыми,Представляет одно или несколько имен параметров (ключей).,или список/кортеж строк параметров

argvalues

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

indirect

Если это правда, argnames должно быть именем функции фикстуры, а значение argvalues ​​будет передано в соответствующую фикстуру, что эквивалентно использованию @pytest.fixture(params=). По умолчанию установлено значение False.

ids

Имя выполнения подварианта использования, соответствующее количеству значений аргументов, генерируется автоматически, если не указано, по умолчанию Нет

scope

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

Язык кода:javascript
копировать
#пример
# Здесь имя параметра a, b, c, соответствующие входящим параметрам, b, c должны соответствовать один в один.
# Если записан только один параметр, это означает, что каждое последующее содержимое, разделенное запятыми, представляет собой набор данных.
@pytest.mark.parametrize("a,b,c",[(1,2,3),(7,8,15),(2,2,3),(9,6,15)])
def test_add(a,b,c):
    sum = a+b
    assert sum==c
    
    ### Результаты бега ###
============================= test session starts =============================
collecting ... collected 4 предметы

test_004_parameterization.py::test_add[1-2-3] PASSED                               [ 25%]
test_004_параметризменять.py::test_add[7-8-15] PASSED                              [ 50%]
test_004_параметризменять.py::test_add[2-2-3] FAILED                               [ 75%]
test_004_параметризменять.py:12 (test_add[2-2-3])
4 != 3

Expected :3
Actual   :4
<Click to see difference>

a = 2, b = 2, c = 3

    @pytest.mark.parametrize("a,b,c",[(1,2,3),(7,8,15),(2,2,3),(9,6,15)])
    def test_add(a,b,c):
        sum = a+b
>       assert sum==c
E       assert 4 == 3

test_004_параметризменять.py:16: AssertionError

test_004_параметризменять.py::test_add[9-6-15] PASSED                              [100%]

========================= 1 failed, 3 passed in 0.06s =========================

«Комбинированный параметр» :несколько групппараметр,Соединяем последовательно,Декартово произведение

Язык кода:javascript
копировать
@pytest.mark.parametrize("x",[2,4,6])
@pytest.mark.parametrize("y",[1,3,5])
def test_add(x,y):
    print(f"x:{x},y:{y}")

Будет создано 9 наборов тестовых примеров

Язык кода:javascript
копировать
============================= test session starts =============================
collecting ... collected 9 предметы

test_004_parameterизменять.py::test_add[1-2] PASSED                                 [ 11%]x:2,y:1

test_004_параметризменять.py::test_add[1-4] PASSED                                 [ 22%]x:4,y:1

test_004_параметризменять.py::test_add[1-6] PASSED                                 [ 33%]x:6,y:1

test_004_параметризменять.py::test_add[3-2] PASSED                                 [ 44%]x:2,y:3

test_004_параметризменять.py::test_add[3-4] PASSED                                 [ 55%]x:4,y:3

test_004_параметризменять.py::test_add[3-6] PASSED                                 [ 66%]x:6,y:3

test_004_параметризменять.py::test_add[5-2] PASSED                                 [ 77%]x:2,y:5

test_004_параметризменять.py::test_add[5-4] PASSED                                 [ 88%]x:4,y:5

test_004_параметризменять.py::test_add[5-6] PASSED                                 [100%]x:6,y:5


============================== 9 passed in 0.03s ==============================

Process finished with exit code 0

(2)pytest.ini

1. Файл конфигурации pytest может изменить режим работы pytest. Это фиксированный файл pytest.ini. Он считывает информацию о конфигурации и запускает ее указанным способом.

2. Расположение: обычно размещается в корневом каталоге проекта (то есть в папке верхнего уровня текущего проекта).

3. Имя: pytest.ini.,Невозможно использовать китайские символы,включая кандзи、космос、кавычки、Колон и т. д.

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

"Шили"

Язык кода:javascript
копировать
[pytest]
markers = 
	отметка1: описание
	отметка2: описание
	отметка3: описание
addopts = -vs
;Укажите минимальный номер версии pytest
minversion = 7.0
;pytest по умолчанию ищет и выполняет все тестиспользовать примеры, начинающиеся с test_, в текущем каталоге;
;Мы можем проверить пути в pytest.iniКонфигурация = test_case/test_001.py, то будет выполнен только указанный вариант использования в текущей папке или файле. Множественная конфигурация может быть разделена пробелами.
testpaths = ./testcase

; Правила для имен модулей, имена файлов модулей, которые ищет Конфигурациятест
python_files = test*.py

; Правила для имен классов, Конфигурациятест поиск имен тестовых классов
python_classes = Test*

; Правила для имен методов, имен тестовых функций, которые ищет Конфигурациятест
python_functions = test
① отметка отметки

«Маркировка: функция маркировки»

  • Отметьте варианты использования, и при запуске будут выполняться только отмеченные варианты использования.
  • 300 примеров регрессии. -- Отметить 50 предметов,Как тест на дым.

«1. Сначала необходимо зарегистрировать имя тега»

pytest.ini

Язык кода:javascript
копировать
[pytest]
    markers = 
        mark1: Тег иллюстрировать (только на английском языке, писать не нужно)
        mark2: Тег иллюстрировать (только на английском языке, писать не нужно)
        mark3: Тег иллюстрировать (только на английском языке, писать не нужно)

«2. Отметьте тестовые примеры/тестовые классы»

базовыйиспользовать

Язык кода:javascript
копировать
 @pytest.mark.Зарегистрированный знак
 # нравиться
 @pytest.mark.mark1

Тег в категории тест,использовать Следующее утверждение (в категории test,Все случаи маркируются этой меткой):

Язык кода:javascript
копировать
class TestClass():
    pytestmark = pytest.mark.Зарегистрированное имя тега
    # или Режим нескольких вкладок
    pytestmark = [pytest.mark.Имя тега 1, pytest.mark.Имя тега 2] 

Теги в файлах модулей,использовать следующий оператор (в файле py,Все функции и тестовые тестовые функции в классе тестов,все помечены этим ярлыком)

Язык кода:javascript
копировать
import pytest
pytestmark = pytest.mark.Зарегистрированное имя тега
# или Режим нескольких вкладок
pytestmark = [pytest.mark.Имя тега 1, pytest.mark.Имя тега 2]

«3. Настройте среду выполнения, чтобы запускать только отмеченные варианты использования»

Язык кода:javascript
копировать
pytestЗаказ ХОРОШО:-m тэг
Из всех собранных примеров использования,Просто удача ХОРОШОпереписыватьсятэгизиспользоватьпример。

«4. Отметки могут накладываться друг на друга»

② добавляет конфигурацию

параметр

эффект

-s

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

-v

Перед добавлением печатается только имя модуля. После добавления v печатается имя класса, имя модуля и имя метода для отображения более подробной информации.

-q

Указывает, что отображаются только общие результаты теста.

-vs

Эти два параметра можно использовать вместе.

-n

Поддержка многопоточностиили Распределенная работа ХОРОШОтестиспользоватьпример(Предварительное условие Установить:pytest-xdistплагин)

–html

Создать отчет о тестировании в формате HTML (требуется Установить: плагин pytest-html). Например: pytest -vs --html ./reports/result.html.

-x

Указывает, что пока один тестовый пример сообщает об ошибке, выполнение будет остановлено.

-k

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

-m

отметка отметка

(3)pytest.mark.связано

1. Пропустить выполнение напрямую
Язык кода:javascript
копировать
@pytest.mark.skip
2. Пропустить выполнение, если условия выполнены.
Язык кода:javascript
копировать
@pytest.mark.skipif
При определенных условиях указанная тестовая функция не выполняется.
 метод:
     skipif(condition, reason=None)
 параметр:
     условие: пропущенное условие, необходимо передать параметр
     причина: отметьте причину, необходимо передать параметр
 использоватьметод:
     @pytest.mark.skipif(condition, reason="xxx") 

«Если условие истинно, пропустить, иначе выполнить»

3. Отметьте как ожидаемую функцию отказа.
Язык кода:javascript
копировать
Пометить тестовую функцию как неудавшуюся функцию
 метод:
     xfail(condition=None, reason=None, raises=None, run=True, strict=False)
 частоиспользоватьпараметр:     условие: необходимо передать условие ожидаемого сбоя.
     причина: причина сбоя, необходимо передать параметр
 использоватьметод:
     @pytest.mark.xfail(condition, reason="xx")

«Если условие истинно, отметьте этот вариант использования как пройденный, в противном случае отметьте его как пройденный»

4. Повторите тест

"использовать"@pytest.mark.repeat"Декоратор может запускать пример тестиспользовать повторно"

Язык кода:javascript
копировать
import pytest

@pytest.mark.repeat(3)
def test_something():
    assert 1 + 1 == 2

Этот тестовый пример будет запущен три раза.

5. Тестирование зависимостей

"использовать"@pytest.mark.dependent"Декоратор отмечает зависимости между примерами тестиспользовать, чтобы гарантировать, что предварительные условия выполняются до необходимых тестовиспользовать примеры"

Язык кода:javascript
копировать
import pytest

@pytest.mark.dependency()
def test_login():
    assert True

@pytest.mark.dependency(depends=["test_login"])
def test_access_profile():
    assert True

@pytest.mark.dependency(depends=["test_login"])
def test_access_settings():
    assert True

(4) Повторный запуск после сбоя

Если вариант использования терпит неудачу, его можно запустить повторно.

нуждаться Установитьплагинrerunfailures

「Установитьметод:」

Язык кода:javascript
копировать
pip install pytest-rerunfailures

「использовать Способ:」

Заказ ХОРОШОпараметрформа:

Язык кода:javascript
копировать
# Заказ
pytest --reruns Количество повторов
pytest --reruns 3 : Неудачный пример можно повторить 3 раза.

"расширять"

Язык кода:javascript
копировать
#
pytest --reruns Количество повторов --rerun-dalay Настройка задержки между временами (единица измерения: секунды)

# Список
pytest  --reruns 3 --rerun-dalay 5
Пример неудачного использования можно запустить трижды с интервалом в 5 секунд между каждым повтором.

(5) Укажите порядок выполнения вариантов использования.

Как упоминалось ранее, у pytest есть свой собственный порядок выполнения вариантов использования, но иногда мы просто хотим указать, чтобы он выполнялся по-своему. Есть ли какой-нибудь способ?

У pytest есть плагин, который может реализовать эту функцию,pytest-ordering:обозначениеиспользоватьпримеризтранспорт ХОРОШОзаказ

1. Установите пакеты зависимостей
Язык кода:javascript
копировать
pip install pytest-ordering
2. Использование pytest-упорядочения

«Управление порядком выполнения дел с помощью методов декоратора»

«1. Способ 1:»

Язык кода:javascript
копировать
- Первый выполняет:  @ pytest.mark.run('first')
- Второе исполнение:  @ pytest.mark.run('second')
- взаимный Второе исполнение: @ pytest.mark.run('second_to_last')
- Последняя казнь:  @ pytest.mark.run('last')

«2.Метод 2:»

Язык кода:javascript
копировать
 - Первый выполняет:  @ pytest.mark.first
 - Второе исполнение:  @ pytest.mark.second
 - взаимный Второе исполнение:   @ pytest.mark.second_to_last
 - Последняя казнь:    @pytest.mark.last

«3. Способ третий:»

Язык кода:javascript
копировать
 - Первый выполняет:  @ pytest.mark.run(order=1)
 - Второе исполнение:  @ pytest.mark.run(order=2)
 - взаимный Второе исполнение:   @ pytest.mark.run(order=-2)
 - Последняя казнь:     @ pytest.mark.run(order=-1)

「Выполнять ХОРОШОприоритет:0>меньшеизположительное число>Большеизположительное число>Без пометки>меньшеизотрицательное число>Большеизотрицательное число」

(6) Варианты использования зависят друг от друга

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

Установить
  • существовать Заказ ХОРОШОокно ввода:pip install pytest-dependency
  • Проверять Установить Версия:pip show pytest-dependency
использовать

использоватьметод :использовать @pytest.mark.dependency()зависит отизиспользоватьпример Входить ХОРОШОотметка,использовать@pytest.mark.dependency(depends=["тестиспользоватьпримеримя"]) Ссылочные зависимости, имен тестовых случаев может быть несколько.

Иллюстрировать: Когда экземплярdependentuse не выполняется, экземплярdependentuse пропускается напрямую.

Язык кода:javascript
копировать
# !/usr/bin/python3
# _*_coding:utf-8 _*_
import pytest

@pytest.mark.dependency()
def test_add():
    print("Я test_add использоватьпример")    assert False

@pytest.mark.dependency(depends=["test_add"])
def test_update():
    print("Я test_update использоватьпример")    assert False

@pytest.mark.dependency(depends=["test_add"])
def test_delete():
    print("Я test_delete использоватьпример")    assert True

@pytest.mark.dependency(depends=["test_add"])
def test_select():
    print("Я test_select использоватьпример")    assert True

if __name__ == '__main__':
    pytest.main(["-s"])
  • использовать @pytest.mark.dependent() отмечает зависимые примеры, use@pytest.mark.dependent(dependents=["тестиспользовать имя примера"]) Ссылочные зависимости, имен тестовых случаев может быть несколько.
  • использовать При наличии нескольких зависимостей,Пока есть зависимость, это терпит неудачу,Он пропускается, если зависит от использования.,Все зависимости будут выполнены только в случае успеха.

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

другой

Ошибка 1. Предупреждение об устаревании:

DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead. if version.LooseVersion(pytest.version) >= version.LooseVersion(“6.0”):

Многие в Интернете говорят, что версия слишком низкая или что-то в этом роде.,После проверки я нашел,Не совсем,Но у pytest есть много связанных зависимостей.,Текущая среда использования не может соответствовать некоторым зависимостям, необходимым для вашего pytest.,СравниватьнравитьсяAllureи тому подобноеиз。

Поэтому очень простой подход — воссоздать среду Python и сохранить проект с чистой средой, чтобы не возникало подобных конфликтов зависимостей, предупреждений или даже ошибок в случае взаимного недовольства.

Войдите в виртуальную среду, нажмите «Терминал» в pycharm и выберите «Командная строка». Если перед ним есть скобки, вы вошли в виртуальную среду.

Язык кода:javascript
копировать
#Выходим из виртуальной среды
deactivate
#Войти в виртуальную среду,открыть заново Заказокна быстрее
activate
boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.