Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
Оглавление
2. Функции настройки и удаления Pytest
4 часто используемых плагина Pytest
4.2 Отчет о тестировании Pytest
5. Расширенное использование pytest (1)
5.2Первый пример приспособления (на который ссылаются параметры)
5.3.Второй пример приспособления (на который ссылается функция)
5.4. Третий пример приспособления (запускается настройка по умолчанию)
5.5.Четвертый пример фикстуры (установка области действия функции)
5.6.Пятый пример исправления (установите область действия на класс)
5.7.Шестой пример фикстуры (возвращаемое значение)
6. Расширенное использование Pytest (2)
6.1. Пропустить функции тестирования.
6.2 Отметить функции как ожидаемые неудачные
6.3 Параметризация функциональных данных
6.4 Изменение вывода трассировки Python
6.5 Переход к PDB при сбое выполнения
6.7 Получение данных о производительности выполнения вариантов использования
6.8 Генерация файлов результатов в формате JUnitXML
6.10 Вызов pytest из кода Python
6.11. Быстрое развертывание virtualenv, содержащего pytest, после переноса тестового сценария.
PythonтестФреймворк уже использовался ранееunittest+HTMLTestRunner,Я слышал, как кто-то сказал, что pytest очень полезен.,Поэтому за это время я просмотрел документацию pytest.,существоватьздесьсделать запись。
Официальное введение документа:
Pytest is a framework that makes building simple and scalable tests easy. Tests are expressive and readable—no boilerplate code required. Get started in minutes with a small unit test or complex functional test for your application or library.
pytest — это очень зрелая полнофункциональная среда тестирования Python со следующими основными функциями:
1.1 Установка
pip install -U pytest
1.2 Проверка установки
pytest --version # Он покажет, что версия в данный момент установлена.
1.3pytest документация
Официальная документация:https://docs.pytest.org/en/latest/contents.html
В рамках pytest существуют следующие ограничения:
Имена всех отдельных тестовых файлов должны соответствовать формату test_*.py или *_test.py. В одном тестовом файле тестовый класс начинается с Test и не может иметь init Метод (примечание: при определении класса он должен начинаться с T, иначе pytest не запустит класс) В один тестовый класс вы можете включить одну или несколько функций, начинающихся с test_. В это время при выполнении команды pytest она автоматически найдет тестовую функцию, которая соответствует вышеуказанным ограничениям, из текущего Оглавления и суб-Оглавления для выполнения.
1.4 Как запустить Pytest
# file_name: test_abc.py
import pytest # Представляем пакет pytest
def test_a(): # тестовая функция, начинающаяся с test
print("------->test_a")
assert 1 # Подтвердить успех
def test_b():
print("------->test_b")
assert 0 # Утверждение не выполнено
if __name__ == '__main__':
pytest.main("-s test_abc.py") # Вызовите основную функцию pytest для выполнения теста.
1. Режим основной функции тестового класса
pytest.main("-s test_abc.py")
2. Режим командной строки
pytest Путь к файлу/имя тестового файла
Например: pytest ./test_abc.py
1.5 Список значений кода выхода Pytest
1.6 Как получить справочную информацию
Посмотреть версию pytest
pytest --version
Показать доступные параметры встроенной функции
pytest --fixtures
Просмотр справочной информации и параметров файла конфигурации через командную строку
pytest --help
1.7 Выполнение контрольного тестового примера
1. После того, как N-й тестовый пример завершился неудачно, завершите выполнение теста.
pytest -x # Если тест не пройден в первый раз, остановите тест.
pytest --maxfail=2 # Прекратить работу, если произойдет 2 сбоя
2. Укажите тестовый модуль
pytest test_mod.py
3. указано тест Оглавление
pytest testing/
4. Фильтрация выполнения с помощью выражений ключевых слов
pytest -k "MyClass and not method"
Эта команда будет соответствовать варианту использования, где имя файла, имя класса и имя метода соответствуют выражению. Здесь эта команда запустит TestMyClass.test_something, но не выполнит TestMyClass.test_method_simple.
5. Укажите тестовые примеры по идентификатору узла.
nodeid состоит из имени файла модуля, разделителя, имени класса, имени метода и параметров. Примеры: Запустите указанный вариант использования в модуле
pytest test_mod.py::test_func
Запустите указанный метод в модуле
ytest test_mod.py::TestClass::test_method
6. Выполнение через выражения меток
pytest -m slow
Эта команда выполнит все тестовые примеры, украшенные декоратором @pytest.mark.slow.
7. Выполнение тестов через пакеты
pytest --pyargs pkg.testing
Эта команда автоматически импортирует пакет pkg.testing,и используйте Оглавление там, где находится посылка,Выполните приведенный ниже вариант использования.
1.8 Случаи выполнения нескольких процессов
Если случаев много, время выполнения также станет очень большим. Если вы хотите сократить время выполнения сценария, вы можете использовать несколько процессов для его запуска.
Установите pytest-xdist:
pip install -U pytest-xdist
Режим работы:
pytest test_se.py -n NUM
NUM заполняет количество параллельных процессов.
1.9 Повторная попытка запуска случаев
При тестировании интерфейса вы можете столкнуться с ошибкой 503 или кратковременными колебаниями сети, что приведет к сбою дела. Это не тот результат, который мы ожидаем. В настоящее время вы можете решить проблему, повторив попытку.
Установите pytest-rerunfailures:
pip install -U pytest-rerunfailures
Режим работы:
pytest test_se.py --reruns NUM
ЧИСЛО заполняет количество повторов.
1.10 Отображение содержимого печати
При запуске тестового сценария, чтобы отладить или распечатать некоторый контент, мы добавим в код некоторый контент для печати, но при запуске pytest этот контент не будет отображаться. Если вы введете -s, его можно будет отобразить.
Режим работы:
pytest test_se.py -s
Кроме того, несколько режимов запуска pytest могут выполняться наложенным образом. Например, если вы хотите запустить 4 процесса одновременно, вам также нужно распечатать содержимое печати. Может использоваться:
pytest test_se.py -s -n 4
1. Установка и демонтаж в основном делятся на: уровень модуля, уровень класса, функциональный уровень и функциональный уровень. 2. Существует внутри тестового класса. Пример кода:
Запускайте в начале и в конце метода тестирования, то есть: при однократном запуске тестовой функции запустится установка и отключение один раз.
import pytest
class Test_ABC:
# Функциональный уровень начинается
def setup(self):
print("------->setup_method")
# конец функционального уровня
def teardown(self):
print("------->teardown_method")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->setup_method # первый setup()
------->test_a
.
------->teardown_method # первый teardown()
------->setup_method # второй раз setup()
------->test_b
.
------->teardown_method # второй раз teardown()
Запускаться в начале и в конце тестового класса, то есть: запускать setup_class и Teardown_class только один раз в тесте, независимо от того, сколько тестовых функций имеется в тестовом классе. Пример кода:
import pytest
class Test_ABC:
# начинается уровень тест-класса
def setup_class(self):
print("------->setup_class")
# Конец уровня тесттеста
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->setup_class # первый setup_class()
------->test_a
.
------->test_b
F
------->teardown_class # первый teardown_class()
Файл конфигурации pytest обычно находится в разделе Тест Оглавление.,Имя: pytest.ini.,Конфигурация из этого файла конфигурации будет использоваться при запуске командной строки.
#Настроить параметры запуска командной строки pytest
[pytest]
addopts = -s ... # Можно добавить несколько параметров командной строки, разделенных пробелами. -Все параметры — это конфигурация параметров пакета плагина и путь, который ищет тест.
testpaths = ./scripts # Папка скриптов под текущим Оглавлением -Настраиваемый
#Настройте имя файла, который ищет тест
python_files = test*.py
#Папка скриптов под текущим Оглавлением Вниз,начни с теста,Все файлы, заканчивающиеся на .py -Настраиваемый
Настройте имя тестового класса для поиска тестов
python_classes = Test_*
#Папка скриптов под текущим Оглавлением Вниз,начни с теста,во всех файлах, заканчивающихся на .py,кTestурок в начале -Настраиваемый
Настройте имя тестовой функции для поиска тестов
python_functions = test_*
#Папка скриптов под текущим Оглавлением Вниз,начни с теста,во всех файлах, заканчивающихся на .py,Внутри класса, начинающегося с Test,кtest_Как начать -Настраиваемый
плагин Список URL:https://plugincompat.herokuapp.com Он содержит множество пакетов плагинов, которые вы можете использовать в соответствии с вашими рабочими потребностями.
1. Путь к файлу:
- Test_App
- - test_abc.py
- - pytest.ini
Содержимое файла конфигурации 2.pyetst.ini:
[pytest]
# Параметры командной строки
addopts = -s
# Поиск по имени файла
python_files = test_*.py
# Имя класса для поиска
python_classes = Test_*
#Название функции поиска
python_functions = test_*
pytest-HTML — это плагин pytest для HTML-отчетов о результатах тестов. Совместимость с Python 2.7,3.6.
Способ установки: pip install pytest-html.
pip install pytest-html
Через командную строку отчет о тестировании в формате xml/html сохраняется по указанному пользователем пути. имя плагина: pytest-html Как использовать: Формат командной строки: pytest –html=путь пользователя/report.html
Пример:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
assert 0 # Утверждение не выполнено```
Как запустить:
1. ИсправитьTest_App/pytest.ini, добавить параметры отчета, а именно: addopts = -s --html=./report.html
# -s:выход информации о работе программы
# --html=./report.html сократить файл report.html под текущим Оглавлением
️ Чтобы получить XML-файл, установите --html=./report.html. Изменить на --html=./report.xml
2. Введите Test_AppОглавление из командной строки.
3. Выполните команду: pytest
Результат выполнения:
1. В текущем Оглавлении будет уменьшена папкаassets и файл report.html.
Предпосылки:
1. Путь к файлу:
Test_App
- - test_abc.py
- - pytest.ini
Содержимое файла конфигурации 2.pyetst.ini:
[pytest]
Параметры командной строки
addopts = -s
Поиск по имени файла
python_files = test*.py
Имя класса для поиска
python_classes = Test*
Название функции поиска
python_functions = test_*
Декоратор фикстуры отмечает фиксированную заводскую функцию, которая будет активирована и выполнена первой, когда ее вызовут другие функции, модули, классы или весь проект. Обычно она используется для завершения предустановленной обработки и повторяющихся операций.
Метод: fixment(scope="function", params=None, autouse=False, ids=None, name=None) Часто используемые параметры:
область действия: область действия отмеченного метода.
function" (по умолчанию): действует для каждого метода теста и запускается один раз для каждого теста.
«класс»: применяется ко всему классу, все тесты каждого класса запускаются только один раз.
«модуль»: применяется ко всему модулю, все тесты каждого модуля запускаются только один раз.
«сеанс: применяется ко всему сеансу (используйте с осторожностью), каждый сеанс запускается только один раз.
params: (тип списка) предоставляет данные параметров для использования функциями, вызывающими отмеченные методы.
autouse: запускать ли автоматически. Значение по умолчанию — False и не запускается. Установите значение True для автоматического запуска.
Пример:
class Test_ABC:
@pytest.fixture()
def before(self):
print("------->before")
def test_a(self,before): # ️ Метод test_a передает функцию, идентифицированную приспособлением, в виде переменной.
print("------->test_a")
assert 1
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->before # Обнаружено, что before будет запускаться перед функцией тестирования.
------->test_a
.
Пример:
import pytest
@pytest.fixture() # Функции, отмеченные фикстурами, могут применяться вне тестового класса.
def before():
print("------->before")
@pytest.mark.usefixtures("before")
class Test_ABC:
def setup(self):
print("------->setup")
def test_a(self):
print("------->test_a")
assert 1
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->before # Обнаружено, что before будет работать преимущественно над тестовым классом.
------->setup
------->test_a
.
Пример:
import pytest
@pytest.fixture(autouse=True) # Установить запуск по умолчанию
def before():
print("------->before")
class Test_ABC:
def setup(self):
print("------->setup")
def test_a(self):
print("------->test_a")
assert 1
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->before # Обнаружено, что before автоматически имеет приоритет над тестовым классом.
------->setup
------->test_a
.
Пример:
import pytest
@pytest.fixture(scope='function',autouse=True) # Область настроена на работу и запускается автоматически
def before():
print("------->before")
class Test_ABC:
def setup(self):
print("------->setup")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
assert 1
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->before # бегатьпервый
------->setup
------->test_a
.------->before # бегатьвторой раз
------->setup
------->test_b
.
Пример:
import pytest
@pytest.fixture(scope='class',autouse=True) # Область действия установлена на класс и запускается автоматически.
def before():
print("------->before")
class Test_ABC:
def setup(self):
print("------->setup")
def test_a(self):
print("------->test_a")
assert 1
def test_b(self):
print("------->test_b")
assert 1
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->before # Обнаружил, что он запускается только один раз
------->setup
------->test_a
.
------->setup
------->test_b
.
Пример первый:
import pytest
@pytest.fixture()
def need_data():
return 2 # Возврат номер 2
class Test_ABC:
def test_a(self,need_data):
print("------->test_a")
assert need_data != 3 # Получите возвращаемое значение и сделайте утверждение
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
test_abc.py
------->test_a
.
``
Пример второй:
import pytest
@pytest.fixture(params=[1, 2, 3])
def need_data(request): # Передать запрос параметра Параметры системного пакета
return request.param # Получите одно значение в списке, метод значения по умолчанию.
class Test_ABC:
def test_a(self,need_data):
print("------->test_a")
assert need_data != 3 # Утвердить, что значение Need_data не равно 3.
if __name__ == '__main__':
pytest.main("-s test_abc.py")
Результат выполнения:
# Можно обнаружить, что результаты обрабатывались три раза.
test_abc.py
1
------->test_a
.
2
------->test_a
.
3
------->test_a
F
Предпосылки:
1. Путь к файлу:
- Test_App
- - test_abc.py
- - pytest.ini
Содержимое файла конфигурации 2.pyetst.ini:
[pytest]
Параметры командной строки
addopts = -s
Поиск по имени файла
python_files = test_*.py
Имя класса для поиска
python_classes = Test_*
Название функции поиска
python_functions = test_*
При определенных условиях указанная тестовая функция не выполняется.
метод:
skipif(condition, reason=None)
параметр:
условие: условие, которое нужно пропустить, необходимо передать параметры
причина: отметьте причину, необходимо передать параметры
Как использовать:
@pytest.mark.skipif(condition, reason="xxx")
Пример:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
@pytest.mark.skipif(condition=2>1,reason = «Пропустить эту функцию») # Пропустить проверку функции test_b
def test_b(self):
print("------->test_b")
assert 0
Результат выполнения:
test_abc.py
------->setup_class
------->test_a #Выполняется только функция test_a
.
------->teardown_class
s # Пропустить функцию```
Пометить тестовую функцию как неудавшуюся функцию
метод:
xfail(condition=None, reason=None, raises=None, run=True, strict=False)
Обычно используетсяпараметр:
условие: ожидаемое условие отказа, необходимо передать параметры
причина: причина сбоя, необходимые параметры
Как использовать:
@pytest.mark.xfail(condition, reason="xx")
Пример:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
def test_a(self):
print("------->test_a")
assert 1
@pytest.mark.xfail(2 > 1, Reason="Отметить как ожидаемый сбой") # Отметить как ожидаемую функцию отказаtest_b
def test_b(self):
print("------->test_b")
assert 0
Результат выполнения:
test_abc.py
------->setup_class
------->test_a
.
------->test_b
------->teardown_class
x # знак отказа
Для функции test удобно получать атрибут.
метод:
parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
Обычно используетсяпараметр:
arnames: имя параметра
argvalues: значение, соответствующее параметру, тип должен быть списком.
Если параметр равен единице, формат: [значение]
Если количество параметров больше одного, используется следующий формат: [(значение_параметра1,значение_параметра2....),(значение_параметра1,значение_параметра2....)]
Как использовать:
@pytest.mark.parametrize(argnames,argvalues)
️ Если значение параметра равно N, метод тестирования будет запущен N раз.
Один параметр
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
@pytest.mark.parametrize("a",[3,6]) # Параметру a присваивается два значения, и функция запускается дважды.
def test_a(self,a): # Параметры должны соответствовать параметрам в параметризации.
print("test data:a=%d"%a)
assert a%3 == 0
Результат выполнения:
test_abc.py
------->setup_class
test data:a=3 # бегатьпервыйценитьa=3
.
test data:a=6 # бегатьвторой разценитьa=6
.
------->teardown_class
Несколько параметров Пример:
import pytest
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
@pytest.mark.parametrize("a,b",[(1,2),(0,3)]) # Параметрам a и b присвоено два значения, и функция будет запущена дважды.
def test_a(self,a,b): # Параметры должны соответствовать параметрам в параметризации.
print("test data:a=%d,b=%d"%(a,b))
assert a+b == 3
Результат выполнения:
test_abc.py
------->setup_class
test data:a=1,b=2 # бегатьпервыйценить a=1,b=2
.
test data:a=0,b=3 # бегатьвторой разценить a=0,b=3
.
------->teardown_class
Тип возвращаемого значения функции
import pytest
def return_test_data():
return [(1,2),(0,3)]
class Test_ABC:
def setup_class(self):
print("------->setup_class")
def teardown_class(self):
print("------->teardown_class")
@pytest.mark.parametrize("a,b",return_test_data()) # Используйте возвращаемые значения функции для передачи значений параметров
def test_a(self,a,b):
print("test data:a=%d,b=%d"%(a,b))
assert a+b == 3
Результат выполнения:
test_abc.py
------->setup_class
test data:a=1,b=2 # бегатьпервыйценить a=1,b=2
.
test data:a=0,b=3 # бегатьвторой разценить a=0,b=3
.
------->teardown_class
pytest --showlocals # show local variables in tracebacks
pytest -l # show local variables (shortcut)
pytest --tb=auto # (default) 'long' tracebacks for the first and last
# entry, but 'short' style for the other entries
pytest --tb=long # exhaustive, informative traceback formatting
pytest --tb=short # shorter traceback format
pytest --tb=line # only one line per failure
pytest --tb=native # Python standard library formatting
pytest --tb=no # no traceback at all
–full-trace параметр будет печатать больше информации о выходных ошибках, чем параметр –tb=long больше, даже Ctrl+C Вызванные ошибки также будут напечатаны.
При выполнении варианта использования следуйте параметру –pdb, чтобы в случае сбоя он автоматически переходил к PDB каждый раз, когда возникает сбой.
pytest --pdb # Каждый раз, когда происходит сбой, переходите к PDB
pytest -x --pdb # первый переход при возникновении неудачи PDB, завершение выполнения теста
pytest --pdb --maxfail=3 # Только первые три неудачи перейдут на PDB
существовать Добавьте в сценарий варианта использования следующее:Внизpythonкод,pytest автоматически закроет сканирование, выполняющее выход,здесь,Другие тестовые сценарии не будут затронуты.,Предыдущий тест теста с точкой останова - нормальный выход
import pdb; pdb.set_trace()
Получите время выполнения 10 самых медленных вариантов использования
pytest --durations=10
Этот формат файла результатов может быть проанализирован Jenkins или другими инструментами CI.
pytest --junitxml=path
Например, отключите плагин doctest.
pytest -p no:doctest
pytest.main() # Основное использование
pytest.main(['-x', 'mytestdir']) # Передача параметров конфигурации
// Укажите собственный или дополнительный плагин
# content of myinvoke.py
import pytest
class MyPlugin(object):
def pytest_sessionfinish(self):
print("*** test run reporting finishing")
pytest.main(["-qq"], plugins=[MyPlugin()])
Например, вы клонируете тестовый скрипт, написанный Daodao от команды проекта, со склада Gitlab на собственный компьютер.,Ты хочешь чего-то,и отлаживать,Что делать? Вы можете быстро создать VirtualEnv с помощью следующих операций.
cd <repository>
pip install -e .
This will set up a symlink to your code in site-packages, allowing you to edit your code while your tests run against it as if it were installed. Setting up your project in development mode lets you avoid having to reinstall every time you want to run your tests, and is less brittle than mucking about with sys.path to point your tests at local code. Also consider using tox
вопрос: pytest может вывести html-отчет о покрытии
Используйте команду следующим образом:
pytest -vv --cov=./ --cov-report=html
open htmlcov/index.html
Вы можете столкнуться с ошибкой:
(venv) zhangxiaofans-MacBook-Pro:mgap-mendel joe$ pytest --cov-report=html
usage: pytest [options] [file_or_dir] [file_or_dir] [...]
pytest: error: unrecognized arguments: --cov-report=html
inifile: None
rootdir: /Users/joe/workspace/platform/mgap-mendel/mgap-mendel
причина: Отсутствует пакет pytest cov
Решение
pip install pytest-cov
Если вам интересно, вы можете подписаться на мою общедоступную учетную запись WeChat «Полный стек автоматического тестирования», идентификатор WeChat: QAlife, чтобы узнать больше о технологии автоматического тестирования.
Вы также можете присоединиться к нашей группе обмена технологиями автоматического тестирования, номер группы QQ: 301079813.
В основном обсуждается тестирование Loadrunner/JMeter, автоматическое тестирование Selenium/RobotFramework/Appium, автоматическое тестирование интерфейсов, инструменты тестирования и другие технологии тестирования. Давайте придем сюда, чтобы поделиться опытом, обменяться технологиями, подружиться, расширить свой кругозор и работать вместе!
Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/137163.html Исходная ссылка: https://javaforall.cn