Переопределить стандартный обмен сообщениями с утверждениями в Pytest Assert

Я использую Pytest для тестирования некоторых SQL-запросов, которые моя команда выполняет программно с течением времени.

Мои SQL-запросы представляют собой списки JSON - один JSON соответствует одной строке данных.

У меня есть функция, которая различает пары JSON ключ: значение, чтобы мы могли точно указать, какие значения отличаются для данной строки. В идеале я бы вывел список этих различий вместо стандартного вывода оператора assert, который в конечном итоге выглядит неуклюжим и не очень полезным для конечного пользователя.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
1 150
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать встроенную возможность Python для отображения настраиваемого сообщения об исключении:

assert response.status_code == 200, "My custom message: actual status code {}".format(response.status_code)

Проверьте это: https://wiki.python.org/moin/UsingAssertionsEffectively

Это именно то, что я хочу! Здесь есть еще одна деталь: я хотел бы полностью подавить стандартный вывод assert (иногда различия очень большие, и когда assert показывает разницу поверх моего настраиваемого сообщения, ведение журнала фактически становится бесполезным). Это возможно?

snark17 13.09.2018 19:54

Вы используете модуль регистрации?

CSMaverick 13.09.2018 19:58

Я не сейчас. Поскольку я выполняю это задание в планировщике (Азкабан), который выводит стандартный вывод тестов pytest, я могу просматривать журналы прямо в браузере.

snark17 13.09.2018 20:01

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

CSMaverick 13.09.2018 20:04

Обновил ответ.

CSMaverick 13.09.2018 20:06
Ответ принят как подходящий

Pytest дает нам ловушку pytest_assertrepr_compare, чтобы добавить собственное объяснение того, почему утверждение не удалось.

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

class JSONComparator:
    def __init__(self, lst):
        self.value = value

    def __eq__(self, other):
        # Here your algorithm to compare two JSON strings
        ...

        # If they are different, save that information
        # We will need it later
        self.diff = "..."

        return True

# Put the hook in conftest.py or import it in order to make pytest aware of the hook.
def pytest_assertrepr_compare(config, op, left, right):

    if isinstance(left, JSONComparator) and op == "= = ":
        # Return the diff inside an array.
        return [left.diff]

# Create a reference as an alias if you want
compare = JSONComparator

использование

def test_somethig():
    original = '{"cartoon": "bugs"}'
    expected = '{"cartoon": "bugs"}'

    assert compare(original) == expected

Другие вопросы по теме