В этой статье мы рассмотрим библиотеку Jest для тестирования на языке программирования JavaScript, думаю вам будет интересно и самое главное полезно.
Также у нас уже есть статья про тестирование в JavaScript, и называется она «Тестирование на JavaScript», но разница между это в том, что там вы прочитаете про то как это делать на чистом JS, а тут в с помощью библиотеки, но зачем использовать её, об этом чуть ниже.
Для чего нужна библиотека Jest для JavaScript:
Первым делом разберём для чего нужна эта библиотека, как понятно из заголовка, она нужна для тестирования, но зачем если есть стандартные инструменты в JS для тестирование, всё дело в том, что стандартные инструменты они нужны только в том случае, если вы тестируете на стандартном JS в браузере, но если вы используете Node.js или какой нибудь фреймворк, то тогда вам будет не удобно его использовать.
И тут на поvошь приходит библиотека Jest, которая во первых специально адаптирована не только для чистого JavaScript, но и для Node.js, но и во вторых есть и другие ответвления, например для React.js или TypeScript, и это ещё не всё, она работает ещё с многими другими фреймворками.
Но конкретно в этой статье мы рассмотрим только для Node.js, но если статья наберёт хороший фидбэк, то будут статьи и для фреймворков.
Как установить Jest для JavaScript:
Повторюсь, мы будем всё показывать для Node.js, для чистого JavaScript всё примерно также, а для разных фреймворков может немного отличаться.
Можно его установить через NPM или YARN:
1 | npm install --save-dev jest |
Или:
1 | yarn add --dev jest |
Как видите мы устанавливаем в режиме разработке, потому что нам нужно иметь это только в разработке а для боевой части сайта это нам не нужно.
Работа с Jest в JavaScript:
Теперь разберём как работать с этой библиотекой, а работать с ней крайне просто, так как Jest использует сопоставили, то есть вы проверяете функцию которое возвращает определённое значение и сопоставляете это значение с которым вам нужно, и например если оно не равно вашему, то тогда будет ошибка.
Теперь покажу всё на самом простом примере, и самый простой способ проверить значение — установить точное равенство.
1 2 3 | test('two plus two is four', () => { expect(2 + 2).toBe(4); }); |
В этом коде expect(2 + 2)
возвращает объект «ожидание». Обычно вы ничего не делаете с этими объектами ожидания, за исключением сопоставления. Тут .toBe(4)
является сопоставителем. Когда Jest запускается, он отслеживает все неудачные сопоставления, чтобы распечатать для вас приятные сообщения об ошибках.
toBe()
использует Object.is
для проверки точного равенства. Если вы хотите проверить значение объекта, используйте вместо этого toEqual()
:
1 2 3 4 5 | test('object assignment', () => { const data = {one: 1}; data['two'] = 2; expect(data).toEqual({one: 1, two: 2}); }); |
toEqual()
рекурсивно проверяет каждое поле объекта или массива.
Вы также можете проверить противоположность сопоставителя, то есть не равно:
1 2 3 4 5 6 7 | test('adding positive numbers is not zero', () => { for (let a = 1; a < 10; a++) { for (let b = 1; b < 10; b++) { expect(a + b).not.toBe(0); } } }); |
Правдивость:
В тестах иногда нужно различать undefined
, null
и false
, но иногда вы не хотите рассматривать их по-разному. Jest содержит помощников, которые позволяют вам четко указать, чего вы хотите.
- toBeNull() — соответствие только
null
; - toBeUndefined() — соответствие только
undefined
; - toBeDefined() — это противоположность
toBeUndefined()
; - toBeTruthy() — соответствует всему, что оператор
if
рассматривает как истину; - toBeFalsy() — соответствует всему, что оператор
if
рассматривает как ложь;
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | test('null', () => { const n = null; expect(n).toBeNull(); expect(n).toBeDefined(); expect(n).not.toBeUndefined(); expect(n).not.toBeTruthy(); expect(n).toBeFalsy(); }); test('zero', () => { const z = 0; expect(z).not.toBeNull(); expect(z).toBeDefined(); expect(z).not.toBeUndefined(); expect(z).not.toBeTruthy(); expect(z).toBeFalsy(); }); |
Вы должны использовать сопоставление, которое наиболее точно соответствует тому, что вы хотите, чтобы ваш код делал.
Числа:
Большинство способов сравнения чисел имеют эквиваленты сопоставления.
1 2 3 4 5 6 7 8 9 10 11 | test('two plus two', () => { 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); }); |
Для равенства с плавающей запятой используйте toBeCloseTo()
вместо toEqual()
, потому что вы не хотите, чтобы результат теста зависел от крошечной ошибки в округление.
1 2 3 4 5 | test('adding 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()
:
1 2 3 4 5 6 7 | test('there is no I in team', () => { expect('team').not.toMatch(/I/); }); test('but there is a "stop" in Christoph', () => { expect('Christoph').toMatch(/stop/); }); |
Массивы и итерируемые объекты:
Вы можете проверить, содержит ли массив или итерация определенный элемент, используя toContain()
:
1 2 3 4 5 6 7 8 9 10 11 12 | const shoppingList = [ 'diapers', 'kleenex', 'trash bags', 'paper towels', 'milk', ]; test('the shopping list has milk on it', () => { expect(shoppingList).toContain('milk'); expect(new Set(shoppingList)).toContain('milk'); }); |
Исключения:
Если вы хотите проверить, вызывает ли конкретная функция ошибку при ее вызове, используйте toThrow()
.
1 2 3 4 5 6 7 8 9 10 11 12 | 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 the exact error message or a regexp expect(() => compileAndroidCode()).toThrow('you are using the wrong JDK'); expect(() => compileAndroidCode()).toThrow(/JDK/); }); |
Примечание:
Функция, которая генерирует исключение, должна быть вызвана внутри другой функции, в противном случае утверждение toThrow
завершится ошибкой.
Вывод:
В этой статье вы прочитали про JavaScript библиотеку Jest для тестирования, вы узнали что это за библиотека, в чём её прмушество, как её установить и самое главное основы работы с ней, но стоит сказать, что часть статьи это перевод из официальной документации.