@pytest.mark.parametrize("Имя параметра", данные списка)
'''
Имя параметра:использовать для получения каждого элемента данных в качестве примера тестиспользовать параметра.
Данные списка: набор данных.
'''
@pytest.mark.parametrize(self,argnames, argvalues, indirect=False, ids=None, scope=None)):
параметр | иллюстрировать |
---|---|
argnames | Должно пройти, имя параметра,строка, разделенная запятыми,Представляет одно или несколько имен параметров (ключей).,или список/кортеж строк параметров |
argvalues | Должен пройти,параметрценить,Если есть один аргумент, передается один список значений.,Если имеется несколько имен аргументов,Отображается в виде списка используемых кортежей.,Кортеж имеет взаимно однозначное соответствие с именем параметра. |
indirect | Если это правда, argnames должно быть именем функции фикстуры, а значение argvalues будет передано в соответствующую фикстуру, что эквивалентно использованию @pytest.fixture(params=). По умолчанию установлено значение False. |
ids | Имя выполнения подварианта использования, соответствующее количеству значений аргументов, генерируется автоматически, если не указано, по умолчанию Нет |
scope | нравиться Если указано,Это означает диапазон параметра. Область использования используется для группировки тестов по экземплярам параметров. Это также переопределит область действия любого определения функции прибора.,Разрешить использованиетестового контекста или конфигурации для установки динамического диапазона. |
#пример
# Здесь имя параметра 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 =========================
«Комбинированный параметр» :несколько групппараметр,Соединяем последовательно,Декартово произведение
@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 наборов тестовых примеров
============================= 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
1. Файл конфигурации pytest может изменить режим работы pytest. Это фиксированный файл pytest.ini. Он считывает информацию о конфигурации и запускает ее указанным способом.
2. Расположение: обычно размещается в корневом каталоге проекта (то есть в папке верхнего уровня текущего проекта).
3. Имя: pytest.ini.,Невозможно использовать китайские символы,включая кандзи、космос、кавычки、Колон и т. д.
4. Правила выполнения: независимо от того, работаете ли вы в режиме основной функции или в режиме командной строки, этот глобальный файл конфигурации будет автоматически прочитан.
"Шили"
[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
«Маркировка: функция маркировки»
«1. Сначала необходимо зарегистрировать имя тега»
pytest.ini
[pytest]
markers =
mark1: Тег иллюстрировать (только на английском языке, писать не нужно)
mark2: Тег иллюстрировать (только на английском языке, писать не нужно)
mark3: Тег иллюстрировать (только на английском языке, писать не нужно)
«2. Отметьте тестовые примеры/тестовые классы»
базовыйиспользовать
@pytest.mark.Зарегистрированный знак
# нравиться
@pytest.mark.mark1
Тег в категории тест,использовать Следующее утверждение (в категории test,Все случаи маркируются этой меткой):
class TestClass():
pytestmark = pytest.mark.Зарегистрированное имя тега
# или Режим нескольких вкладок
pytestmark = [pytest.mark.Имя тега 1, pytest.mark.Имя тега 2]
Теги в файлах модулей,использовать следующий оператор (в файле py,Все функции и тестовые тестовые функции в классе тестов,все помечены этим ярлыком)
import pytest
pytestmark = pytest.mark.Зарегистрированное имя тега
# или Режим нескольких вкладок
pytestmark = [pytest.mark.Имя тега 1, pytest.mark.Имя тега 2]
«3. Настройте среду выполнения, чтобы запускать только отмеченные варианты использования»
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 | отметка отметка |
@pytest.mark.skip
@pytest.mark.skipif
При определенных условиях указанная тестовая функция не выполняется.
метод:
skipif(condition, reason=None)
параметр:
условие: пропущенное условие, необходимо передать параметр
причина: отметьте причину, необходимо передать параметр
использоватьметод:
@pytest.mark.skipif(condition, reason="xxx")
«Если условие истинно, пропустить, иначе выполнить»
Пометить тестовую функцию как неудавшуюся функцию
метод:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
частоиспользоватьпараметр: условие: необходимо передать условие ожидаемого сбоя.
причина: причина сбоя, необходимо передать параметр
использоватьметод:
@pytest.mark.xfail(condition, reason="xx")
«Если условие истинно, отметьте этот вариант использования как пройденный, в противном случае отметьте его как пройденный»
"использовать"@pytest.mark.repeat"Декоратор может запускать пример тестиспользовать повторно"
import pytest
@pytest.mark.repeat(3)
def test_something():
assert 1 + 1 == 2
Этот тестовый пример будет запущен три раза.
"использовать"@pytest.mark.dependent"Декоратор отмечает зависимости между примерами тестиспользовать, чтобы гарантировать, что предварительные условия выполняются до необходимых тестовиспользовать примеры"
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
Если вариант использования терпит неудачу, его можно запустить повторно.
нуждаться Установитьплагинrerunfailures
「Установитьметод:」
pip install pytest-rerunfailures
「использовать Способ:」
Заказ ХОРОШОпараметрформа:
# Заказ
pytest --reruns Количество повторов
pytest --reruns 3 : Неудачный пример можно повторить 3 раза.
"расширять"
#
pytest --reruns Количество повторов --rerun-dalay Настройка задержки между временами (единица измерения: секунды)
# Список
pytest --reruns 3 --rerun-dalay 5
Пример неудачного использования можно запустить трижды с интервалом в 5 секунд между каждым повтором.
Как упоминалось ранее, у pytest есть свой собственный порядок выполнения вариантов использования, но иногда мы просто хотим указать, чтобы он выполнялся по-своему. Есть ли какой-нибудь способ?
У pytest есть плагин, который может реализовать эту функцию,pytest-ordering
:обозначениеиспользоватьпримеризтранспорт ХОРОШОзаказ
pip install pytest-ordering
«Управление порядком выполнения дел с помощью методов декоратора»
«1. Способ 1:»
- Первый выполняет: @ pytest.mark.run('first')
- Второе исполнение: @ pytest.mark.run('second')
- взаимный Второе исполнение: @ pytest.mark.run('second_to_last')
- Последняя казнь: @ pytest.mark.run('last')
«2.Метод 2:»
- Первый выполняет: @ pytest.mark.first
- Второе исполнение: @ pytest.mark.second
- взаимный Второе исполнение: @ pytest.mark.second_to_last
- Последняя казнь: @pytest.mark.last
«3. Способ третий:»
- Первый выполняет: @ pytest.mark.run(order=1)
- Второе исполнение: @ pytest.mark.run(order=2)
- взаимный Второе исполнение: @ pytest.mark.run(order=-2)
- Последняя казнь: @ pytest.mark.run(order=-1)
「Выполнять ХОРОШОприоритет:0>меньшеизположительное число>Большеизположительное число>Без пометки>меньшеизотрицательное число>Большеизотрицательное число」
Сценарий: существует операционная функция, связанная с добавлением, удалением, изменением и запросом.,При сбое добавления эффекта операции,Операции удаления, изменения и запроса не выполняются.,Как справиться с этим сценарием? Плагин pytest сделал это за нас.,Все, что нам нужно, это просто использовать.
pip install pytest-dependency
pip show pytest-dependency
использоватьметод :использовать @pytest.mark.dependency()
зависит отизиспользоватьпример Входить ХОРОШОотметка,использовать@pytest.mark.dependency(depends=["тестиспользоватьпримеримя"])
Ссылочные зависимости, имен тестовых случаев может быть несколько.
Иллюстрировать: Когда экземплярdependentuse не выполняется, экземплярdependentuse пропускается напрямую.
# !/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"])
В библиотеке плагинов также есть другие плагины и функции, которые вы можете изучить самостоятельно.
DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead. if version.LooseVersion(pytest.version) >= version.LooseVersion(“6.0”):
Многие в Интернете говорят, что версия слишком низкая или что-то в этом роде.,После проверки я нашел,Не совсем,Но у pytest есть много связанных зависимостей.,Текущая среда использования не может соответствовать некоторым зависимостям, необходимым для вашего pytest.,СравниватьнравитьсяAllureи тому подобноеиз。
Поэтому очень простой подход — воссоздать среду Python и сохранить проект с чистой средой, чтобы не возникало подобных конфликтов зависимостей, предупреждений или даже ошибок в случае взаимного недовольства.
Войдите в виртуальную среду, нажмите «Терминал» в pycharm и выберите «Командная строка». Если перед ним есть скобки, вы вошли в виртуальную среду.
#Выходим из виртуальной среды
deactivate
#Войти в виртуальную среду,открыть заново Заказокна быстрее
activate