Unit тесты в TS (JS)

Рассмотрим как организовать юнит-тестирование для проектов на TS. Предполагается, что проект управляется npm. Потребуется установить три пакета для организации Unit-тестирования — это mocha (читается как мокка), chai и nyc.

Для JS этих пакетов было бы достаточно, но, т.к. у нас TS, то нужно еще описание типов: @testdeck/mocha, @types/chai, @types/mocha.

Вы можете установить их вручную, или посмотреть следующий пример конфигурации package.json, который включает минимальный требуемый набор пакетов. Версии, конечно же, могут отличаться.

Mocha

Мокка — это, собственно, самый важный компонент этой инсталляции — фреймворк для тестирования. Чаще всего используют либо его, либо JEST.

Для него нужно создать дополнительный файл конфигурации в корне проекта — .mocharc.json

Как видите, он ссылается еще на один файл, где мы настроим TS для тестирования, это ./register.js

Это позволяет сделать независимую настройку typescript для фазы тестирования.

Chai

Это node.js библиотека проверки утверждений, внедряющая интерфейсы тестирования. Её можно подключить и как пакет и просто как js-скрипт.

Обычно, создавая тесты, вы пишите какие то утверждения (assertions), ожидая какой то результат. Chai предоставляет целых три интерфейса для написания тест-кейсов: should, expect и assert (или, если угодно, называйте это стилями). Мне лично нравится should, который превращает код в подобие человеку-понятного текста (посмотрим на него и восхитимся чуть позднее).

Chai помогает как с TDD, так и с BDD. Т.е. вы можете писать, используя его, как поведенческие, интеграционные тесты, так и модульные Unit-тесты, о которых идет речь в данной статье.

NYC

Еще один компонент, который мы используем в данной сборке, нужен для анализа покрытия кода тестами. Он вроде бы так и расшифровывается — now you're covered Подробнее можете ознакомиться с возможностями на странице пакета.

Нам нужно сконфигурировать его, создав файл .nyrc.json

Обратите внимание, что именно через NYC мы запускаем тесты в package.json.

Общая структура проекта

В целом, структура проекта будет выглядеть вот так:

В /src у нас находится index.ts, а также есть модуль, который экспортирует пример функции.

Для полноты картины приведу конфигурационные файлы TS

/tsconfig.json

/tests/tsconfig.json

Он немного отличается от основного, был создан как результат определенного опыта использования mocha + chai.

Тестируемый модуль

Перейдем от настройки к практике. У нас есть модуль — /src/modules/module.ts, в котором объявлена и экспортируется функция. В данном случае функция — это задачка с leetcode под номером 1701 — https://leetcode.com/problems/average-waiting-time/

На входе она ожидает массив из кортежей, а возвращает число.

Теперь мы хотим написать тесты для нашей функции.

Тестирование

Все тесты должны располагаться в папке /test, и иметь расширение *.test.ts. Это декларируется строкой запуска тестов в package.json:

Я создал несколько тестов для нашей функции в файле /tests/module.test.ts

Выбранный should интерфейс Сhai позволяет создавать цепочечные утверждения, которые, по сравнению с унылыми assert сравнениями, будут понятны и тестировщиками и бизнес-аналитикам. Один раз попробовав should, я больше не пишу в assert стиле :).

Ну вот для сравнения:

Запуская npm run test, вы получите результат вида:

Написать комментарий

Мало букафф? Читайте есчо !

Анимация смены картинок с помощью jquery

Декабрь 26, 2012 г.

Ещё одна типовая задача, для которой найдено приличное решение. Типично суть задачи состоит в следующем. Есть набор изображений, которые демонстрируются поочередно в некотором контейнере. Ставится задача по анимации периодической смены этих картинок средствами ...

Читать

Как убрать фокус, используя jQuery?

Сентябрь 22, 2016 г.

Не так принципиально, какой библиотекой мы воспользуемся, когда будем убирать фокус, я привык использовать jQuery. Потому речь пойдет в контексте этой библиотеки. Сложностей с тем как снять фокус с элемента традиционно больше, чем с тем, как его ...

Читать

 

Комментарии к «Unit тесты в TS (JS)»

Понравилась статья? Есть вопросы? - пишите в комментариях.



Комментарий: