1. TDD

  • TDD๋ž€

  • Jest

  • Describe - Context - It ํŒจํ„ด

  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ž€

๊ฐ•์˜ ์ •๋ฆฌ

TDD (Test Driven Development)

ํ”„๋ก ํŠธ์—”๋“œ์—์„œ์˜ TDD. Jest, RTL. ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ. ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ์‹คํŒจ์‹œํ‚ค๊ณ , ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ง ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ค‘๋ณต์„ ์ค„์ธ๋‹ค.

๊ตฌํ˜„๋ถ€๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•œ๋‹ค. ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ž‘์„ฑํ•œ๋‹ค. ๊ตฌํ˜„๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ŠคํŽ™์„ ๋จผ์ € ์ •์˜ํ•จ์œผ๋กœ์จ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ์‹.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ.

// ์ด๊ฒƒ์€ ์—„๋ฐ€ํžˆ ๋งํ•˜๋ฉด ์‹œ๊ทธ๋‹ˆ์ฒ˜, ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฒƒ์ด ์ธํ„ฐํŽ˜์ด์Šค๋‹ค.
add(x, y) -> number

TDD๋ผ๋Š” ๊ฒƒ์€ ๊ณ„์†ํ•ด์„œ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ. ์ผ์ • ์ˆ˜์ค€์— ๋‹ค๋‹ค๋ฅผ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต์„ ํ•œ๋‹ค. (๊ธฐ์ค€ ์ด์ƒ์˜ ์ฝ”๋“œ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ๋‚˜์˜ฌ๋•Œ ๊นŒ์ง€) ์ผ„ํŠธ๋ฐฑ์€ Green์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ฃ„์•…์„ ํ–‰ํ•ด๋„ ๊ดœ์ฐฎ๋‹ค๊ณ  ํ•œ๋‹ค.

TDD Cycle

  1. Red -> ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑ. ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ŠคํŽ™์— ์ง‘์ค‘ํ•œ๋‹ค.

  2. Green -> ์žฌ๋นจ๋ฆฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚จ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ์–ด๋„ ๊ดœ์ฐฎ๋‹ค. Stub์„ ํ™œ์šฉํ•˜์—ฌ ๊ฐ€์งœ๋กœ ํ•ด๋„ ๋œ๋‹ค.

  3. Refactor -> ๋ฆฌํŒฉํ„ฐ๋ง์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งŒ๋“ ๋‹ค. TDD์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์ง€๋งŒ, ๊ฐ„๊ณผ๋  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•œ ํ•ด๋ฒ•์„ ๋‚ด๋ ค๊ณ  ํ•˜๋ฉด ๊ต‰์žฅํžˆ ์–ด๋ ต๋‹ค. ํ…Œ์ŠคํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ํ†ต๊ณผ์‹œํ‚ค๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ํ•œ๋‹ค. ๋ฆฌํŒฉํ† ๋ง์€ ๋™์ž‘์„ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  ๋‚ด๋ถ€ ์„ค๊ณ„๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ. 1๋ถ„ ์ดํ•˜๋กœ ํ•œ ์‹ธ์ดํด์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹๋‹ค, ๊ธธ์–ด๋„ 10๋ถ„ ์ด๋‚ด 1๋ฒˆ์—์„œ 2๋ฒˆ์œผ๋กœ ๊ฐ€๋Š” ์‹œ๊ฐ„์ด ์˜ค๋ž˜๊ฑธ๋ฆฌ๋ฉด 1๋ฒˆ์„ ๋„ˆ๋ฌด ๋ณต์žกํ•˜๊ฒŒ ์ž‘์„ฑํ•œ ๊ฒƒ์ผ์ˆ˜ ์žˆ๋‹ค. 3๋ฒˆ์„ ์œ„ํ•ด ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๊ณ  ์ค‘๋ณต์„ ์ฐพ์•„ ์ œ๊ฑฐํ•˜๋Š” ์—ฐ์Šต์„ ํ•ด์•ผํ•œ๋‹ค. ์ด ๊ณผ์ •์ด ์ต์ˆ™ํ•ด์•ผ TDD๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋„๊ตฌ๋ฅผ ์“ธ ์ค„ ์•Œ์•„์•ผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋„๊ตฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ๊ฒƒ.

Jest

ํŽ˜์ด์Šค๋ถ์—์„œ ๋งŒ๋“  ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์“ธ๋งŒํ•˜๋‹ค ์‹ถ์€ ๊ฒƒ๋“ค์€ ๋‹ค ๋“ค์–ด์žˆ๊ณ  ์‚ฌ์šฉ๋ฒ•๋„ ๋‹จ์ˆœํ•˜๋‹ค.

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•  ๋•Œ ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

  1. test ํ•จ์ˆ˜๋กœ ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๋ฐฉ์‹

  2. BDD ์Šคํƒ€์ผ๋กœ ์ฃผ์ฒด-ํ–‰์œ„ ์ค‘์‹ฌ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์กฐ์งํ™”ํ•˜๋Š” ๋ฐฉ์‹.

ํ…Œ์ŠคํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•  ๋•Œ BDD ์Šคํƒ€์ผ๋กœ ํ•˜๋ฉด ๋ณดํ†ต App.spec.ts์™€ ๊ฐ™์ด spec์„ ๋งŽ์ด ๋„ฃ๋Š”๋‹ค.

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ , ๊ณ ์น˜๊ณ  ์‹ถ์„ ๋งŒํผ ๊ตฌํ˜„๋ถ€ ์ฝ”๋“œ๋ฅผ ๊ณ„์† ๊ณ ์นœ๋‹ค, ๋ฆฌํŒฉํ† ๋งํ•œ๋‹ค.

function add(...numbers: number[]): number {
  if (numbers.length === 0) {
    return 0;
  }
  return numbers.reduce(acc, (number) => {
    return acc + number;
  });
}

test('add', () => {
  expect(add(1, 2)).toBe(3);
});

const context = describe;

describe('add', () => {
  context('with no argument', () => {
    it('returns zero', () => {
      expect(add()).toBe(0);
    });
  });

  context('with only one number', () => {
    it('returns the same number', () => {
      expect(add(1)).toBe(1);
    });
  });

  context('with two numbers', () => {
    it('returns sum of two numbers', () => {
      expect(add(1, 2)).toBe(3);
    });
  });

  context('with three numbers', () => {
    it('returns sum of three numbers', () => {
      expect(add(1, 2, 3)).toBe(6);
    });
  });
});

Last updated