๐Ÿ‘ฉโ€๐Ÿ’ป
Megaptera Frontend
  • ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
    • megaptera-front
    • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 1. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
      • 2. TypeScript
      • 3. React
      • 4. Testing Library
      • 5. Parcel & ESLint
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 2. JSX
      • 1. JSX
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 3. React๋กœ ์‚ฌ๊ณ ํ•˜๊ธฐ
      • 1. React Component
      • 2. React State
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 4. React Hooks
      • 1. Express
      • 2. Fetch API & CORS
      • 3. React์˜ Hook
      • 4. useRef & Custom Hook
      • 5. usehooks-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 5. ํ…Œ์ŠคํŠธ
      • 1. TDD
      • 2. React Testing Library
      • 3. MSW
      • 4. Playwright
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 6. External Store
      • 1. External Store
      • 2. TSyringe
      • 3. Redux ๋”ฐ๋ผํ•˜๊ธฐ
      • 4. usestore-ts
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 7. React Router
      • 1. Routing
      • 2. Routes
      • 3. Router
      • 4. Navigation
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 8. CSS in JS
      • 1. Design System
      • 2. Style Basics
      • 3. CSS in JS
      • 4. styled-components
      • 5. props์™€ attrs
      • 6. Global Style & Theme
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 9. ์‡ผํ•‘๋ชฐ ๋ชฉ๋ก, ์ƒํ’ˆ ํŽ˜์ด์ง€
      • 1. ๊ฐœ๋ฐœํ•˜๊ธฐ ์ „ ์ค€๋น„
      • 2. ๋ชฉ๋ก ๋ณด๊ธฐ
      • 3. ์ƒํ’ˆ ์ƒ์„ธ ๋ณด๊ธฐ
      • 4. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ณด๊ธฐ
      • 5. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ƒํ’ˆ ๋‹ด๊ธฐ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 10. ์‚ฌ์šฉ์ž ์ธ์ฆ, ์ธ๊ฐ€
      • 1. ๋กœ๊ทธ์ธ
      • 2. ๋กœ๊ทธ์•„์›ƒ
      • 3. ํšŒ์›๊ฐ€์ž…
      • 4. ์ฃผ๋ฌธ ๋ชฉ๋ก & ์ฃผ๋ฌธ ์ƒ์„ธ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 11. ์ฃผ๋ฌธ, ๊ฒฐ์ œ
      • 1. ๋ฐฐ์†ก ์ •๋ณด ์ž…๋ ฅ
      • 2. ํฌํŠธ์› ๊ฒฐ์ œ ์š”์ฒญ
      • 3. ๋ฐฐ์†ก ๋ฐ ๊ฒฐ์ œ ์ •๋ณด ์ „๋‹ฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
    • 12. ์–ด๋“œ๋ฏผ
      • 1. ๊ด€๋ฆฌ์ž ์›น ์‚ฌ์ดํŠธ ๊ฐœ๋ฐœ ์‹œ์ž‘
      • 2. ๋กœ๊ทธ์ธ, ์‚ฌ์šฉ์ž ๋ชฉ๋ก
      • 3. ์นดํ…Œ๊ณ ๋ฆฌ ๊ด€๋ฆฌ
      • 4. ์ฃผ๋ฌธ ๊ด€๋ฆฌ
      • 5. ์ƒํ’ˆ ๊ด€๋ฆฌ
      • ํ•œ ์ฃผ๋ฅผ ๋งˆ์น˜๋ฉฐ
Powered by GitBook
On this page
  • 1. TDD
  • TDD Cycle
  • ๋ฆฌํŒฉํ† ๋ง
  • ์ค‘๋ณต ์ œ๊ฑฐ
  • 2. Jest
  • ํŒŒ์ผ๋ช…
  • ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
  • jest.config.js
  • Jest ์‹คํ–‰ํ•˜๊ธฐ
  • SWC
  • 3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ
  • test ํ•จ์ˆ˜๋กœ ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ
  • BDD ์Šคํƒ€์ผ๋กœ ํ…Œ์ŠคํŠธ ๋Œ€์ƒ๊ณผ ํ–‰์œ„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๊ธฐ
  • ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ ๊ณ ๋ คํ•˜๊ธฐ(Describe - Context - It ํŒจํ„ด)
  • 4. Describe - Context - It ํŒจํ„ด
  • ์žฅ์ 
  • ์ค‘๋ณต ์ œ๊ฑฐ ์˜ˆ์‹œ
  • 5. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
  1. ์ฃผ์ฐจ๋ณ„ ํ•™์Šต
  2. 5. ํ…Œ์ŠคํŠธ

1. TDD

