1. TDD

๊ตฌํ˜„๋ณด๋‹ค ์ธํ„ฐํŽ˜์ด์Šค์™€ ์ŠคํŽ™์„ ๋จผ์ € ์ •์˜, ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

TDD Cycle

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

  2. Green โ†’ ์žฌ๋นจ๋ฆฌ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผ์‹œํ‚จ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹ˆ์–ด๋„ ๊ดœ์ฐฎ๋‹ค.

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

  • ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘์€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ๊ฐœ์„ ์‹œ์ผœ ๋‚˜๊ฐ„๋‹ค.

  • ํฐ ๋‹จ์œ„๋กœ์˜ ๋ฐ˜๋ณต์€ ํž˜๋“œ๋‹ˆ, ์ž‘์€ ๋‹จ๊ณ„๋ฅผ ๋งŒ๋“ ๋‹ค.

Jest

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

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

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

Jest์—์„œ TypeScript ์‚ฌ์šฉํ•˜๋„๋ก jest.config.js ์ž‘์„ฑํ•ด์ค€๋‹ค

module.exports = {
 testEnvironment: 'jsdom',
 setupFilesAfterEnv: [
  '@testing-library/jest-dom/extend-expect',
 ],
 transform: {
  '^.+\\.(t|j)sx?$': ['@swc/jest', {
   jsc: {
    parser: {
     syntax: 'typescript', 
     jsx: true,
     decorators: true,
    },
    transform: { 
     react: {
      runtime: 'automatic',
     },
    },
   },
  }],
 },
};

App.test.ts๋‚˜ App.spec.ts ๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉํ•œ๋‹ค. ์ฒ˜์Œ์—๋Š” test ํ•จ์ˆ˜๋กœ ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ๋ฅผ ์จ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

function add(x:number, y:number):number {
  return x + y;
}

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

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  npx jest ๋ช…๋ น์–ด๋กœ ํ…Œ์ŠคํŠธ ์‹คํ–‰.

๊ณ„์† ์‹คํ–‰ํ•ด์•ผ๋˜๋‹ˆ ๋ถˆํŽธํ•˜๋‹ค.

npx jest --watchAll ํ•ด์ฃผ๋ฉด hot reload ๋œ๋‹ค.

BDD style

BDD ์Šคํƒ€์ผ๋กœ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ๊ณผ ํ–‰์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

function add(x:number, y:number):number {
  return x + y;
}

describe('add', () => {
  it('๋‘ ์ˆซ์ž์˜ ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค', () => {
    expect(add(1, 2)).toBe(3);
  });
});

BDD๋Š” ์“ธ๋ฐ์—†์ด ๊ธธ์–ด์ง€๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?

  • ํ•œ describe์— ๋‹ค๋ฅธ describe๋ฅผ ๋„ฃ์–ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ™์€ ๋งฅ๋ฝ์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์—ฌ๋Ÿฟ ์ถ”๊ฐ€ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ๋ฅผ ๋ฏฟ๊ณ  add ํ•จ์ˆ˜๋ฅผ refactoring ํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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);
  });
 });
});

test๋„ ๋ฌผ๋ก  ๊ฐ€๋Šฅํ•˜๋‹ค.

test ('add ํ…Œ์ŠคํŠธ', () => {
    expect(add().toBe(0))
    expect(add(1,2).toBe(3))
    expect(add(1,2,3.toBe(6)))
})

์œ„์˜ BDD ๋ฐฉ์‹์€ description์„ ์ถ”๊ฐ€ํ•ด์ค„ ์ˆ˜ ์žˆ์–ด ์ข€ ๋” ๋ช…ํ™•ํ•œ ๊ฒƒ.

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

ํ…Œ์ŠคํŠธ๋Š” ๋ฒ”์œ„๋‚˜ ์„ฑ๊ฒฉ์— ๋”ฐ๋ผ UI Test, Integration Test, Unit Test ๋“ฑ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

๊ทธ ์ค‘ unit test๋Š” ์ž‘์€ ๋‹จ์œ„(ํ•จ์ˆ˜ ๋‹จ์œ„) ์†Œ์Šค ์ฝ”๋“œ์˜ ํŠน์ • ๋ชจ๋“ˆ์ด ์˜๋„๋œ ๋Œ€๋กœ ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ์ด๋‹ค.

์ฆ‰, ๋ชจ๋“  ํ•จ์ˆ˜์™€ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ ˆ์ฐจ๋ฅผ ๋งํ•œ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด์ ์ด ์žˆ๋‹ค.

  1. ์ž‘์„ฑํ•œ ์ฝ”๋“œ๊ฐ€ ์˜๋„ํ•œ ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•œ ์ ˆ์ฐจ๋กœ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋Šฅ

  2. ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ์˜ํ•œ ์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์˜ˆ๋ฐฉ์ฑ…์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

  3. ์„œ๋น„์Šค ์š”๊ตฌ์‚ฌํ•ญ ๋ณ€๊ฒฝ์ด๋‚˜ ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ ์ธํ•ด ์ฝ”๋“œ ์ˆ˜์ •์ด ํ•„์š”ํ•œ ์ƒํ™ฉ์—์„œ ๋” ์œ ์—ฐํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๋Œ€์‘์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

  4. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ณผ์ •์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ฝ”๋“œ์˜ ๋ชจ๋“ˆํ™”๋ฅผ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋˜๋Š” ๋“ฑ์˜ ๋ถ€์ˆ˜์ ์ธ ์ด์ ๋“ค๋„ ์žˆ๋‹ค.

Last updated