Я использую Pytest для тестирования некоторых SQL-запросов, которые моя команда выполняет программно с течением времени.
Мои SQL-запросы представляют собой списки JSON - один JSON соответствует одной строке данных.
У меня есть функция, которая различает пары JSON ключ: значение, чтобы мы могли точно указать, какие значения отличаются для данной строки. В идеале я бы вывел список этих различий вместо стандартного вывода оператора assert, который в конечном итоге выглядит неуклюжим и не очень полезным для конечного пользователя.
Вы можете использовать встроенную возможность Python для отображения настраиваемого сообщения об исключении:
assert response.status_code == 200, "My custom message: actual status code {}".format(response.status_code)
Проверьте это: https://wiki.python.org/moin/UsingAssertionsEffectively
Вы используете модуль регистрации?
Я не сейчас. Поскольку я выполняю это задание в планировщике (Азкабан), который выводит стандартный вывод тестов pytest, я могу просматривать журналы прямо в браузере.
Да, но я предлагаю вам получить выходные данные из модуля регистрации, для этого вопроса вы можете создать вспомогательные функции assert.
Обновил ответ.
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
Это именно то, что я хочу! Здесь есть еще одна деталь: я хотел бы полностью подавить стандартный вывод assert (иногда различия очень большие, и когда assert показывает разницу поверх моего настраиваемого сообщения, ведение журнала фактически становится бесполезным). Это возможно?