За все время, что я программировал, я ни разу не написал тест. Тесты всегда казались дополнительным шагом, который только увеличивал время, необходимое мне для создания моего приложения. И все же, прежде чем я купил последний телефон, который хотел, я провел пару недель, изучая характеристики, просматривая видео распаковки и заходя в местный Apple Store, чтобы пролистать приложения своими руками. Я купил телефон, потому что тщательно его тестировал и знал, что он будет работать именно так, как я ожидал. Я хотел, чтобы мои приложения соответствовали тому же стандарту. Для начала я хотел узнать больше о модульных тестах.

Модульные тесты

Модульные тесты включают тестирование отдельных функций или методов в вашем коде. Обычно это означает, что функции возвращают правильное значение при каждом вызове.

Несколько недель назад я начал проект Javascript под названием Scribble, который был попыткой создать службу планирования, похожую на Doodle. Я потратил довольно много времени на ручное тестирование своего приложения и был разочарован тем, сколько раз мне приходилось отлаживать некоторые ошибки.

Одна функция, в частности, требовала от меня взять две даты и вернуть массив дат между этими двумя датами. Я хотел создать несколько тестов, чтобы убедиться, что он всегда дает мне правильный результат. Но что такое правильные результаты?

Тесты — это тоже код

Чтобы создать тесты, которые точно проверяют мое приложение, я должен определить, что тестировать и зачем тестировать. Вот несколько ориентиров, на которые стоит обратить внимание при определении собственных тестов.

  1. Тесты должны быть тщательными — мы хотим сделать достаточно тестов, чтобы охватить все возможные взаимодействия с кодом.

2. Тесты всегда должны возвращать один и тот же ожидаемый результат — мы хотим, чтобы тесты имели воспроизводимую, контролируемую, чистую функциональность.

3. Тесты должны проверять одну вещь за раз — мы хотим указывать непосредственно на сбои и четко видеть проблемы, которые необходимо исправить.

Зная это, давайте попробуем написать наш первый тест!

Я собираюсь использовать Jest и предоставляемый им API для тестирования моей функции.

Отсюда мы можем определить, что мы ожидаем от состава этой функции и что мы ожидаем, что она вернет.

Jest дает нам доступ к функции описания, которая позволяет нам группировать наши тесты вместе и описывать, что они должны делать.

Отсюда мы можем указать функцию обратного вызова, состоящую из наших тестов.

Первый тест

Здесь вы можете видеть, что у нас есть доступ к функции .expect(), которая принимает функцию обратного вызова. Expect предоставляет нам доступ к методам Jest, называемым Matchers, которые помогут нам протестировать наш код.

В приведенном выше примере мы используем .toEqual() для проверки глубокого равенства. Есть более 50 Matchers, и вы даже можете объединить Matchers, чтобы проверить предполагаемый результат.

Здесь я передаю getDateHoursMoment(), вызываю его и проверяю, возвращаю ли я массив.

Давайте проверим набор тестов.

Потрясающий! Наш тест пройден!

Второй тест

Здесь мы пытаемся передать некоторые значения и убедиться, что получаем правильный вывод.

Здесь мы также проверяем равенство

Мы ожидаем, что, выполнив getDateHoursMoment(), мы вернем именно этот массив, увеличивая первый аргумент на третий аргумент, пока не будет достигнут второй аргумент.

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

Вывод

Это только начало. Jest предлагает чрезвычайно мощный API, чтобы помочь разработчикам тестировать свои приложения. Реализация тестов до и во время процесса создания приложения может помочь вам устранить ошибки, ускорить разработку приложения и сохранить хладнокровие.