Jest์ ๋ค์ด๊ฐ๊ธฐ ์ ์.. Jest๊ฐ ๋์ฒด ๋ญ์ง..?
Jest๋ JavaScript ํ
์คํธ ํ๋ ์์ํฌ๋ก, ํ
์คํธ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ฌ์ฉํ๋ ์ฃผ์ ๋ฌธ๋ฒ๊ณผ ๊ธฐ๋ฅ๋ค์ ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค. Jest๋ describe, it/test, expect, beforeEach/afterEach ๋ฑ ๋ค์ํ ๊ธฐ๋ณธ์ ์ธ ํจ์๋ค์ ์ ๊ณตํฉ๋๋ค.
describe : ํ
์คํธ ๊ทธ๋ฃนํdescribe๋ ์ฌ๋ฌ ํ
์คํธ๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ๋ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ผํ ์ปดํฌ๋ํธ๋ ํจ์์ ๋ํด ์ฌ๋ฌ ๊ฐ์ง ํ
์คํธ๋ฅผ ์คํํ ๋ describe๋ฅผ ์ฌ์ฉํด์ ๊ด๋ จ๋ ํ
์คํธ๋ค์ ๋ฌถ์ ์ ์์ต๋๋ค.
describe('์ซ์ ๋ง์
ํจ์ ํ
์คํธ', () => {
// ์ฌ๋ฌ ๊ฐ์ ํ
์คํธ ์ผ์ด์ค๋ค์ ์ด ์์ ๋ฃ์ ์ ์์ต๋๋ค.
});
it ๋๋ test : ์ค์ ํ
์คํธ ์ผ์ด์คit ๋๋ test๋ ๊ฐ๊ฐ ํ๋์ ํ
์คํธ ์ผ์ด์ค๋ฅผ ์ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค. ํ
์คํธํ๊ณ ์ ํ๋ ๋ด์ฉ์ ์ค๋ช
ํ๋ ๋ฌธ์์ด๊ณผ ์ค์ ์คํ๋ ์ฝ๋ ๋ธ๋ก์ ์์ฑํฉ๋๋ค.
it('2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค', () => {
const result = 2 + 3;
expect(result).toBe(5); // ์์ธกํ๋ ๊ฐ์ 5์ด์ด์ผ ํ๋ค๋ ์๋ฏธ
});
it๊ณผ test๋ ๊ฐ์ ๊ธฐ๋ฅ์ ํ๋ฏ๋ก ๋ ์ค ํ๋๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. it์ ์ฃผ๋ก "It should" ํ์์ ๋ฌธ์ฅ์ ์ด์ธ๋ฆฌ๊ณ , test๋ ์ข ๋ ์ง๊ด์ ์
๋๋ค.
expect๋ ์ค์ ๊ฐ๊ณผ ์์๊ฐ์ ๋น๊ตํ๋ ํจ์์
๋๋ค. ์์ํ ๊ฐ์ด ์ค์ ๋ก ๋์ค๋์ง ํ์ธํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค.
expect(2 + 3).toBe(5); // 5์ ์ผ์นํ๋์ง ๋น๊ต
expect({name: 'Alice'}).toEqual({name: 'Alice'}); // ๊ฐ์ฒด ๋ด์ฉ์ด ๊ฐ์์ง ๋น๊ต
expect(0).toBeFalsy(); // 0์ falsy์ด๋ฏ๋ก ํต๊ณผ
์ฌ์ฉ ๊ฐ๋ฅํ ์ฃผ์ expect ๋น๊ต ๋ฉ์๋:
toBe(expected) : ๊ฐ์ด ์ ํํ expected์ ์ผ์นํ๋์ง ๋น๊ตtoEqual(expected) : ๊ฐ์ด ๊ฐ์ฒด๋ ๋ฐฐ์ด์ธ ๊ฒฝ์ฐ, ๋ด์ฉ์ด ๊ฐ์์ง ๋น๊ตtoBeTruthy() : ๊ฐ์ด "truthy"์ธ ๊ฒฝ์ฐ (์: true, 1, '๋ฌธ์์ด')toBeFalsy() : ๊ฐ์ด "falsy"์ธ ๊ฒฝ์ฐ (์: false, null, undefined, 0, NaN)beforeEach๋ ๊ฐ ํ
์คํธ๊ฐ ์คํ๋๊ธฐ ์ ์ ์คํ๋๋ ์ฝ๋ ๋ธ๋ก์ ์ ์ํฉ๋๋ค. afterEach๋ ๊ฐ ํ
์คํธ๊ฐ ๋๋ ํ์ ์คํ๋๋ ์ฝ๋์
๋๋ค.
beforeEach(() => {
console.log('ํ
์คํธ๊ฐ ์์๋๊ธฐ ์ ์ ์คํ๋๋ค');
});
afterEach(() => {
console.log('ํ
์คํธ๊ฐ ๋๋ ํ์ ์คํ๋๋ค');
});
beforeAll์ ์ ์ฒด ํ
์คํธ๊ฐ ์คํ๋๊ธฐ ์ ์ ํ ๋ฒ๋ง ์คํ๋๋ ์ฝ๋์ด๊ณ , afterAll์ ๋ชจ๋ ํ
์คํธ๊ฐ ๋๋ ํ ํ ๋ฒ๋ง ์คํ๋ฉ๋๋ค. ๋ณดํต ์ด๊ธฐํ ์์
์ ํ ๋ ์ ์ฉํฉ๋๋ค.
beforeAll(() => {
console.log('์ ์ฒด ํ
์คํธ๊ฐ ์์๋๊ธฐ ์ ์ ํ ๋ฒ ์คํ๋๋ค');
});
afterAll(() => {
console.log('์ ์ฒด ํ
์คํธ๊ฐ ๋๋ ํ ํ ๋ฒ ์คํ๋๋ค');
});
expect์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ๋ค์ํ matcher๋ค์
๋๋ค:
toBeNull() : ๊ฐ์ด null์ธ์ง ํ์ธtoBeDefined() : ๊ฐ์ด undefined๊ฐ ์๋์ ํ์ธtoBeUndefined() : ๊ฐ์ด undefined์ธ์ง๋ฅผ ํ์ธtoBeNaN() : ๊ฐ์ด NaN์ธ์ง๋ฅผ ํ์ธtoContain() : ๋ฐฐ์ด์ด๋ ๋ฌธ์์ด์ ํน์ ๊ฐ์ด ํฌํจ๋์ด ์๋์ง ํ์ธexpect([1, 2, 3]).toContain(2); // ๋ฐฐ์ด์ 2๊ฐ ์๋์ง ํ์ธ
expect('Hello').toContain('ell'); // ๋ฌธ์์ด์ 'ell'์ด ์๋์ง
๊ทธ๋ผ ์ค์ ๋ก ๊ฐ๋จํ ํจ์์ ๋ํ ํ
์คํธ๋ฅผ ์์ฑํด ๋ณด๊ฒ ์ต๋๋ค.
์์: sum.js (๋ง์
ํจ์)
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
์์:sum.test.js(๋ง์
ํจ์์ ๋ํ ํ
์คํธ)
// sum.test.js
const sum = require('./sum');
describe('sum ํจ์ ํ
์คํธ', () => {
it('2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค', () => {
expect(sum(2, 3)).toBe(5);
});
it('0๊ณผ 5๋ฅผ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค', () => {
expect(sum(0, 5)).toBe(5);
});
it('์์์ ์์๋ฅผ ๋ํ๋ฉด ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐ๋๋ค', () => {
expect(sum(-1, 1)).toBe(0);
});
});
์ด์ ํ ์คํธ๋ฅผ ์คํํ๋ ค๋ฉด, Jest ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ ์ ์์ต๋๋ค. ํฐ๋ฏธ๋์์ ์๋ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
npm test # ํน์ jest
ํ ์คํธ๊ฐ ์ฑ๊ณตํ๋ฉด, ์๋์ ๊ฐ์ ์ถ๋ ฅ์ด ๋ํ๋ฉ๋๋ค:
PASS ./sum.test.js
sum ํจ์ ํ
์คํธ
โ 2์ 3์ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค (5 ms)
โ 0๊ณผ 5๋ฅผ ๋ํ๋ฉด 5๊ฐ ๋์ด์ผ ํ๋ค (1 ms)
โ ์์์ ์์๋ฅผ ๋ํ๋ฉด ๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๊ณ์ฐ๋๋ค (2 ms)
์คํจํ ๊ฒฝ์ฐ์๋ ํด๋นํ๋ ์ค๋ฅ ๋ฉ์์ง์ ํจ๊ป ์คํจํ ์ด์ ๋ฅผ ๋ณด์ฌ์ค๋๋ค.
์ด๊ฒ์ด Jest์์ ์์ฃผ ์ฌ์ฉํ๋ ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ์ ๋๋ค. describe๋ก ํ ์คํธ ๊ทธ๋ฃน์ ๋ง๋ค๊ณ , it ๋๋ test๋ก ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์์ฑํ๋ฉฐ, expect๋ก ์์ํ ๊ฐ๊ณผ ์ค์ ๊ฐ์ ๋น๊ตํ๋ ๋ฐฉ์์ผ๋ก ํ ์คํธ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.