Подробное объяснение pytest, среды тестирования Python.
Подробное объяснение pytest, среды тестирования Python.

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

Оглавление

Предисловие

1.установка pytest

2. Функции настройки и удаления Pytest

3. Файл конфигурации Pytest.

4 часто используемых плагина Pytest

4.1 Предварительные условия:

4.2 Отчет о тестировании Pytest

5. Расширенное использование pytest (1)

5.1 pytest приспособление

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.6 Установка точек останова

6.7 Получение данных о производительности выполнения вариантов использования

6.8 Генерация файлов результатов в формате JUnitXML

6.9 Отключить плагины

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 со следующими основными функциями:

  • Простой, гибкий и простой в использовании
  • Поддержка параметризации
  • Он может поддерживать простые модули и сложные функции, а также может использоваться для автоматизации и автоматизации интерфейсов (pytest+запросы), таких как selenium/appnium.
  • pytest имеет много сторонних плагинов,И может быть настроен и расширен,Наиболее полезными являются pytest-selenium (интегрированный селен), pytest-html. (идеальный отчет htmlтеста примерно)、pytest-rerunfailures (повторное выполнение неудачных случаев)、pytest-xdist (многопроцессорный дистрибутив) и т. д.
  • Обработка варианта использования пропуска и xfail теста
  • Может хорошо интегрироваться с Дженкинсом.
  • Платформа отчетов — allure также поддерживает pytest.

1.установка pytest

1.1 Установка

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

1.2 Проверка установки

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
 # 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. Режим основной функции тестового класса

Язык кода:javascript
копировать
  pytest.main("-s  test_abc.py")

2. Режим командной строки

Язык кода:javascript
копировать
  pytest Путь к файлу/имя тестового файла
  Например: pytest ./test_abc.py

1.5 Список значений кода выхода Pytest

  • Код выхода 0 Все варианты использования были выполнены и все пройдены.
  • Код выхода 1. Все варианты использования были выполнены, и имеется вариант использования с ошибкой.
  • Код выхода 2. Пользователь прервал выполнение теста.
  • Код выхода 3 теста Во время выполнения произошла внутренняя ошибка.
  • Код выхода 4. Ошибка использования командной строки pytest.
  • Exit code 5 Никаких доступных файлов тестовых сценариев собрано не было.

1.6 Как получить справочную информацию

Посмотреть версию pytest

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

Показать доступные параметры встроенной функции

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

Просмотр справочной информации и параметров файла конфигурации через командную строку

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

1.7 Выполнение контрольного тестового примера

1. После того, как N-й тестовый пример завершился неудачно, завершите выполнение теста.

Язык кода:javascript
копировать
pytest -x                    # Если тест не пройден в первый раз, остановите тест.
pytest --maxfail=2     # Прекратить работу, если произойдет 2 сбоя

2. Укажите тестовый модуль

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

3. указано тест Оглавление

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

4. Фильтрация выполнения с помощью выражений ключевых слов

Язык кода:javascript
копировать
pytest -k "MyClass and not method"

Эта команда будет соответствовать варианту использования, где имя файла, имя класса и имя метода соответствуют выражению. Здесь эта команда запустит TestMyClass.test_something, но не выполнит TestMyClass.test_method_simple.

5. Укажите тестовые примеры по идентификатору узла.

nodeid состоит из имени файла модуля, разделителя, имени класса, имени метода и параметров. Примеры: Запустите указанный вариант использования в модуле

Язык кода:javascript
копировать
pytest test_mod.py::test_func

Запустите указанный метод в модуле

Язык кода:javascript
копировать
ytest test_mod.py::TestClass::test_method

6. Выполнение через выражения меток

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

Эта команда выполнит все тестовые примеры, украшенные декоратором @pytest.mark.slow.

7. Выполнение тестов через пакеты

Язык кода:javascript
копировать
pytest --pyargs pkg.testing