Previous5. ํ…Œ์ŠคํŠธNext2. React Testing Library

Last updated 2 years ago

1. TDD

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

TDD Cycle

๐Ÿ“Œ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ผ์ • ์ˆ˜์ค€์— ๋„๋‹ฌํ•  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰

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

    1. ์ธํ„ฐํŽ˜์ด์Šค : ์‹œ๊ทธ๋‹ˆ์ฒ˜์˜ ์ง‘ํ•ฉ

    2. ์‹œ๊ทธ๋‹ˆ์ฒ˜ : Ex. add(x, y) -> number

    3. ์ŠคํŽ™ : ์–ด๋–ค ์˜ˆ์ œ์˜ ๊ธฐ๋Œ“๊ฐ’

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

    1. ๊ฐ€์งœ๋กœ ์ž‘์„ฑํ•˜๊ธฐ()

    2. ์ฃ„์•… ์ €์ง€๋ฅด๊ธฐ

  3. ๐Ÿ›  Refactor โ†’ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋งŒ๋“ค๊ธฐ

  • ์‚ฌ์ดํด ์†Œ์š” ์‹œ๊ฐ„ : 1๋ถ„ ์ดํ•˜๊ฐ€ ์ตœ๊ณ , 10๋ถ„ ์•ˆ์— ํ•œ ์‚ฌ์ดํด์„ ๋Œ๋ฆด ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ

    • ์‹คํŒจํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊ฐ€์งœ๋กœ๋ผ๋„ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ฆฐ๋‹ค๋ฉด, 1๋ฒˆ์ด ๋„ˆ๋ฌด ํฐ ๊ฒƒ

    • ๋” ์‰ฝ๊ณ  ์ž‘์€ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•จ

๐Ÿ™‹๐Ÿปโ€โ™€๏ธ ์ฃผ์˜ ์‚ฌํ•ญ

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

๋ฆฌํŒฉํ† ๋ง

๐Ÿ“Œ TDD์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด์ง€๋งŒ, ๊ฐ„๊ณผ๋  ๋•Œ๊ฐ€ ๋งŽ์Œ

  • TDD์˜ ๋ชฉํ‘œ๋Š” ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ํด๋ฆฐ์ฝ”๋“œ โ†’ ๋ฆฌํŒฉํ† ๋ง ๋•๋ถ„์— ๊ฐ€๋Šฅํ•ด์ง

  • ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ํ„ฐ์ง€์ง€ ์•Š๋Š” ์„ ์—์„œ ๊ณ„์† ๋ฆฌํŒฉํ† ๋ง

  • ๋™์ž‘์€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  ์„ค๊ณ„๋งŒ ๋ฐ”๋€Œ๋Š” ๊ฒƒ(์ŠคํŽ™์€ ๊ทธ๋Œ€๋กœ)

์ค‘๋ณต ์ œ๊ฑฐ

์•ˆ ๋ณด์ด๋ฉด ์—ฐ์Šตํ•ด์•ผ ํ•จ ์˜๋„๋ฅผ ๋“œ๋Ÿฌ๋‚ด๋ฉด ์ค‘๋ณต์ด ๋ณด์ด๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ ์ค‘๋ณต์„ ๊ณ„์† ๋งŒ๋“ค์–ด๋‚ธ ํ›„ ํŒจํ„ด์„ ์ฐพ์•„๋‚ด์„œ ์ •๋ฆฌ

โš ๏ธ TDD์— ๋Œ€ํ•ด์„œ ์ฃผ์˜ํ•  ์ 

ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ํ•ด์„œ TDD ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. TDD Cycle ์— ๋”ฐ๋ผ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ , ๊ตฌํ˜„ํ•˜๊ณ , ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š” ๊ณผ์ •์„ ์—„๊ฒฉํ•˜๊ฒŒ ์ง€์ผœ์„œ ๊ฐœ๋ฐœ์„ ์ง„ํ–‰ํ•ด์•ผ TDD ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. TDD ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋ณ„๊ฐœ๋กœ ๋”ฐ๋กœ ์—ฐ์Šต์ด ํ•„์š”ํ•˜๊ณ  ์Šต๊ด€์„ ๋“ค์—ฌ์•ผํ•˜๋Š” ๋ถ„์•ผ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  TDD ๋ฅผ ์ž˜ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ๋ฒ• ์ž์ฒด๋ถ€ํ„ฐ ๊ณต๋ถ€๋ฅผ ํ•˜์…”์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์žฅ์€ TDD ๋ณด๋‹ค ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์— ์ต์ˆ™ํ•ด์ง€๊ณ  ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ž˜ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์— ์ดˆ์ ์„ ๋งž์ถฐ ๊ณต๋ถ€ํ•˜์‹œ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

