Как сравнить два больших json и получить allure-attachment в читаемом виде? В этом нам поможет JsonUnit
Чем нравится
- Работает с json как с деревом типизированных элементов. Из-за этого имеет множество полезных возможностей:
- Игнорирование
null
элементов - Игнорирование порядка в массиве
- Игнорирование новых элементов в массиве
- Игнорирование новых полей
- Игнорирование значений всех полей
- Игнорирование значений определенных полей
- Игнорирование
- Возможность использования как в виде статичного метода, так в виде Hamcrest matcher-а, Spring MVC assertions и fluent assertions.
- Также есть возможность сравнивать с json, имееющую различные placeholder-ы:
${json-unit.ignore}
для игнориварония элементов${json-unit.regex}
для сравнения с регулярным выражением${json-unit.any-string}
,{json-unit.any-boolean}
,{json-unit.any-number}
для типов${json-unit.matches:}
для своих кастомных матчеров
- Проект развивается. Например недавно добавилась интеграция с assertJ (beta). Также еще много других интересных фич, о которых можно почитать в README.md
Чем не нравится
На данный момент, на мой взгляд, есть несколько недостатков:
- Библиотека не умеет определять перемещение элементов в массиве. Только добавление/удаление и изменение.
- Неудобное игнорирование значений полей (не по json path).
- Почти нет точек расширения. Например, классно было бы добавить возможность сравнения всех строк определенным образом, игнорируя что-то по регулярному выражению.
Есть и еще один недостаток, jsonUnit из коробки выкидывает diff в консоль в не очень читаемом виде. Для больших json при наличии большого количества отличий визуально непонятно, чем они отличаются. Именно поэтому для своих тестов я сделал интеграцию с allure.
Интеграция с allure
Я добавил обобщенный diff и сделал возможность добавления своего кастомного listener-а в jsonUnit. Таким образом достаточно для каждого теста в lister-е получить абстактный diff, привести к требуемому формату, а после ‘отрендерить’ его в красивую html-ку и прекрепить его к отчету через механизм allure аттачей.
Результат будет такой:
Свой html аттач я формировал на основе jsondiffpatch.
Матчер из коробки: allure-jsonunit