Skip to content

Commit

Permalink
Merge pull request #8 from RedMadRobot/feature/AND-90-test-assertion
Browse files Browse the repository at this point in the history
Added pages about assertion libraries: junit, assertj, kotest-assertions
  • Loading branch information
sonulen authored Apr 17, 2024
2 parents d262229 + 4f1aae8 commit 76e3c1d
Show file tree
Hide file tree
Showing 11 changed files with 711 additions and 11 deletions.
35 changes: 25 additions & 10 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,13 @@ tags:
| `tags` | (опционально) Тэг | Любая строка |
| `featured` | (опционально, по умолчанию `true`) Если установить в `false` - страничку не будет видно на радаре, а только в [overview] | `true` или `false` |

Подробнее про квадранты и кольца смотри [how-to].

Так как страничка - это `markdown` файл - можно вставлять картинки, для этого положи ее в `./public/images/` и добави ссылку:
Так как страничка - это `markdown` файл - можно вставлять картинки, для этого положи ее в `./public/images/` и добавь ссылку:

```markdown
![nice image](/images/nice-image.png)
```

Подробное описание лучше заполнять по следующему шаблону:
При добавлении новой страницы в радар, стоит следовать шаблону:

```markdown

Expand Down Expand Up @@ -79,8 +77,25 @@ tags:
При переводе технологии в `Adopt` - укажи, какие нашлись плюсы (это может быть что угодно).

При переводе технологии в `Hold` - будет круто, если ты укажешь, почему это произошло: любые минусы, нюансы, неудобства.
Если технологию заменили на другую, добавь ссылку на новую технологию.
При переводе в `Hold` стоит заполнить следующий шаблон:

```markdown

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

Нюансы переезда на новую технологию или ссылка на документацию по миграции, для примера можно посмотреть на accompanist insets.

Допущения.
Для примера: отказываемся от AssertJ в пользу Kotest, но на java-проектах продолжаем использовать.

---
</br>

Любые другие подробности (могут отсутствовать).

```

Пример перевода библиотеки в статус Hold - [assertj].

## Создание релиза

Expand All @@ -91,14 +106,14 @@ tags:
./script/create_new_release_folder.sh
```

Новый релиз необходимо создавать при добавлении странички или изменении статуса технологии.
Новый релиз необходимо создавать при добавлении странички или изменении статуса технологии.
Для исправления описания существующей страницы релиз создавать не нужно.

<!-- Links -->
[radar-link]: https://github.com/RedMadRobot/techradar-android
[new-issue]: https://github.com/RedMadRobot/techradar-android/issues/new
[new-discussion]: https://github.com/RedMadRobot/techradar-android/discussions/new
[front-matter]: https://github.com/jxson/front-matter
[how-to]: https://redmadrobot.github.io/techradar-android/help-and-about-tech-radar.html
[overview]: https://redmadrobot.github.io/techradar-android/libraries.html
[camerax]: https://redmadrobot.github.io/techradar-android/libraries/camerax.html
[overview]: https://redmadrobot.github.io/techradar-android/libraries
[camerax]: https://redmadrobot.github.io/techradar-android/libraries/camerax
[assertj]: https://redmadrobot.github.io/techradar-android/libraries/assertj
2 changes: 1 addition & 1 deletion config.json
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@
"notUpdated": "Этот пункт не обновлялся в трех последних версиях Радара",
"notFound": "404 - Congrats. You broke it.",
"pageAbout": "Что такое тех радар",
"pageOverview": "Обзор технологий",
"pageOverview": "Поиск",
"pageSearch": "Поиск",
"searchPlaceholder": "Что ищете?",
"metaDescription": ""
Expand Down
84 changes: 84 additions & 0 deletions public/docs/assertions/assertj_kotest_compare.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Сравнение библиотек ассертов для android проектов

Рассмотрим три популярные библиотеки assertions - [JUnit][junit_radar], [AssertJ][assertj_radar] и [Kotest][kotest_radar], на основе следующих критериев:

- Интеграция с Android Studio
- Описание ошибки
- Читабельность
- Документация
- Cравнение сложных структур данных
- Поддержка фичей Kotlin

