JsonUnit хорошая библиотека для сравнения двух json

Как сравнить два больших json и получить allure-attachment в читаемом виде? В этом нам поможет JsonUnit

Чем нравится

  1. Работает с json как с деревом типизированных элементов. Из-за этого имеет множество полезных возможностей:
    • Игнорирование null элементов
    • Игнорирование порядка в массиве
    • Игнорирование новых элементов в массиве
    • Игнорирование новых полей
    • Игнорирование значений всех полей
    • Игнорирование значений определенных полей
  2. Возможность использования как в виде статичного метода, так в виде Hamcrest matcher-а, Spring MVC assertions и fluent assertions.
  3. Также есть возможность сравнивать с json, имееющую различные placeholder-ы:
    • ${json-unit.ignore} для игнориварония элементов
    • ${json-unit.regex} для сравнения с регулярным выражением
    • ${json-unit.any-string}, {json-unit.any-boolean}, {json-unit.any-number} для типов
    • ${json-unit.matches:} для своих кастомных матчеров
  4. Проект развивается. Например недавно добавилась интеграция с assertJ (beta). Также еще много других интересных фич, о которых можно почитать в README.md

Чем не нравится

На данный момент, на мой взгляд, есть несколько недостатков:

  1. Библиотека не умеет определять перемещение элементов в массиве. Только добавление/удаление и изменение.
  2. Неудобное игнорирование значений полей (не по json path).
  3. Почти нет точек расширения. Например, классно было бы добавить возможность сравнения всех строк определенным образом, игнорируя что-то по регулярному выражению.

Есть и еще один недостаток, jsonUnit из коробки выкидывает diff в консоль в не очень читаемом виде. Для больших json при наличии большого количества отличий визуально непонятно, чем они отличаются. Именно поэтому для своих тестов я сделал интеграцию с allure.

Интеграция с allure

Я добавил обобщенный diff и сделал возможность добавления своего кастомного listener-а в jsonUnit. Таким образом достаточно для каждого теста в lister-е получить абстактный diff, привести к требуемому формату, а после ‘отрендерить’ его в красивую html-ку и прекрепить его к отчету через механизм allure аттачей.

Результат будет такой: Alt text Alt text

Свой html аттач я формировал на основе jsondiffpatch.

Матчер из коробки: allure-jsonunit