unit - изолированные тесты компонентов. Пишутся в самом большом количестве, чтобы протестировать отдельные части системы. Данные тесты крайне просто и легко запустить
integrtation - тесты между компонентами системы. Такие тесты проводятся для проверки взаимодействия элементов системы - например, проверить парные сервисы, которые обмениваются между друг другом данными.
e2e - тесты на собранной системе. Тестируется работа сразу всего кода в определённом кружении. Обычно тестируется на продакшн-версии приложения.
Так же у нас имеются фреймворки для проведения тестирования:
093 Unit тесты
Устанавливаем jest
Далее создаём скрипт под запуск тестов
package.json
Далее создаём конфиг под модуль юнит-тестирования
jest.config.ts
Дальше нам нужно написать сам сценарий тестирования.
beforeAll() - функция выполняется перед всеми тестами
afterAll() - запускает определённое действие сразу после всех тестов
beforeEach() - функция, которая будет выполняться перед каждым тестом
describe() - описывает, что мы тестируем
it() - это отдельный тест, который передаёт по нужному каналу определённое значение
Так же у нас в приложении имеется несколько сервисов, которые нужно отдельно поднимать, чтобы запустить тестировку (например, поднимать работу призмы, чтобы она создавала базу). Мы этого делать не хотим, поэтому нужно создать Mock под эти сервисы, чтобы использовать их функционал при тестировании без нужды в их включении.
Далее нужно будет в контейнере прибиндиться не к модулям, а к тем константам мокам, которые мы создали. Чтобы прибиндиться к константе нужно использовать не просто to(), а функцию toConstantValue(), которая работает с константами
И теперь, например, когда что-то в коде дёрнет внутри модуля UsersRepository метод create(), то у нас сработает определённый нами jest.fn().mockImplementationOnce(), который уже вернёт заранее определённое нами значение
Метод expect() получает определённое значение и позволяет нам указать то значение, которое мы от его ожидаем
Так же самым первым импортом обязательно нужно добавлять библиотеки зависимостей приложения. Конкретно в тестовый файл нужно импортнуть 'reflect-metadata'.
src > users > users.service.spec.ts
И отдельно про Mock: для того, чтобы UserService заработал, нужно чтобы в него вложили любой модуль, который удовлетворяет интерфейсу
И этим любым модулем у нас выступает Mock сервис
И после запуска юнит-тестирования мы получаем примерно такой результат, если всё хорошо:
Дальше попробуем допустить ошибку и скажем, что мы ждём от сервера получения пароля не в зашифрованном виде. И, конечно, тут мы получим ошибку.
094 Упражнение - Новые unit тесты
Допишем три новых теста it() для тестирования валидации данных для поиска пользователя
src > users > users.service.spec.ts
И мы видим такой результат
095 E2e тесты
Установим модуль супертеста, чтобы запустить систему и провести e2e тестирование
Добавим отдельную команду для запуска джестом отдельного конфига для тестирования
package.json
И тут представлен сам конфиг для e2e тестов
`jest.e2e.config.ts
Так же нам нужен метод, который сможет закрыть канал сервера, чтобы завершить ивент луп
app.ts
Так же нам нужно указать, где происходит запуск приложения (нужна инициализация приложения для начала тестирования)
main.ts
Ну и само тестирование. Оно пройдётся по приложению так же как и юнит-тест.
tests > users.e2e-spec.ts
Результат:
096 Упражнение - Дописываем e2e тесты
И далее тут реализуем тесты на валидацию выполняемых функций приложения
tests > users.e2e-spec.ts
Так же можно немного подправить конфиг и убрать из него статичную папку хранения теста
jest.e2e.config
Флаг --coverage позволяет просмотреть уровень покрытия тестами нашего приложения
package.json
И теперь вместе с выполнением тестов можно увидеть насколько оно покрыто тестами. Самый правый столбик показывает, сколько строк не покрыто тестами - это наша непокрытая функциональность.
Гнаться за 100% покрытие приложения тестами - бессмысленно. Это приведёт к большому количеству бесполезных тестов.