## JUnit

➕ Плюсы:

1. Интеграция с фреймворком JUnit, что облегчает написание и запуск тестов.
2. Описание ошибок: для тех случаев, когда у JUnit есть методы - вполне нормальное

➖ Минусы:

1. Ограниченный функционал по сравнению с некоторыми современными библиотеками тестовых ассертов.
2. Читабельность: Йода-стиль assertEquals(expected, actual), надо помнить нюансы и отличия методов: что массивы надо сравнивать через assertArrayEquals, коллекции через assertIterableEquals и т.п.
3. Некоторые разработчики могут захотеть более продвинутые возможности, которых нет в Junit.
4. Коллекции: отсутствие проверки содержания элементов, неудобство при работе с Map и Set.
5. Отсутствие поддержки сложных структур данных.
6. Сгенерированная документация.

## AssertJ

➕ Плюсы

1. Удобочитаемый синтаксис, который делает код тестов более понятным.
2. Большой выбор методов для проверки различных условий.
3. Поддержка различных типов данных и структур, что позволяет писать разнообразные тесты.
4. Хорошая документация с примерами.
5. Из коробки есть поддержка [BDDAssertions][bbdassertions]

➖ Минусы

1. Слишком впечатляющее количество методов для сравнения — еще бы знать все.
Списки надо сравнивать через `containsExactly`, множества — через `hasSameElementsAs`, а словари — через `.usingRecursiveComparison().isEqualTo`.
2. Интеграция с IDE: `Click to see difference` работает далеко не всегда.
3. Сравнение сложных структур: есть `.usingRecursiveComparison()`, который хорошо сравнивает. Однако ошибку хотелось бы иметь поподробнее.
4. При использовании `assertSoftly` очень легко потерять `it` - вызвать `assertThat` вместо `it.assertThat` - и проверки будут работать в обычном режиме.

## Kotest Assertions

➕ Плюсы:

1. Поддерживает и использует фичи Kotlin: `infix`, `reified`, `inline` и т.п.
2. Удобный и выразительный синтаксис, упрощающий написание и понимание тестов.
_Тест выглядит как предложение, что упрощает понимание происходящего._
3. Расширяемое API позволяет разработчикам создавать собственные матчеры
4. Активное сообщество и регулярные обновления, обеспечивающие поддержку и развитие библиотеки.
5. После проверок типа работают смарт-касты
_Например, это удобно когда `State` это sealed class, и нам нужно проверить именно содержимое `State.Content`._

➖ Минусы:

1. Ограничение на использование в проектах на языках, отличных от Kotlin.

## Сравнительная таблица

| Критерий | JUnit | AssertJ | Kotest |
|-----------------------------------|----------------------|------------------------|---------------------|
| Интеграция с Android Studio | ⚠️ | ⚠️ ||
| Описание ошибки | ⚠️ | ⚠️ ||
| Читабельность ||||
| Документация | ➖ (сгенерированная) | ➕➖ (тяжело читается) | ➕➖ (нет примеров) |
| Cравнение сложных структур данных || ⚠️ ||
| Поддержка фичей kotlin ||||

[Примеры проверок каждой библиотеки][asserts_compare].

📝 Полезные ссылки:

- [Выбор библиотеки ассертов для проекта на Kotlin](https://habr.com/ru/articles/510206/)

<!-- Links -->
[assertj_radar]: https://redmadrobot.github.io/techradar-android/libraries/assertj/
[kotest_radar]: https://redmadrobot.github.io/techradar-android/libraries/kotest-assertion/
[junit_radar]: https://redmadrobot.github.io/techradar-android/libraries/junit-assertion/
[asserts_compare]: https://github.com/RedMadRobot/techradar-android/blob/40aa61ad9935816067f1b933b0529d77c187b9b9/public/snippets/assertions/assertj_kotest_compare.kt
[bbdassertions]: https://joel-costigliola.github.io/assertj/core/api/org/assertj/core/api/BDDAssertions.html
Loading

0 comments on commit 76e3c1d

Please sign in to comment.