Тестирование кода JavaScript с помощью Jest
Jest предлагает полное и простое в настройке решение для тестирования JavaScript и готово к работе для любого проекта React. Разве это не круто?
Почему шутка?
Facebook использует Jest для тестирования всего кода JavaScript, включая приложения React. Одна из философий Jest заключается в предоставлении интегрированного опыта с нулевой конфигурацией. В настоящее время Jest используют Facebook, Instagram, Twitter, PayPal, IBM и многие другие. В настоящее время Jest имеет более 11 000 звезд на GitHub.
Особенности:
* Jest распараллеливает выполнение тестов между рабочими процессами, чтобы максимизировать производительность.
* Jest легко создает отчеты о покрытии кода, используя - покрытие без дополнительных настроек или библиотек.
* Предоставляет мощную имитационную библиотеку для функций и модулей.
* Работает с TypeScript и легко интегрируется с babel .
Начиная
Jest можно использовать для тестирования любого приложения JavaScript. Для разработчиков React Jest уже настроен, когда вы используете create-react-app
или react-native init
для создания проектов React и React Native. Чтобы включить Jest, найдите ваши тестовые файлы в любом приложении JavaScript, сохраните тестовые файлы с расширением .spec.js
или .test.js
или поместите файлы тестов в __tests__
папку.
Установка
Сначала создайте папку, а затем создайте файл package.json
, используя:
cd folder-name npm init
Установка должна выглядеть так:
Вы создали package.json
файл, в котором будет храниться информация о проекте, а также зависимости.
Установим шутливую зависимость. Для НПМ:
npm install — save-dev jest
Для пряжи:
yarn add — dev jest
Убедитесь, что ваш package.json выглядит так:
{ “name”: “jest-tutorial”, “version”: “1.0.0”, “description”: “A Jest Tutorial”, “main”: “index.js”, “scripts”: { “test”: “jest” }, “repository”: { “type”: “git”, “url”: “git+https://github.com/codediger/jest-tutorial.git" }, “keywords”: [ “jest”, “javascript” ], “author”: “Orinami Olatunji”, “license”: “ISC”, “bugs”: { “url”: “https://github.com/codediger/jest-tutorial/issues" }, “homepage”: “https://github.com/codediger/jest-tutorial#readme", “devDependencies”: { “jest”: “²⁰.0.4” } }
Быстрый пример
Приведем небольшой пример. Создайте новый файл и назовите его concat.js
. Добавьте этот код:
//concat.js function concat(x, y) { return x + y; } module.exports = concat;
Затем создайте файл с именем concat.test.js
. Вот куда мы поместим наш тестовый код:
//concat.test.js const concat = require(‘./concat’); test(‘join Orin and ami to be Orinami’, () => { expect(concat(‘Orin’, ‘ami’)).toBe(‘Orinami’); });
Запустите тест, используя npm test
. Вот что вы увидите:
Вы только что написали свой первый тест. Ура!
Введение в Jest expect API
expect
дает вам доступ к ряду matchers
, которые позволяют проверять разные вещи. При написании теста мы хотим убедиться, что результат соответствует ожиданиям. Jest expect API
содержит множество методов, которые вы можете использовать в своем приложении. Мы не можем изучить все, но мы бы рассмотрели expect.assertions()
и .toBe()
.
ожидать.assertions ()
Это очень полезно при тестировании асинхронного кода, чтобы гарантировать, что утверждения в обратном вызове были вызваны. expect.assertions()
используется для проверки, является ли возвращаемый номер обратного вызова ожидаемым числом. Это образец теста, в котором используется expect.assertions()
, чтобы гарантировать, что все обратные вызовы вызываются до того, как станет известно, прошел ли тест или нет.
test(‘asyncCode calls fetchPicture, fetchName and githubName’, () => { expect.assertions(3); function fetchPicture(data) { expect(data).toBeTruthy(); } function fetchName(data) { expect(data).toBeTruthy(); } function githubName(data) { expect(data).toBeTruthy(); } asyncCode(fetchPicture, fetchName, githubName ); });
expect.assertions(3)
гарантирует, что 3 обратных вызова вызываются перед прохождением или падением теста.
.быть()
.toBe()
в основном просто проверяет, соответствует ли значение ожидаемому. Мы использовали это в нашем быстром примере. Вот еще один:
// profile.test.js const profile = { name: ‘Orinami’, githubUrl: ‘github.com/orinami’, twitterUrl: ‘twitter.com/orinami_’ }; test(‘expects profile to be an object’, () => { expect(typeof profile).toBe(‘object’); });
profile.test.js
проходит, потому что profile
является объектом, и мы ожидаем, что результатом теста будет объект.
Больше совпадений
Я знаю, что сказал, что мы будем изучать только два метода, но давайте взглянем на еще один в действии. Matchers
позволяют нам проверять значения различными способами. Вот некоторые из них:
1. toEqual
рекурсивно проверяет каждое поле объекта или массива.
2. toBeNull
соответствует только null
3. toBeUndefined
соответствует только undefined
4. toBeDefined
является противоположностью `toBeUndefined`
5. toMatch
проверяет строки на соответствие регулярным выражениям.
6. toContain
проверяет, содержит ли массив конкретный элемент.
Посмотрим, как они действуют. Создайте файл и сохраните его как matchers.test.js
. Добавьте этот код и запустите, используя npm test
:
//toEqual const data = { name: ‘Orinami’, lastname: ‘Olatunji’ }; test(‘Object Assignment’, () => { expect(data).toEqual({name: ‘Orinami’, lastname: ‘Olatunji’}); }); // For truthiness test(‘null’, () => { const n = null; expect(n).toBeNull(); expect(n).toBeDefined(); expect(n).not.toBeUndefined(); }); test(‘zero’, () => { const zero = 0; expect(zero).not.toBeNull(); expect(zero).toBeDefined(); expect(zero).not.toBeUndefined(); }); // For Numbers const sum = 5 + 6; test(‘five + six’, () => { expect(sum).toBeGreaterThan(10); expect(sum).toBeGreaterThanOrEqual(11); expect(sum).toBeLessThan(12); expect(sum).toBeLessThanOrEqual(11); }); //toContain — For arrays const languages = [ ‘JavaScript’, ‘PHP’, ‘Ruby’, ]; test(‘languages contains JavaScript’, () => { expect(languages).toContain(‘JavaScript’); }); //toMatch — For strings test(‘g in programmer’, () => { expect(‘Programmer’).toMatch(/g/); });
Вот результат:
Мы видим, что все наши испытания прошли успешно. Вы можете манипулировать ценностями и увидеть результат. Нет лучшего способа научиться этому, чем активно попробовать!
Тестирование асинхронного кода
Обработка асинхронного кода может быть трудной; Тестируете? Труднее. Давайте посмотрим, как Jest используется для тестирования асинхронного кода.
Обратные вызовы
Использование callbacks
- популярный метод обработки асинхронного кода в JavaScript. Давайте посмотрим на этот пример:
test(‘data: go JavaScript!’, done => { function callback(value) { expect(value).toBe(‘go Javascript!’); done(); } getMessage(callback); });
Мы передаем done
в качестве аргумента, чтобы Jest дождался вызова обратного вызова done
перед завершением теста. Если вы опустите done()
из кода, тест не будет работать должным образом, потому что функция обратного вызова не будет вызвана вообще.
Обещания
Если в вашем коде используется promises
, просто верните promise
в своем тесте, и Jest обработает асинхронный вызов и будет ждать его разрешения. Если обещание разрешено, тест будет пройден; в противном случае тест завершится неудачно.
Допустим, чтоgetMessage
, возвращает promise
со строкой «Изучите веб-разработку на Scotch.io». Мы можем протестировать это просто с помощью этого:
test(‘Learn Web Development on Scotch.io’, () => { expect.assertions(1); return getMessage().then(data => { expect(data).toBe(‘Learn Web Development on Scotch.io’); }); });
Если вы не используете ключевое слово return
, ваш тест закончится еще до того, как он сделает что-нибудь значимое.
У Jest есть и другие способы тестирования асинхронного кода. Он предлагает использование async
, await
, .resolves
и .rejects
при написании тестов для асинхронного кода. Подробнее о тестировании асинхронного кода см. [Здесь] (https://facebook.github.io/jest/docs/asynchronous.html).
Встроенный отчет о покрытии кода
Jest может собирать информацию о покрытии кода project/directory
, с которым вы работаете, включая непроверенные файлы. Чтобы просмотреть встроенный отчет о покрытии кода, установите Jest глобально. Запустить:
npm install -g jest
Потом:
jest — coverage
Вот результат:
Заключение
Jest позволяет легко и эффективно писать тесты для приложений JavaScript. В этом руководстве вы узнали, как писать и запускать тесты для фрагментов кода JavaScript. В более позднем руководстве я бы разбил тестирование асинхронного кода с помощью Jest на части, которые вы легко поймете, если вы не поняли здесь идею. Если у вас есть вопросы, не стесняйтесь спрашивать. Буду рада это услышать!