Как заставить asserEquals выдавать только различие в String

При проверке String значений с помощью assertEquals() выдает суммированный результат, и дальше вручную сравнивай сам как хочешь значения. Есть какой либо простой способ выдавать при фэйле только различие строк? Какие могут быть решения?

Какой unit-framework используется? Что значит “суммированный результат”? И в каком формате вы хотите видеть diff?

Используется TestNG. Суммированный на примере такого:

AssertFail: Excpected [a = 10, b = 20, c=30 ...] but found [a = 10, b = 5, c=30 ...]

Значений у актуального и ожидаемого результата может быть много, а значит в лог отображается вся эта информация. Но если проблема была только в b = 5 то не лучше бы отображать только его?

Выходов два. Либо написать свой ассерт, либо написать свой матчер

Спасибо

Нет, не лучше. Если вы будете отображать только зафейлившуюся часть результата, то как будете потом понимать, что с чем сравнивалось? Как будете заводить баг-репорт в случае фейла?

Гораздо более эффективней будет реализовать “подсветку” зафейлившегося компонента в репорте (если он у вас конечно html). Как этого достичь? TestNG позволяет переопределять assert'ы. Добиться этого можно, расширив класс Assertion. При этом, вы так же можете писать и свои кастомные ассерты.

Самый простой способ подсветки в html report’е - обрамление отличающихся компонентов тегом <b>text</b> при помощи String.replace.

П.С. Для “спасибо” есть спец. кнопка. :wink:

1 лайк

Внутри Гугла мы уже перешли на Truth для assertions.
Diff String как ты хочешь по умолчанию нет, но можно легко дописать свой String Subject и сделать свое сообщение, когда assertion fails.

Используя Allure, все что вы описали, можно в нем реализовать?

Понятия не имею. Вам следует задать этот вопрос разработчикам. Сам ассерт с подсветкой реализовать то вы сможете. Алюр тут не при чем. Вопрос в том, как это будет потом рендериться в репорте.

Не, аллюр такого не умеет. Специально не дают html в ассершнах использовать.

1 лайк

Просто по вот этой статье внизу, у нас в аллур практически безграничные возможности при связке HTML.

Ну там речь шла об html attachment. Т.е. это кастомный блок, где подобные конструкции разрешены. Блок ассертов никакого отношения к этому не имеет.

Но вы можете отдельно собирать данные о проводимых проверках, сохраняя actual / expected в какой-то контейнер. А дальше, после предварительной маркировки, просто выводить результат в кастомном html атаче, аля:

<b>Verifications:</b>
ID: <a href="JIRA_STORY_URL">JIRA_STORY_ID</a> -> 
<b>expected:</b> [a = 10, <b>b = 20</b>, c=30 ]; <b>actual:</b> [a = 10, <b>b = 5</b>, c=30]

Естественно, оно потом отрендерится в полноценный html с отмаркированными данными:

Verifications:
ID: JIRA_STORY_ID -> expected: [a = 10, b = 20, c=30 ]; actual: [a = 10, b = 5, c=30]

2 лайка

Да, я имел в виду в статье именно аттачи. Там можно все, что угодно делать. Вопрос лишь в том, как правильно данные передать, обработать и главное из ассерта чтоб было понятно, куда пойти чтоб увидеть ошибку. Ведь в чем плюс именно ассерта? Там сразу видно, что и как сломалось. В случае с аттачем вам нужно как то указать, куда посмотреть, чтоб понять, что сломалось.
Вообще надо поговорить с ребятами из аллюра по поводу возможности добавлять html в ассерт.

Ну и еще. Вам никто не запрещает выкачать исходники аллюра и сделать свою версию, где можно использовать html в асеерте. Не думаю, что это очень сложно.