[автоматизация 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose