๐Ÿ“– ToDo List๋ฅผ Jest๋กœ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ-02_Jest์— ๋Œ€ํ•ด์„œ

์Š˜ยท2024๋…„ 11์›” 25์ผ

๐Ÿ“– TIL

๋ชฉ๋ก ๋ณด๊ธฐ
3/90

Jest์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—.. Jest๊ฐ€ ๋Œ€์ฒด ๋ญ์ง€..?

Jest ํ…Œ์ŠคํŠธ ๋ฌธ๋ฒ• ์†Œ๊ฐœ

Jest๋Š” JavaScript ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ์š” ๋ฌธ๋ฒ•๊ณผ ๊ธฐ๋Šฅ๋“ค์„ ์„ค๋ช…๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. Jest๋Š” describe, it/test, expect, beforeEach/afterEach ๋“ฑ ๋‹ค์–‘ํ•œ ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.


1. describe : ํ…Œ์ŠคํŠธ ๊ทธ๋ฃนํ™”

describe๋Š” ์—ฌ๋Ÿฌ ํ…Œ์ŠคํŠธ๋ฅผ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋‚˜ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ describe๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ด€๋ จ๋œ ํ…Œ์ŠคํŠธ๋“ค์„ ๋ฌถ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

describe('์ˆซ์ž ๋ง์…ˆ ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ', () => {
  // ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋“ค์„ ์ด ์•ˆ์— ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
});


2. it ๋˜๋Š” test : ์‹ค์ œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

it ๋˜๋Š” test๋Š” ๊ฐ๊ฐ ํ•˜๋‚˜์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธํ•˜๊ณ ์ž ํ•˜๋Š” ๋‚ด์šฉ์„ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ž์—ด๊ณผ ์‹ค์ œ ์‹คํ–‰๋  ์ฝ”๋“œ ๋ธ”๋ก์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

it('2์™€ 3์„ ๋”ํ•˜๋ฉด 5๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค', () => {
  const result = 2 + 3;
  expect(result).toBe(5);  // ์˜ˆ์ธกํ•˜๋Š” ๊ฐ’์€ 5์ด์–ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ
});

it๊ณผ test๋Š” ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ํ•˜๋ฏ€๋กœ ๋‘˜ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. it์€ ์ฃผ๋กœ "It should" ํ˜•์‹์˜ ๋ฌธ์žฅ์— ์–ด์šธ๋ฆฌ๊ณ , test๋Š” ์ข€ ๋” ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.



3. expect : ์˜ˆ์ƒ๊ฐ’ ๋น„๊ต

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)


4. beforeEach / afterEach : ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „ํ›„์— ์‹คํ–‰

beforeEach๋Š” ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ ๋ธ”๋ก์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. afterEach๋Š” ๊ฐ ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„์— ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

beforeEach(() => {
  console.log('ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์‹คํ–‰๋œ๋‹ค');
});

afterEach(() => {
  console.log('ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„์— ์‹คํ–‰๋œ๋‹ค');
});


5. beforeAll / afterAll : ์ „์ฒด ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ „ํ›„์— ์‹คํ–‰

beforeAll์€ ์ „์ฒด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ์ด๊ณ , afterAll์€ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต ์ดˆ๊ธฐํ™” ์ž‘์—…์„ ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

beforeAll(() => {
  console.log('์ „์ฒด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹œ์ž‘๋˜๊ธฐ ์ „์— ํ•œ ๋ฒˆ ์‹คํ–‰๋œ๋‹ค');
});

afterAll(() => {
  console.log('์ „์ฒด ํ…Œ์ŠคํŠธ๊ฐ€ ๋๋‚œ ํ›„ ํ•œ ๋ฒˆ ์‹คํ–‰๋œ๋‹ค');
});


6. toBe ์™ธ์— ๋‹ค๋ฅธ matcher๋“ค

expect์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ matcher๋“ค์ž…๋‹ˆ๋‹ค:

  • toBeNull() : ๊ฐ’์ด null์ธ์ง€ ํ™•์ธ
  • toBeDefined() : ๊ฐ’์ด undefined๊ฐ€ ์•„๋‹˜์„ ํ™•์ธ
  • toBeUndefined() : ๊ฐ’์ด undefined์ธ์ง€๋ฅผ ํ™•์ธ
  • toBeNaN() : ๊ฐ’์ด NaN์ธ์ง€๋ฅผ ํ™•์ธ
  • toContain() : ๋ฐฐ์—ด์ด๋‚˜ ๋ฌธ์ž์—ด์— ํŠน์ • ๊ฐ’์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
expect([1, 2, 3]).toContain(2);      // ๋ฐฐ์—ด์— 2๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ
expect('Hello').toContain('ell');   // ๋ฌธ์ž์—ด์— 'ell'์ด ์žˆ๋Š”์ง€ 


7. ์‹ค์ œ ์˜ˆ์‹œ

๊ทธ๋Ÿผ ์‹ค์ œ๋กœ ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
์˜ˆ์‹œ: 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);
  });
});


8. ํ…Œ์ŠคํŠธ ์‹คํ–‰ํ•˜๊ธฐ

์ด์ œ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋ฉด, Jest ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

npm test  # ํ˜น์€ jest


9. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ณด๊ธฐ

ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์€ ์ถœ๋ ฅ์ด ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค:

PASS  ./sum.test.js
  sum ํ•จ์ˆ˜ ํ…Œ์ŠคํŠธ
    โœ“ 2์™€ 3์„ ๋”ํ•˜๋ฉด 5๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค (5 ms)
    โœ“ 0๊ณผ 5๋ฅผ ๋”ํ•˜๋ฉด 5๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค (1 ms)
    โœ“ ์Œ์ˆ˜์™€ ์–‘์ˆ˜๋ฅผ ๋”ํ•˜๋ฉด ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ณ„์‚ฐ๋œ๋‹ค (2 ms)

์‹คํŒจํ•œ ๊ฒฝ์šฐ์—๋Š” ํ•ด๋‹นํ•˜๋Š” ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€์™€ ํ•จ๊ป˜ ์‹คํŒจํ•œ ์ด์œ ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.



์ด๊ฒƒ์ด Jest์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค. describe๋กœ ํ…Œ์ŠคํŠธ ๊ทธ๋ฃน์„ ๋งŒ๋“ค๊ณ , it ๋˜๋Š” test๋กœ ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ, expect๋กœ ์˜ˆ์ƒํ•œ ๊ฐ’๊ณผ ์‹ค์ œ ๊ฐ’์„ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

profile
์ฃผ๋‹ˆ์–ด ํ”„๋ก ํŠธ์—”๋“œ ์„ฑ์žฅ๊ธฐ ๊ธฐ๋ก๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€