учебник по pytest (2): как вызвать pytest и создать тестовую демонстрацию

1. Установите pytest

pytest требует: Python 3.6, 3.7, 3.8, 3.9 или PyPy3.
(1) Выполните следующую команду в командной строке:

pip install -U pytest

Результаты:
вставьте сюда описание изображения

(2) Проверьте, установлена ​​ли у вас правильная версия:

(venv) E:\auto_pytest>pytest --version
pytest 6.2.3

2. Создайте первый тест

Создайте новый файл с именем test_sample.py, содержащий функцию и тест:

#!/usr/bin/env python 
# encoding: utf-8 
"""
@author: 九九的金金子
@file: test_sample.py.py
@time: 2021/4/12 11:56
"""
# content of test_sample.py
def func(x):
    return x + 1


def test_answer():
    assert func(3) == 5

Исполнение и результаты:

(venv) E:\auto_pytest>pytest test_sample.py
========================================================================== test session starts ==========================================================================
platform win32 -- Python 3.7.9, pytest-6.2.3, py-1.10.0, pluggy-0.13.1
rootdir: E:\auto_pytest
plugins: allure-pytest-2.8.32
collected 1 item                                                                                                                                                         

test_sample.py F                                                                                                                                                   [100%]

=============================================================================== FAILURES ================================================================================
______________________________________________________________________________ test_answer ______________________________________________________________________________

    def test_answer():
>       assert func(3) == 5
E       assert 4 == 5
E        +  where 4 = func(3)

test_sample.py:14: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_sample.py::test_answer - assert 4 == 5
=========================================================================== 1 failed in 0.13s ===========================================================================

[100%] относится к общему прогрессу выполнения всех тестовых случаев. По завершении pytest отображает отчет об ошибке, поскольку func(3) не возвращает 5.

Примечание.
Вы можете использовать операторы assert для проверки ожиданий теста. Промежуточные значения выражений утверждений будут разумно сообщаться в расширенных утверждениях pytest.

3. Запустите несколько тестов

pytest запустит все файлы формы test_.py или _test.py в текущем каталоге и его подкаталогах. В более общем плане он следует стандартным правилам обнаружения тестов.
Утверждение, что было возбуждено исключение.
Используйте помощник повышения, чтобы утверждать, что какой-то код вызвал исключение:

#!/usr/bin/env python 
# encoding: utf-8 
"""
@author: 九九的金金子
@file: test_sysexit.py
@time: 2021/4/12 13:49
"""
# content of test_sysexit.py
import pytest


def f():
    raise SystemExit(1)


def test_mytest():
    with pytest.raises(SystemExit):
        f()

Исполнение и результаты:

(venv) E:\auto_pytest>pytest -q test_sysexit.py
.                                                                                                                                                                  [100%]
1 passed in 0.12s

Флаг q/ --quiet делает вывод коротким в этом и следующих примерах.

4. Сгруппируйте несколько тестов в класс

После того, как вы разработали несколько тестов, вы можете сгруппировать их в класс. pytest позволяет легко создавать классы, содержащие несколько тестов:

#!/usr/bin/env python 
# encoding: utf-8 
"""
@author: 九九的金金子
@file: test_class.py
@time: 2021/4/12 13:52
"""
# content of test_class.py
class TestClass:
    def test_one(self):
        x = "this"
        assert "h" in x

    def test_two(self):
        x = "hello"
        assert hasattr(x, "check")

pytest обнаруживает все тесты, которые следуют соглашению об обнаружении тестов Python, поэтому он обнаруживает две функции с префиксом test_. Не нужно ничего создавать подклассы, но обязательно добавьте к классу префикс Test, иначе класс будет пропущен. Мы можем запустить модуль, просто передав его имя файла:
выполнить с результатом:

(venv) E:\auto_pytest>pytest -q test_class.py
.F                                                                                                                                                                 [100%]
=============================================================================== FAILURES ================================================================================
__________________________________________________________________________ TestClass.test_two ___________________________________________________________________________

