Как я могу получить PyCharm, чтобы показать все различия ошибок из pytest? - PullRequest
0 голосов
/ 30 мая 2018

Я использую Pycharm для запуска моих pytest модульных тестов.Я тестирую REST API, поэтому мне часто приходится проверять блоки JSON.Когда тест не пройден, я увижу что-то вроде этого:

FAILED
test_document_api.py:0 (test_create_documents)
{'items': [{'i...ages': 1, ...} != {'items': [{'...ages': 1, ...}

Expected :{'items': [{'...ages': 1, ...}
Actual   :{'items': [{'i...ages': 1, ...}
 <Click to see difference>

Когда я нажимаю ссылку «Нажмите, чтобы увидеть разницу», большая часть разницы преобразуется в точки эллипса, например

Pycharm comparison with differences elided

Это бесполезно, так как не показывает мне, что отличается.Я получаю это поведение для любой разницы, превышающей одну строку или число.

Я предполагаю, что Pycharm и / или pytest пытаются исключить неинформативные части различий для больших выходных данных.Тем не менее, он слишком агрессивен и исключает все.

Как мне получить Pycharm и / или pytest, чтобы показать мне всю разницу?

Я пытался добавить -vvv в Pytest's AdditionalАргументы, но это не имеет никакого эффекта.


Начиная с исходного поста, я убедился, что вижу то же поведение при запуске модульных тестов из командной строки.Так что это проблема с Pytest, а не с Pycharm.

После просмотра ответов, которые я получил до сих пор, я думаю, что я действительно спрашиваю "в Pytest можно ли установить maxDiff=None без измененияисходный код ваших тестов?Когда я читал про pytest, у меня сложилось впечатление, что переключатель -vv управляет этим параметром, но это не так.

Ответы [ 3 ]

0 голосов
/ 31 мая 2018

Если вы внимательно посмотрите на источники PyCharm , из всего вывода pytest PyCharm использует одну строку a для анализа данных для отображения в диалоговом окне Click to see difference.Это строка AssertionError: <message>:

def test_spam():
>       assert v1 == v2
<b>E       AssertionError: assert {'foo': 'bar'} == {'foo': 'baz'}</b>
E         Differing items:
E         {'foo': 'bar'} != {'foo': 'baz'}
E         Use -v to get the full diff

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

def test_eggs():
    assert a == b, '{0} != {1}'.format(a, b)

Если вы хотите применить это поведение ко всем тестам, определите пользовательский pytest_assertrepr_compare крючок.В файле conftest.py:

# conftest.py
def pytest_assertrepr_compare(config, op, left, right):
    if op in ('==', '!='):
        return ['{0} {1} {2}'.format(left, op, right)]

Сравнение значений по равенству теперь будет удалено, если оно слишком длинное;чтобы показать полную строку, вам все равно нужно увеличить многословие с помощью флага -vv.

Теперь сравнение на равенство значений в строке AssertionError не будет удалено, а полный дифференциал отобразится вClick to see difference диалоговое окно с выделением различных частей:

enter image description here

0 голосов
/ 31 января 2019

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

1) Установить уровень многословия при выполнении теста:

./app_main --pytest --verbose test-suite/

2) Добавить средупеременная для "CI" или "BUILD_NUMBER".В ссылке на файл усечения вы можете видеть, что эти переменные env используются для определения, запущен или нет блок усечения.

import os

os.environ["BUILD_NUMBER"] = '1'
os.environ["CI"] = 'CI_BUILD'

3) Попытка установить DEFAULT_MAX_LINES и DEFAULT_MAX_CHARS в модуле усечения ( Не рекомендую это, поскольку он использует частный модуль ):

from _pytest.assertion import truncate

truncate.DEFAULT_MAX_CHARS = 1000
truncate.DEFAULT_MAX_LINES = 1000

В соответствии с кодом опция -vv должна работать, поэтому странно, что она не для вас:

Текущее поведение по умолчанию - обрезать объяснения утверждений на ~ 8 терминальных линиях, если только они не работают в режиме "-vv" или не работают на CI.

Файл усечения Pytest, на котором я основываю свойответы от: pytest / truncate.py

Надеюсь, что-то здесь вам поможет!

0 голосов
/ 31 мая 2018

Поскольку этот pytest интегрируется с unittest, в качестве обходного пути вы можете установить его как unittest, а затем установить Test.maxDiff = None или для каждого конкретного теста self.maxDiff = None

https://docs.pytest.org/en/latest/index.html

Может запускать юнит-тесты (включая пробные) и тесты носа из коробки;

Они также могут быть полезны ...

https://stackoverflow.com/a/21615720/9530790

https://stackoverflow.com/a/23617918/9530790

...