2. Jest

Jest๋Š” ๋‹จ์ˆœ์„ฑ์— ์ดˆ์ ์„ ๋‘” JavaScript ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ Jest๋Š” Mocha์™€ Chai์ฒ˜๋Ÿผ RSpec์˜ describe-it์„ ์ง€์›ํ•˜๊ณ , expect๋กœ ๋‹จ์–ธ(assertion) ๊ฐ€๋Šฅ Mocking๋„ ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์—์„œ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ โ‡’ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ–์ถ˜ ํ…Œ์ŠคํŒ… ๋„๊ตฌ ๐Ÿ› 

ํŒŒ์ผ๋ช…

๐Ÿท ํ…Œ์ŠคํŠธํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ.spec | test.ํ™•์žฅ์ž
  • sample.test.ts

  • sample.spec.ts - ์ฃผ๋กœ BDD ์Šคํƒ€์ผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ

npx jest๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ํ„ฐ๋ฏธ๋„์— ์ถœ๋ ฅ๋˜๋Š” ๋‚ด์šฉ

 testMatch: **/__tests__/**/*.[jt]s?(x), **/?(*.)+(spec|test).[tj]s?(x) - 0 matches

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค

ํ…Œ์ŠคํŠธ ํ•ด์•ผํ•˜๋Š” ํ•˜๋‚˜ ํ•˜๋‚˜์˜ ์ผ€์ด์Šค

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•

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

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

jest.config.js

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',
                    },
               },
            },
        }],
   },
};

Jest ์‹คํ–‰ํ•˜๊ธฐ

# jest ์‹คํ–‰
npx jest

# jest ์ž๋™ ์‹คํ–‰
npx jest --watchAll
# ์ดํ›„ Enter ์ž…๋ ฅ

npx jest --watchAll์€ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋‚ด์šฉ์ด ๋ฐ”๋€” ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰

๐Ÿšจ ์™ธ๋ถ€ ์˜์กด์„ฑ

์„œ๋ฒ„๋ฅผ ๋„์šฐ์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์˜ค๋ฅ˜ ๋ฐœ์ƒ

SWC

Rust๋กœ ๋งŒ๋“  ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ์ปดํŒŒ์ผ๋Ÿฌ

Jest๋Š” ํƒ€์ž…์Šคํฌ๋ฆฝํŠธ ๊ฒ€์ฆ์„ ํ•˜์ง€ ์•Š์Œ โ†’ SWC๊ฐ€ ํƒ€์ž…์„ ๋นผ๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ๋Œ๋ฆฌ๊ธฐ ๋•Œ๋ฌธ ํƒ€์ž…์„ ์žก๊ณ  ์‹ถ๋‹ค๋ฉด ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋จ

npx tsc --noEmit

์ปดํŒŒ์ผ์„ ์ง„ํ–‰ํ•œ ๊ฒฐ๊ณผ๊ฐ€ js ํŒŒ์ผ๋กœ ์ƒ๊ธฐ๋Š”๋ฐ, ์ด๊ฒƒ์„ ์ƒ๊ธฐ์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ช…๋ น

3. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑํ•˜๊ธฐ

test ํ•จ์ˆ˜๋กœ ๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ

์ฒ˜์Œ์—๋Š” ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•ด๋ณผ ๊ฒƒ

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

test('add', () => {
    expect(add(1, 2)).toBe(3);
});
function add(x: number, y: number): number {
   return x + y; // ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๋ฉด์„œ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ๋“œ๋Ÿฌ๋‚ด๊ธฐ
}

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

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

๐Ÿ“ BDD

  • ์–ด๋–ค ๊ฒƒ์„ ํ…Œ์ŠคํŠธ ํ•  ๊ฒƒ์ด๋‹ค

  • ์–ด๋–ป๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค

๐Ÿ’ก ๋‹จ์ˆœํ•œ ๊ฒฝ์šฐ์—๋Š” test ํ•จ์ˆ˜๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ž‘์„ฑ, BDD ์Šคํƒ€์ผ์€ ๋ณต์žกํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•  ๊ฒฝ์šฐ์— ์œ ์šฉ

describe('add', () => {
    it('returns sum of two numbers', () => {
        expect(add(1, 2)).toBe(3);
    });
});
  • add - ์ฃผ์–ด

  • it - ์ฃผ์–ด๋Š” ~ ํ•˜๋‹ค

  • expect - ๊ธฐ์กด์˜ ๊ฒฝ์šฐ์™€ ๋™์ผ, ๊ธฐ๋Œ€๊ฐ’

๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ ๊ณ ๋ คํ•˜๊ธฐ(Describe - Context - It ํŒจํ„ด)

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