self = <test_class.TestClass object at 0x000001934888F248>

    def test_two(self):
        x = "hello"
>       assert hasattr(x, "check")
E       AssertionError: assert False
E        +  where False = hasattr('hello', 'check')

test_class.py:16: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_class.py::TestClass::test_two - AssertionError: assert False
1 failed, 1 passed in 0.12s

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

Группировка тестов в классы выгодна по следующим причинам:

  • организация испытаний
  • Делитесь приборами только для тестов в этом конкретном классе
  • Применяет теги на уровне класса и неявно применяет их ко всем тестам на странице перевода.

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

#!/usr/bin/env python 
# encoding: utf-8 
"""
@author: 九九的金金子
@file: test_class_demo.py
@time: 2021/4/12 13:56
"""
# content of test_class_demo.py
class TestClassDemoInstance:
    def test_one(self):
        assert 0

    def test_two(self):
        assert 0

Исполнение и результаты:

(venv) E:\auto_pytest>pytest -k TestClassDemoInstance -q
FF                                                                                                                                                                 [100%]
=============================================================================== FAILURES ================================================================================
____________________________________________________________________ TestClassDemoInstance.test_one _____________________________________________________________________

self = <test_class_demo.TestClassDemoInstance object at 0x00000228F08E27C8>

    def test_one(self):
>       assert 0
E       assert 0

test_class_demo.py:11: AssertionError
____________________________________________________________________ TestClassDemoInstance.test_two _____________________________________________________________________

self = <test_class_demo.TestClassDemoInstance object at 0x00000228F08DE748>

    def test_two(self):
>       assert 0
E       assert 0

test_class_demo.py:14: AssertionError
======================================================================== short test summary info ========================================================================
FAILED test_class_demo.py::TestClassDemoInstance::test_one - assert 0
FAILED test_class_demo.py::TestClassDemoInstance::test_two - assert 0
2 failed, 5 deselected in 0.19s

Обратите внимание, что атрибуты, добавленные на уровне класса, являются атрибутами класса, поэтому они будут общими для разных тестов.

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

pytest предоставляет встроенные аргументы приспособления/функции для запроса произвольных ресурсов, таких как уникальный временный каталог:

#!/usr/bin/env python 
# encoding: utf-8 
"""
@author: 九九的金金子
@file: test_tmp_path.py
@time: 2021/4/12 13:58
"""
# content of test_tmp_path.py
def test_needsfiles(tmp_path):
    print(tmp_path)
    assert 0

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

(venv) E:\auto_pytest>pytest -q test_tmp_path.py
F                                                                                                                                                                  [100%]
=============================================================================== FAILURES ================================================================================
____________________________________________________________________________ test_needsfiles ____________________________________________________________________________

tmp_path = WindowsPath('C:/Users/01399256/AppData/Local/Temp/pytest-of-01399256/pytest-2/test_needsfiles0')

    def test_needsfiles(tmp_path):
        print(tmp_path)
>       assert 0
E       assert 0

test_tmp_path.py:11: AssertionError
------------------------------------------------------------------------- Captured stdout call --------------------------------------------------------------------------
C:\Users\01399256\AppData\Local\Temp\pytest-of-01399256\pytest-2\test_needsfiles0
======================================================================== short test summary info ========================================================================
FAILED test_tmp_path.py::test_needsfiles - assert 0
1 failed in 0.19s

Дополнительную информацию об обработке временных каталогов можно найти в разделе Временные каталоги и файлы.

Узнайте, какой тип встроенного приспособления pytest существует для этой команды:

pytest --fixtures   # shows builtin and custom fixtures

Обратите внимание, что если не добавлена ​​опция -v, эта команда пропустит приборы, начинающиеся с _.

Supongo que te gusta

Origin blog.csdn.net/daxiangaifashi/article/details/115620126
Recomendado
Clasificación