Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

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


(PillowMan) #1

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


(Sergey Korol) #2

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


(PillowMan) #3

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

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

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


(Sergey Pirogov) #4

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


(PillowMan) #5

Спасибо


(Sergey Korol) #6

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

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

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

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


(Alex Okrushko) #7

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


(PillowMan) #8

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


(Sergey Korol) #9

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


(sidelnikovmike) #10

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


(PillowMan) #11

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


(Sergey Korol) #12

Ну там речь шла об 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]


(sidelnikovmike) #13

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

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