Эта команда автоматически импортирует пакет pkg.testing,и используйте Оглавление там, где находится посылка,Выполните приведенный ниже вариант использования.

1.8 Случаи выполнения нескольких процессов

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

Установите pytest-xdist:

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

Режим работы:

Язык кода:javascript
копировать
pytest test_se.py -n NUM

NUM заполняет количество параллельных процессов.

1.9 Повторная попытка запуска случаев

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

Установите pytest-rerunfailures:

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

Режим работы:

Язык кода:javascript
копировать
pytest test_se.py --reruns NUM

ЧИСЛО заполняет количество повторов.

1.10 Отображение содержимого печати

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

Режим работы:

Язык кода:javascript
копировать
pytest test_se.py -s

Кроме того, несколько режимов запуска pytest могут выполняться наложенным образом. Например, если вы хотите запустить 4 процесса одновременно, вам также нужно распечатать содержимое печати. Может использоваться:

Язык кода:javascript
копировать
pytest test_se.py -s -n 4

2. Функции настройки и удаления Pytest

1. Установка и демонтаж в основном делятся на: уровень модуля, уровень класса, функциональный уровень и функциональный уровень. 2. Существует внутри тестового класса. Пример кода:

  • Настройка уровня функции()/снос()

Запускайте в начале и в конце метода тестирования, то есть: при однократном запуске тестовой функции запустится установка и отключение один раз.

Язык кода:javascript
копировать
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")
Язык кода:javascript
копировать
Результат выполнения:
  test_abc.py 
  ------->setup_method # первый setup()
  ------->test_a
  .
  ------->teardown_method # первый teardown()
  ------->setup_method # второй раз setup()
  ------->test_b
  .
          ------->teardown_method # второй раз teardown()
  • 2.2. Уровень класса

Запускаться в начале и в конце тестового класса, то есть: запускать setup_class и Teardown_class только один раз в тесте, независимо от того, сколько тестовых функций имеется в тестовом классе. Пример кода:

Язык кода:javascript
копировать
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")
Язык кода:javascript
копировать
Результат выполнения:
  test_abc.py 
  ------->setup_class # первый setup_class()
  ------->test_a
  .
  ------->test_b
  F 
          ------->teardown_class # первый teardown_class()

3. Файл конфигурации Pytest.

Файл конфигурации pytest обычно находится в разделе Тест Оглавление.,Имя: pytest.ini.,Конфигурация из этого файла конфигурации будет использоваться при запуске командной строки.

Язык кода:javascript
копировать
#Настроить параметры запуска командной строки pytest
   [pytest]
    addopts = -s ... # Можно добавить несколько параметров командной строки, разделенных пробелами. -Все параметры — это конфигурация параметров пакета плагина и путь, который ищет тест.
    testpaths = ./scripts  # Папка скриптов под текущим Оглавлением -Настраиваемый
#Настройте имя файла, который ищет тест
    python_files = test*.py 
#Папка скриптов под текущим Оглавлением Вниз,начни с теста,Все файлы, заканчивающиеся на .py -Настраиваемый
Настройте имя тестового класса для поиска тестов
    python_classes = Test_*  

   #Папка скриптов под текущим Оглавлением Вниз,начни с теста,во всех файлах, заканчивающихся на .py,кTestурок в начале -Настраиваемый
Настройте имя тестовой функции для поиска тестов
  
    python_functions = test_*

#Папка скриптов под текущим Оглавлением Вниз,начни с теста,во всех файлах, заканчивающихся на .py,Внутри класса, начинающегося с Test,кtest_Как начать -Настраиваемый

4 часто используемых плагина Pytest

плагин Список URL:https://plugincompat.herokuapp.com Он содержит множество пакетов плагинов, которые вы можете использовать в соответствии с вашими рабочими потребностями.

4.1 Предварительные условия:

1. Путь к файлу:

Язык кода:javascript
копировать
- Test_App
- - test_abc.py
- - pytest.ini