์ด ๊ณผ์ •์—์„œ add ํ•จ์ˆ˜๊ฐ€ ๋ฐ”๋€Œ๋Š”๋ฐ, ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์ด TDD

4. Describe - Context - It ํŒจํ„ด

์ƒํ™ฉ๋งˆ๋‹ค ๋‹ค๋ฅธ ๋งฅ๋ฝ์„ ๋ฌ˜์‚ฌํ•˜๋Š” ๊ฒƒ ์ฝ”๋“œ์˜ ํ–‰๋™์„ ์„ค๋ช…ํ•˜๋Š” ํŒจํ„ด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€

RSpec์˜ describe-it์—์„œ ๋”ฐ์˜จ ํŒจํ„ด when ๋˜๋Š” with ์‚ฌ์šฉ context๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ

// ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
const context = describe;

์žฅ์ 

  • ์“ฐ๊ธฐ ํŽธํ•˜๊ณ  ์ฝ”๋“œ์˜ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•ด์ง

  • ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ์Œ โ†’ ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€์˜ ์ฆ๋Œ€

  • ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ๋‚จ๋ฐœํ•˜๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ

์ค‘๋ณต ์ œ๊ฑฐ ์˜ˆ์‹œ

โ“ ์–ด๋””๊นŒ์ง€ ๋ฆฌํŒฉํ† ๋ง ํ•ด์•ผ ํ• ๊นŒ?

๋‚ด๊ฐ€ ๊ณ ์น˜๊ณ  ์‹ถ์€ ๋งŒํผ

์ฒ˜์Œ ์‹œ์ž‘ ํ•จ์ˆ˜

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

๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜๋ฉฐ ๋ณ€ํ˜•๋œ ํ•จ์ˆ˜

function add(...numbers: number[]): number {
    return (numbers[0] ?? 0) + (numbers[1] ?? 0) + (numbers[2] ?? 0);
}

ํŒจํ„ด ํŒŒ์•…ํ•˜๊ธฐ

function add(...numbers: number[]): number {
    return (numbers[numbers.length - 3] ?? 0) 
            + (numbers[numbers.length - 2] ?? 0) 
            + (numbers[numbers.length - 1] ?? 0);
}
function add(...numbers: number[]): number {
    if (numbers.length === 0) {
        return 0;
    }
    if (numbers.length === 1) {
        return numbers[0];
    }
    if (numbers.length === 2) {
        return numbers[0] + numbers[1];
    }
    if (numbers.length === 3) {
        return numbers[0] + numbers[1] + numbers[2];
    }
}

์žฌ๊ท€๋ฅผ ํ†ตํ•œ ํ’€์ด

์•„๋žซ์ค„๋ถ€ํ„ฐ ๊ฑฐ์Šฌ๋Ÿฌ ์˜ฌ๋ผ๊ธฐ๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐ

   if (numbers.length === 3) {
         return add(...numbers.slice(0, numbers.length - 1)) 
                 + numbers[numbers.length - 1];
}
    if (numbers.length >= 2) {
        return add(...numbers.slice(0, numbers.length - 1)) 
                + numbers[numbers.length - 1];
}
    if (numbers.length >= 1) {
        return add(...numbers.slice(0, numbers.length - 1)) 
                + numbers[numbers.length - 1];
}
function add(...numbers: number[]): number {
    if (numbers.length === 0) {
        return 0;
    }
    
    return add(...numbers.slice(0, numbers.length - 1)) 
            + numbers[numbers.length - 1];
}

์ตœ์ข… ์ฝ”๋“œ

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

์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ reduce๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ์˜ ๋‹ค ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

5. ๋‹จ์œ„ ํ…Œ์ŠคํŠธ

์†Œ์Šค ์ฝ”๋“œ์˜ ํŠน์ • ๋ชจ๋“ˆ์ด ์˜๋„๋œ ๋Œ€๋กœ ์ •ํ™•ํžˆ ์ž‘๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆํ•˜๋Š” ์ ˆ์ฐจ ๋ชจ๋“  ํ•จ์ˆ˜์™€ ๋ฉ”์†Œ๋“œ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค(Test case)๋ฅผ ์ž‘์„ฑํ•˜๋Š” ์ ˆ์ฐจ

ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ
TDD FAQ
Jest๋ฅผ ์ด์šฉํ•œ ๊ฐ„๋‹จํ•œ TDD ์˜ˆ์ œ
Mocking
brute-force
Jest
Given-When-Then
SWC ๊ณต์‹๋ฌธ์„œ
๐Ÿ”— ์‹ค์Šต ๋งํฌ
์œ ๋‹› ํ…Œ์ŠคํŠธ