Введение
В быстро меняющемся мире разработки программного обеспечения обеспечение качества кода имеет важное значение для создания надежных и надежных приложений. Модульное тестирование играет ключевую роль в этом процессе, позволяя разработчикам проверять отдельные компоненты кода изолированно.
В этом блоге мы рассмотрим значение модульного тестирования и углубимся в возможности Jest, подчеркнув, почему он стал популярным инструментом для разработчиков.
Модульное тестирование — разве это не работа тестировщика?
Что ж, ответ — нет. Модульное тестирование в первую очередь предназначено для разработчиков, потому что это подход к тестированию, направленный на проверку правильности и надежности отдельных модулей или компонентов программного приложения.
Что такое шутка?
Среди множества доступных сред тестирования Jest стал популярным благодаря своей простоте, скорости и обширному набору функций. Jest — это среда тестирования JavaScript с открытым исходным кодом, разработанная Facebook. Он специально разработан для тестирования приложений React, но может использоваться для любой кодовой базы JavaScript.
Документация Jest → https://jestjs.io/docs/getting-started
Начиная
Монтаж
Используйте npm или yarn для установки Jest в качестве зависимости разработки в вашем проекте.
npm install -D jest
Этот пакет предназначен только для разработки, поэтому используйте -D
Конфигурация
Добавьте следующий раздел в свой package.json
:
{ "scripts": { "test": "jest" } }
Запустить режим просмотра:
jest --watch #runs jest -o by default jest --watchAll #runs all tests
Пишем свой первый тест
Тесты могут быть определены с использованием it
или test
. Я предпочитаю использовать it
. Вы можете выбрать свой путь.
//add.js const add = (a, b) => a + b; module.exports = add; // add.test.js <- It is a Test file with test.js extension const add = require("./add"); it("should add two numbers", () => { expect(add(1, 2)).toBe(3); });
Запустить тест
Запустите команду npm test
в своем терминале
# Output PASS ./add.test.js √ should add two numbers (2 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 total Time: 0.449 s Ran all test suites.
Использование сопоставителей
Ожидать
expect(value)
: Функцияexpect
принимает единственный аргумент, который является значением, относительно которого вы хотите сделать утверждения.- Это дает вам доступ к ряду
matchers
, которые позволяют вам проверять различные вещи.
expect(result).toBe(expected); expect(array).toHaveLength(length); expect(value).toBeTruthy();
Модификаторы
.not
: позволяет проверить его противоположность
expect(value).not.toBeTruthy();
.resolves
: используйте разрешения, чтобы развернуть значение выполненного обещания, чтобы можно было связать любой другой сопоставитель. Если обещание отклонено, утверждение не выполняется. Подробнее → здесь
it('should resolves to lemon', () => { // make sure to add a return statement return expect(Promise.resolve('lemon')).resolves.toBe('lemon'); });
.rejects
: используйте.rejects
, чтобы развернуть причину отклоненного промиса, чтобы можно было связать любой другой сопоставитель. Если обещание выполняется, утверждение терпит неудачу. Подробнее → здесь
it('should rejects to octopus', () => { // make sure to add a return statement return expect(Promise.reject(new Error('octopus'))).rejects.toThrow('octopus'); });
Часто используемые сопоставители
Сопоставители — это установленные функции, используемые для сравнения тестового значения. Посмотреть список здесь
Простые утверждения
Используйте expect()
методов в цепочке с toBe()
методом. Он принимает значение как сопоставитель
it("should add 2 with 2", () => { expect(2 + 2).toBe(4); })
Утверждение объекта/массива
Используйте метод expect()
в сочетании с методом toEqual()
. Он принимает объект или массив в качестве сопоставителя
// Proper way it('should assign new key value pair in object', () => { const data = {one: 1}; data['two'] = 2; expect(data).toEqual({one: 1, two: 2}); }); // Best way it('should assign new key value pair in object', () => { const data = {one: 1}; data['two'] = 2; expect(data).toMatchObject({one: 1, two: 2}); });
toEqual
игнорирует ключи объектов сundefined
свойствами,undefined
элементами массива, разреженностью массива или несоответствием типов объектов. вместо этого используйтеtoStrictEqual
.
Правдивость
Иногда вам нужно различать undefined
, null
и false
toBeNull
соответствует толькоnull
toBeUndefined
соответствует толькоundefined
toBeDefined
противоположноtoBeUndefined
toBeTruthy
соответствует всему, что операторif
считает истиннымtoBeFalsy
соответствует всему, что операторif
считает ложным
it('should be null', () => { const n = null; expect(n).toBeNull(); expect(n).toBeDefined(); expect(n).not.toBeUndefined(); expect(n).not.toBeTruthy(); expect(n).toBeFalsy(); }); // Output √ null (3 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total
Вы должны использовать сопоставитель, который наиболее точно соответствует тому, что вы хотите, чтобы ваш код делал.
Числа
Большинство способов сравнения чисел имеют соответствующие эквиваленты.
.toBe(value)
.toEqual(value/object)
.toBeGreaterThan(num)
.toBeGreaterThanOrEqual(num)
.toBeLessThan(num)
.toBeLessThanOrEqual(num)
.toBeCloseTo(float)
it('should check two numbers', () => { const value = 2 + 2; expect(value).toBeGreaterThan(3); expect(value).toBeGreaterThanOrEqual(3.5); expect(value).toBeLessThan(5); expect(value).toBeLessThanOrEqual(4.5); // toBe and toEqual are equivalent for numbers expect(value).toBe(4); expect(value).toEqual(4); }); it('should add floating point numbers', () => { const value = 0.1 + 0.2; //expect(value).toBe(0.3); This won't work because of rounding error expect(value).toBeCloseTo(0.3); // This works. });
Струны
Вы можете проверить строки на соответствие регулярным выражениям с помощью toMatch
it('there is no I in team', () => { expect('team').not.toMatch(/I/); }); it('but there is a "stop" in Christoph', () => { expect('Christoph').toMatch(/stop/); });
Массивы и итерации
Вы можете проверить, содержит ли массив или итерируемый элемент определенный элемент, используя toContain
const shoppingList = [ 'diapers', 'kleenex', 'trash bags', 'paper towels', 'milk', ]; // Proper way test('the shopping list has milk on it', () => { expect(shoppingList).toContain('milk'); expect(new Set(shoppingList)).toContain('milk'); }); // Best way test("the shopping list has milk on it", () => { expect(shoppingList).toEqual(expect.arrayContaining(["milk", "diapers"])); });
Исключения
Если вы хотите проверить, выдает ли конкретная функция ошибку при ее вызове, используйте toThrow
function compileAndroidCode() { throw new Error('you are using the wrong JDK!'); } test('compiling android goes as expected', () => { expect(() => compileAndroidCode()).toThrow(); expect(() => compileAndroidCode()).toThrow(Error); // You can also use a string that must be contained in the error message or a regexp expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK'); expect(() => compileAndroidCode()).toThrow(/JDK/); // Or you can match an exact error message using a regexp like below expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK$/); // Test fails expect(() => compileAndroidCode()).toThrow(/^you are using the wrong JDK!$/); // Test pass });
Функция, вызывающая исключение, должна вызываться внутри функции-оболочки, иначе утверждение
toThrow
не будет выполнено.
Это все для этого блога. Существует множество тем для обсуждения, таких как до, после методы тестирования, настройка, порядок выполнения и Функции Mock, о которых я расскажу во второй части этого блога.
Подведение итогов 🥱
Спасибо за прочтение! Я очень надеюсь, что вам понравилось читать этот короткий блог. Если вы такой же увлеченный разработчик, как и я, пожалуйста, поставьте лайк, это будет мотивировать меня.
Если у вас есть какие-либо вопросы/предложения/отзывы, свяжитесь со мной в twitter или спросите меня в разделе комментариев.
Нравится и подписывайтесь 😊
До встречи в следующем блоге. Наслаждайтесь программированием ❤