Содержимое файла конфигурации 2.pyetst.ini:

Язык кода:javascript
копировать
  [pytest]
# Параметры командной строки
 addopts = -s
# Поиск по имени файла
 python_files = test_*.py
 # Имя класса для поиска
 python_classes = Test_*
 #Название функции поиска
    python_functions = test_*

4.2 Отчет о тестировании Pytest

pytest-HTML — это плагин pytest для HTML-отчетов о результатах тестов. Совместимость с Python 2.7,3.6.

Способ установки: pip install pytest-html.

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

Через командную строку отчет о тестировании в формате xml/html сохраняется по указанному пользователем пути. имя плагина: pytest-html Как использовать: Формат командной строки: pytest –html=путь пользователя/report.html

Пример:

Язык кода:javascript
копировать
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.

5. Расширенное использование pytest (1)

Предпосылки:

1. Путь к файлу:

Язык кода:javascript
копировать
Test_App
    - - test_abc.py
    - - pytest.ini

Содержимое файла конфигурации 2.pyetst.ini:

Язык кода:javascript
копировать
[pytest]
  Параметры командной строки
 addopts = -s
 Поиск по имени файла
 python_files = test*.py
  Имя класса для поиска
 python_classes = Test*
Название функции поиска
 python_functions = test_*

5.1 pytest приспособление

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

Метод: fixment(scope="function", params=None, autouse=False, ids=None, name=None) Часто используемые параметры:

Язык кода:javascript
копировать
 область действия: область действия отмеченного метода.
 function" (по умолчанию): действует для каждого метода теста и запускается один раз для каждого теста.
«класс»: применяется ко всему классу, все тесты каждого класса запускаются только один раз.
 «модуль»: применяется ко всему модулю, все тесты каждого модуля запускаются только один раз.
 «сеанс: применяется ко всему сеансу (используйте с осторожностью), каждый сеанс запускается только один раз.
 params: (тип списка) предоставляет данные параметров для использования функциями, вызывающими отмеченные методы.
 autouse: запускать ли автоматически. Значение по умолчанию — False и не запускается. Установите значение True для автоматического запуска.

5.2Первый пример приспособления (на который ссылаются параметры)

Пример:

Язык кода:javascript
копировать
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
         .

5.3.Второй пример приспособления (на который ссылается функция)

Пример:

Язык кода:javascript
копировать
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
      .

5.4. Третий пример приспособления (запускается настройка по умолчанию)

Пример:

Язык кода:javascript
копировать
 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
        .

5.5.Четвертый пример фикстуры (установка области действия функции)

Пример:

Язык кода:javascript
копировать
    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
        .

5.6.Пятый пример исправления (установите область действия на класс)

Пример:

Язык кода:javascript
копировать
    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
        .

5.7.Шестой пример фикстуры (возвращаемое значение)

Пример первый:

Язык кода:javascript
копировать
    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
    .
``

Пример второй:

Язык кода:javascript
копировать
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

6. Расширенное использование Pytest (2)

Предпосылки:

1. Путь к файлу:

Язык кода:javascript
копировать
- Test_App
- - test_abc.py
- - pytest.ini

Содержимое файла конфигурации 2.pyetst.ini:

Язык кода:javascript
копировать
[pytest]
Параметры командной строки
addopts = -s
Поиск по имени файла
python_files = test_*.py
 Имя класса для поиска
python_classes = Test_*
 Название функции поиска
python_functions = test_*

6.1. Пропустить функции тестирования.

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

Пример:

Язык кода:javascript
копировать
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 # Пропустить функцию```

6.2 Отметить функции как ожидаемые неудачные

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

Пример:

Язык кода:javascript
копировать
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  # знак отказа

6.3 Параметризация функциональных данных

