Введение

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

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

Модульное тестирование — разве это не работа тестировщика?

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

Что такое шутка?

Среди множества доступных сред тестирования Jest стал популярным благодаря своей простоте, скорости и обширному набору функций. Jest — это среда тестирования JavaScript с открытым исходным кодом, разработанная Facebook. Он специально разработан для тестирования приложений React, но может использоваться для любой кодовой базы JavaScript.

Документация Jesthttps://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 или спросите меня в разделе комментариев.

Нравится и подписывайтесь 😊

До встречи в следующем блоге. Наслаждайтесь программированием ❤