Собсно тред. Сначала немного терминов. Утверждения это когда мы пишем `assert lala.isJopa()` или `assert_equal lala, "jopa"`. Матчеры это `expect(lala.isJopa()).isTrue()` `expect(lala).toBe("jopa")`. В чем реальная разница между этими подходами и есть ли другие варианты?
Утверждения часто встроены прямо в сам язык и обычно их немного, буквально 3-5. Больше могут добавлять тестовые фреймворки, но без фанатизма. Их легко запомнить и легко пользоваться, но, как правило, они не информативны: "ожидали тру, пришло фолс", "ожидали 5 пришло 3"
С матчерами ситуация отличается. Обычно их много или очень много. Только базовых внутри тестовых фреймворках много десятков, плюс модификаторы, плюс экстеншены. Короче сотня другая легко. Использовать их уже целое искусство, за этим нужно следить и постоянно корректировать коллег
А в чем плюсы? Если вам нужна документация из тестов, то матчеры сделают ее понятнее. Обычно (но не всегда) вывод матчеров содержит больше полезной информации для отладки, что упрощает само тестирование. Ну и во многих языках тестовые фреймворки с матчерами являются стандартом
Есть еще всякие особые истории типа property-based тестирования или снепшот или скриншот тестирования, но это здесь мы про них не говорим. Больше вам на заметку, если не знаете про них, то обязательно почитайте.
В принципе на этом можно было бы и закончить, если бы не одна статья, которая в 2009 году значительно повлияла на проверки в тестах. Эта статья про Power Assert в Groovy https://dontmindthelanguage.wordpress.com/2009/12/11/groovy-1-7-power-assert/… Спойлер: лучшее от обоих миров: утверждений и матчеров с добавлением магии
Концепция такая, у нас есть ровно одно утверждение, внутри которого мы делаем любую проверку. Это утверждение, анализирует результат *каждого* подвыражения и выводит его для отладки. Так мы получаем максимум информации о том что пошло не так. Ниже реальный вывод
```bash
assert(types[index].name === bob.name )
| || | | | |
| || | | | "bob"
| || | | Person{name:"bob",age:5}
| || | false
| |11 "alice"
| Person{name:"alice",age:3}
["string",98.6,true,false,null,undefined,#Array#,#Object#,NaN,Infinity,/^not/,#Person#]
--- [string] bob.name +++ [string] types[index].name
@@ -1,3 +1,5 @@
-bob
+alice
```
Концепция оказалась настолько удачной и удобной, что либу Power Assert портировали практически в каждый язык. Лучше всего пожалуй описано в JS, там в начале ридми есть хороший блок, с объяснением почему именно этот подход: https://github.com/power-assert-js/power-assert#description Кто-нибудь уже использовал Power Assert? Или вы не знали про него?
p.s. Скиньте в комментариях порт power assert или аналогичную либу из вашего языка/экосистемы


Присоединяйтесь — мы покажем вам много интересного
Присоединяйтесь к ОК, чтобы подписаться на группу и комментировать публикации.
Нет комментариев