Язык кода:javascript
копировать
Для функции test удобно получать атрибут.
 метод:
     parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
 Обычно используетсяпараметр:
     arnames: имя параметра
     argvalues: значение, соответствующее параметру, тип должен быть списком.
                 Если параметр равен единице, формат: [значение]
                 Если количество параметров больше одного, используется следующий формат: [(значение_параметра1,значение_параметра2....),(значение_параметра1,значение_параметра2....)]
 Как использовать:
     @pytest.mark.parametrize(argnames,argvalues)
     ️ Если значение параметра равно N, метод тестирования будет запущен N раз.

Один параметр

Язык кода:javascript
копировать
import pytest
class Test_ABC:
    def setup_class(self):
        print("------->setup_class")
    def teardown_class(self):
        print("------->teardown_class")
Язык кода:javascript
копировать
@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

Несколько параметров Пример:

Язык кода:javascript
копировать
import pytest
class Test_ABC:
    def setup_class(self):
        print("------->setup_class")
    def teardown_class(self):
        print("------->teardown_class")
Язык кода:javascript
копировать
@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

Тип возвращаемого значения функции

Язык кода:javascript
копировать
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")
Язык кода:javascript
копировать
@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

6.4 Изменение вывода трассировки Python

Язык кода:javascript
копировать
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 Вызванные ошибки также будут напечатаны.

6.5 Переход к PDB при сбое выполнения

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

Язык кода:javascript
копировать
pytest --pdb              # Каждый раз, когда происходит сбой, переходите к PDB
pytest -x --pdb           # первый переход при возникновении неудачи PDB, завершение выполнения теста
pytest --pdb --maxfail=3  # Только первые три неудачи перейдут на PDB 

6.6 Установка точек останова

существовать Добавьте в сценарий варианта использования следующее:Внизpythonкод,pytest автоматически закроет сканирование, выполняющее выход,здесь,Другие тестовые сценарии не будут затронуты.,Предыдущий тест теста с точкой останова - нормальный выход

Язык кода:javascript
копировать
 import pdb; pdb.set_trace()

6.7 Получение данных о производительности выполнения вариантов использования

Получите время выполнения 10 самых медленных вариантов использования

Язык кода:javascript
копировать
pytest --durations=10

6.8 Генерация файлов результатов в формате JUnitXML

Этот формат файла результатов может быть проанализирован Jenkins или другими инструментами CI.

Язык кода:javascript
копировать
pytest --junitxml=path

6.9 Отключить плагины

Например, отключите плагин doctest.

Язык кода:javascript
копировать
pytest -p no:doctest

6.10 Вызов pytest из кода Python

Язык кода:javascript
копировать
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()])

6.11. Быстрое развертывание virtualenv, содержащего pytest, после переноса тестового сценария.

Например, вы клонируете тестовый скрипт, написанный Daodao от команды проекта, со склада Gitlab на собственный компьютер.,Ты хочешь чего-то,и отлаживать,Что делать? Вы можете быстро создать VirtualEnv с помощью следующих операций.

Язык кода:javascript
копировать
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-отчет о покрытии

Используйте команду следующим образом:

Язык кода:javascript
копировать
pytest -vv --cov=./ --cov-report=html
open htmlcov/index.html 

Вы можете столкнуться с ошибкой:

Язык кода:javascript
копировать
(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

Решение

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

Если вам интересно, вы можете подписаться на мою общедоступную учетную запись WeChat «Полный стек автоматического тестирования», идентификатор WeChat: QAlife, чтобы узнать больше о технологии автоматического тестирования.

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

В основном обсуждается тестирование Loadrunner/JMeter, автоматическое тестирование Selenium/RobotFramework/Appium, автоматическое тестирование интерфейсов, инструменты тестирования и другие технологии тестирования. Давайте придем сюда, чтобы поделиться опытом, обменяться технологиями, подружиться, расширить свой кругозор и работать вместе!

Издатель: Full stack программист и руководитель стека, укажите источник для перепечатки: https://javaforall.cn/137163.html Исходная ссылка: https://javaforall.cn

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