4. Testing Library

ν•™μŠ΅ ν‚€μ›Œλ“œ

  • Jest

  • Describe-Context-It νŒ¨ν„΄

  • React Testing Library

Jest

πŸš€ Jest κ³΅μ‹λ¬Έμ„œ

거의 λͺ¨λ“  것을 κ°–μΆ˜ ν…ŒμŠ€νŒ… 도ꡬ.

Mocha와 Chai처럼 RSpec의 describe-it을 μ§€μ›ν•˜κ³ (describe-context-it), expect둜 단언(assertion)ν•  수 μžˆλ‹€. Mocking도 λ‹€μ–‘ν•œ λ ˆλ²¨μ—μ„œ μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ‹€.

기본적인 ν…ŒμŠ€νŠΈ μ½”λ“œ

  • ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ λ³€ν™”λ₯Ό 계속 λ°˜μ˜ν•˜λ €λ©΄,

  • npx jest --watchAll

  • ν…ŒμŠ€νŠΈλ₯Ό λ¨Όμ € 짜고 κ΅¬ν˜„λΆ€λ₯Ό λ§Œλ“ λ‹€ -> TDD (Test Driven Development)

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

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

BDD μŠ€νƒ€μΌμ˜ ν…ŒμŠ€νŠΈ μ½”λ“œ

  • ν‘œν˜„λ ₯이 μ’‹μ•„μ§€κ³ , κ³ λ―Όν•  기회λ₯Ό μ œκ³΅ν•΄μ€€λ‹€.

  • 행동을 λ¬˜μ‚¬ν•œλ‹€.

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

context μ‚¬μš©ν•˜κΈ° (D-C-I Pattern)

const context = describe;

describe('add ν•¨μˆ˜λŠ”', () => {
  context('두 개의 μ–‘μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ', () => {
    it('두 숫자의 합을 λŒλ €μ€€λ‹€.', () => {
      expect(add(1, 2)).toBe(3);
    });
  });
});
  • npx jest --verbose

    • ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ„€λͺ…이 쑰금 더 μžμ„Έν•˜κ²Œ λ‚˜μ˜¨λ‹€

React Testing Library

UI ν…ŒμŠ€νŠΈμ— νŠΉν™”λœ 라이브러리. 거의 E2E Test(PlayWright, Cypress)처럼 μ“Έ 수 μžˆλ‹€.

단, β€œF/E ν…ŒμŠ€νŠΈ = only React μ»΄ν¬λ„ŒνŠΈ ν…ŒμŠ€νŠΈβ€κ°€ λ˜λŠ” 상황은 μ΅œλŒ€ν•œ ν”Όν•˜λŠ” 게 μ’‹λ‹€. λ³Έμ§ˆμ— μ§‘μ€‘ν•˜μ§€ λͺ»ν•˜κ³  λ„ˆλ¬΄ λ§Žμ€ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•  μœ„ν—˜μ΄ μžˆλ‹€. μœ μ§€λ³΄μˆ˜λ₯Ό 돕기 μœ„ν•΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ”λ°, ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό 잘λͺ» μž‘μ„±ν•˜λ©΄ 였히렀 μœ μ§€λ³΄μˆ˜λ₯Ό μ €ν•΄ν•  수 μžˆλ‹€.

μ°Έκ³  μ˜μƒ:

κ°„λ‹¨ν•œ ν…ŒμŠ€νŠΈ μ½”λ“œ

test('Greeting', () => {
  render(<Greeting name="world" />);

  screen.getByText('Hello, world!');

  screen.getByText(/Hello/);

  expect(sceen.queryByText(/Hi/)).not.toBeInTheDocument();
});

코딩을 ν•˜κΈ° 전에 ν•΄μ•Ό ν•  일

  • μš”κ΅¬μ‚¬ν•­μ„ λͺ…ν™•νžˆ ν•˜λŠ” 것

    • λ”ν•˜κΈ°λ₯Ό λ§Œλ“€ 것인지, κ³±ν•˜κΈ°λ₯Ό λ§Œλ“€ 것인지

    • inputμœΌλ‘œλŠ” μ‹œκ°„μ„ 받을 것인지, 뢄을 받을 것인지

  • λͺ…μ„Έλ₯Ό λͺ…ν™•ν•˜κ²Œ ν•˜κΈ°

    • 예제λ₯Ό λ§Œλ“ λ‹€.

    • λ²„κ·Έλž€ λͺ…세에 μ νžŒλŒ€λ‘œ μž‘λ™ν•˜μ§€ μ•ŠλŠ” 것, λͺ…세에 μ •μ˜λ˜μ§€ μ•Šμ€ 것도 버그라고 λ³Ό 수 μžˆλ‹€.

      • 버그λ₯Ό 작기 제일 쒋은 μ‹œμ μ€ 코딩을 ν•˜κΈ° μ „, λͺ…μ„Έλ₯Ό 보고 λΉ μ§„ 뢀뢄이 μžˆλŠ”μ§€ 확인

  • λͺ…μ„Έλ₯Ό 따라 섀계λ₯Ό ν•œλ‹€.

    • μ•„μ£Ό κ°„λ‹¨νžˆ μ—¬λŸ¬ λ‹¨κ³„λ‘œ μͺΌκ°œκΈ°

    • 코딩을 ν•˜λ©΄μ„œ 배우게 λœλ‹€. 섀계가 λ§žμ•˜λŠ”μ§€ ν‹€λ ΈλŠ”μ§€.

    • 섀계λ₯Ό κ°œμ„ ν•˜κ²Œ λœλ‹€, κ°œμ„ λœ 섀계에 따라 λ‹€μ‹œ 코딩을 ν•œλ‹€.

μ–΄λ–€ 문제λ₯Ό ν•΄κ²°ν•˜λ €κ³  ν–ˆμ—ˆλŠ”μ§€ μš”κ΅¬μ‚¬ν•­μ„ λͺ…ν™•ν•˜κ²Œ ν•˜λŠ” 것이 κ°€μž₯ μ€‘μš”ν•˜λ‹€. μš”κ΅¬μ‚¬ν•­ λͺ…μ„Έλ₯Ό ν…ŒμŠ€νŠΈ μ½”λ“œλ‘œ 미리 μž‘μ„±ν•΄ λ†“μœΌλ©΄ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό ν†΅κ³Όμ‹œν‚€κΈ°λ§Œ ν•˜λ©΄ λœλ‹€. 그리고 κ°œμ„ ν•œλ‹€. 무엇을 λ§Œλ“€λ €κ³  ν•˜λŠ”μ§€λ₯Ό μ•Œκ³  그것에 ν•„μš”ν•œ 것을 κ²°μ •ν•˜κ³  이루어 지도둝 λ§Œλ“€κΈ°. λ§Œλ“œλŠ” κ³Όμ •μ—μ„œ μ—¬λŸ¬κ°€μ§€ ν”Όλ“œλ°±μ„ μ–»λŠ”λ‹€. μ—¬κΈ°μ„œ λ°°μš°λŠ” 것이닀. 무엇이 잘λͺ»λ˜μ—ˆλŠ”μ§€ μ°Ύμ•„μ„œ 고치면 λœλ‹€. λŠμž„μ—†μ΄ λ§Œλ“œλŠ” κ³Όμ •μ†μ—μ„œ 배우면 λœλ‹€.


λ‚΄κ°€ ν•œ 일 증λͺ…ν•˜κΈ°

λ‚΄κ°€ ν•  일을 남이 ν•˜κ²Œ λ§Œλ“€μ§€ 말자. ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜μž. νŒ€λ§ˆλ‹€ μ»€λ²„λ¦¬μ§€μ˜ 기쀀은 λ‹€λ₯΄μ§€λ§Œ ν…ŒμŠ€νŠΈ 컀버리지 100%λ₯Ό μœ μ§€ν•˜λ©΄ 정말 κ°•λ ₯ν•˜λ‹€. λ‚΄ 일은 λ‚΄κ°€ μ™„λ£Œν•˜μž.


Ginkgo - Go μ–Έμ–΄ 개발자λ₯Ό μœ„ν•œ BDD ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬

Ginkgo: Goμ–Έμ–΄μš© BDD ν…ŒμŠ€νŒ… ν”„λ ˆμž„μ›Œν¬ BDDλŠ” TDD의 ν•œ κ°ˆλž˜λ‹€. TDDλŠ” Test First μΌ„νŠΈλ°±μ€ μŠ€ν… 3개둜 μ„€λͺ…ν•œλ‹€ (Red, Green, Refactor) μ‹€νŒ¨ν•˜λŠ” ν…ŒμŠ€νŠΈλ₯Ό λ§Œλ“œλŠ” 것을 μ–΄λ €μ›Œν•œλ‹€, 뭘 μž‘μ„±ν•΄μ•Ό ν• μ§€ λͺ¨λ₯΄κ² λ‹€. λ²„κ·Έλž€ 무엇인가?

1945λ…„ 9μ›” 9일 그레이슀 호퍼(미ꡭ의 컴퓨터 κ³Όν•™μžμ΄μž λ―Έκ΅­ 역사상 졜초의 μ—¬μ„± 해독 μ œλ…)κ°€ ν•˜λ²„λ“œλŒ€ν•™κ΅μ—μ„œ Mark2κ°€ μ˜€μž‘λ™ν•˜λŠ” 것을 발견, 컴퓨터 νšŒλ‘œμ— λ‚˜λ°©μ΄ μžˆμ—ˆμŒ

μ‚¬λžŒλ“€μ€ λˆ„κ΅¬λ‚˜ μ‹€μˆ˜λ₯Ό ν•œλ‹€, μ–΄λ–»κ²Œ ν•˜λ©΄ 버그λ₯Ό 쀄일 수 μžˆμ„κΉŒ? κΈ°κ³„μ–΄λ‘œ ν”„λ‘œκ·Έλž˜λ°μ„ ν•΄μ„œ κ·Έλ ‡λ‹€. μ‚¬λžŒμ˜ 말처럼 κ°œλ°œμ„ ν•˜λ©΄ μ–΄λ–¨κΉŒ. μ‚¬λžŒμ˜ μ–Έμ–΄μ²˜λŸΌ λ˜μ–΄μžˆλŠ” 것을 κΈ°κ³„μ–΄λ‘œ λ°”κΎΈλŠ” 것, 컴파일러 κ·Έλž˜μ„œ λ‚˜μ˜¨ 것이 μ½”λ³Ό(COBOL)이닀. μ½”λ³Όμ˜ μ–΄λ¨Έλ‹ˆ.

μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ 버그λ₯Ό μ„€λͺ…ν•˜λŠ” 말쀑에 ν•˜λ‚˜λ₯Ό 꼽자면 κΈ°λŒ€ν•˜μ§€ μ•Šμ€ 것. κ²Œμž„μ—μ„œ 점프λ₯Ό λˆŒλ €λŠ”λ° 캐릭터가 μžμ‚΄ν•œλ‹€λ©΄?

μŠ€νŽ™, 사양은 λͺ…νšνžˆ ν•˜λŠ”κ²Œ μ†Œν”„νŠΈμ›¨μ–΄μ—μ„œ 맀우 μ€‘μš”ν•˜λ‹€. μ†Œν”„νŠΈμ›¨μ–΄κ°€ μŠ€νŽ™, 사양에 맞게 λ™μž‘ν•˜λŠ”μ§€ ν™•μΈν•˜λŠ” 것이 ν…ŒμŠ€νŠΈν•˜λŠ” 것.

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜λŠ” 법은 우리 사양에 λ§žλŠ”μ§€ λ§žμ§€ μ•ŠλŠ”μ§€ μž‘μ„±ν•˜λŠ” 것.

  • 점프 ν‚€λ₯Ό λˆ„λ₯΄λ©΄ 점프λ₯Ό ν•΄μ•Ό ν•œλ‹€.

κΈ°λŠ₯ λͺ©λ‘μ„ λ§Œλ“€λ©΄μ„œ 이것을 κ΅¬ν˜„ν•˜λ©΄ λœλ‹€. κΈ°λŠ₯μ΄λž€ μ†Œν”„νŠΈμ›¨μ–΄κ°€ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠλƒ, ν–‰μœ„

Behavior First, ν–‰μœ„λ₯Ό λ¨Όμ € μž‘μ„±ν•˜λ©΄ λœλ‹€. κ³„μ‚°κΈ°μ—μ„œ 1 λˆ„λ₯΄κ³  + λˆ„λ₯΄κ³  2 λˆ„λ₯΄κ³  = λˆ„λ₯΄λ©΄ 3이 λ‚˜μ˜¨λ‹€, 사양을 미리 μ •μ˜ν•΄ λ†“λŠ”λ‹€. 사싀은 TDDλž‘ κ°™λ‹€, TDD라고 ν•˜λ©΄ λŒ€λΆ€λΆ„μ˜ μ‚¬λžŒλ“€μ€ 잘 λͺ¨λ₯Έλ‹€. ν‘œν˜„μ„ λ°”κΏ”μ„œ 이해λ₯Ό λ•λŠ”λ‹€.

Describe 'JUMP'

  • It should push the hero off the floor

  • It should put the hero in the air for 10 seconds

μ ν”„λŠ” λ‹¨μˆœν•œλ°, μ–΄λ–€ κΈ°λŠ₯은 상황에 따라 ꡉμž₯히 λ‹€λ₯΄κ²Œ μž‘λ™ν•  수 μžˆλ‹€.

Describe 'ATTACK'

  • Context 'without a weapon' It should do 1 point of damage

  • Context 'with a sword' it should do 10 points of damage

D-C-I νŒ¨ν„΄μ„ μ΄μš©ν•˜μ—¬ ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό μž‘μ„±ν•˜κΈ° ν…ŒμŠ€νŠΈ μ½”λ“œμ˜ μ˜λ„κ°€ λ”μš± λͺ…ν™•νžˆ λ“œλŸ¬λ‚œλ‹€.

describe 1κ°œμ— μ—¬λŸ¬κ°œμ˜ context, κ·Έ μ•ˆμ˜ κ²°κ³Όλ₯Ό ν‘œν˜„ν•˜λŠ” it


TDD on Spring ~ λ΄„μ—λŠ” TDD ~

TDD, λ²ˆμ—­ν•˜λ©΄ ν…ŒμŠ€νŠΈ 주도 개발 μΌ„νŠΈλ°± - TDD by Example, TDD의 μ„ κ΅¬μžλ‹€. OOPμ—μ„œμ˜ pattern을 μ œμ‹œν–ˆλ‹€.

μ‹€μ œλ‘œ κ°œλ°œμ„ ν•˜λ©΄μ„œ μ–΄λ–€ λ¬Έμ œλ“€μ΄ μžˆμ„ λ•Œ ν•΄κ²° 방법을 λͺ¨μ•„놓은 것이 XP(읡슀트림 ν”„λ‘œκ·Έλž˜λ°) λͺ‡κ°€μ§€ Practices듀이 λ‚˜μ˜¨λ‹€.

Test First Programming, μ–΄λ–»κ²Œ ν•˜λŠ”κ°€? 일단 μ‹€νŒ¨λ₯Ό μ‹œν‚¨λ‹€. λ‹€μŒμ—” 해결을 ν•œλ‹€. 그리고 κ°œμ„ μ„ ν•œλ‹€.

κ°œλ°œμžλŠ” Problem Solving, 문제λ₯Ό ν•΄κ²°ν•œλ‹€. μΌμ •ν•œ Goal이 μžˆλ‹€.

  • μ§„μ§œλ‘œ ν•΄λƒˆλ‚˜?

  • μ–΄λ–»κ²Œ μ•Œ 수 μžˆλ‚˜?

μ–΄λ–»κ²Œ ν•˜λ©΄ μ§„μ§œλ‘œ ν–ˆλŠ”μ§€ μ•Œ 수 μžˆλ‚˜?

  • 증거가 μžˆμ–΄μ•Ό ν•œλ‹€.

    • μ§„μ§œλ‘œ λ‹€ ν—€μ–΄μš”?

    • 문제 μ—†λŠ”κ±°μ£ ?

ν•˜λ£¨λ₯Ό μž‘μ—…ν•΄μ„œ λ§Œλ“€μ–΄λ‚Έ μ½”λ“œμ§€λ§Œ, λ¬Έμ œκ°€ 있으면 100일 λ™μ•ˆ μ‚½μ§ˆμ„ ν•˜κ²Œ λœλ‹€. 이틀 μž‘μ—…μ„ ν•˜λ”λΌλ„ λ‚˜μ€‘μ— μ‚½μ§ˆμ„ ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ 훨씬 λ‚«μ§€ μ•Šμ„κΉŒ?

κ°œλ°œμ„ μ§„ν–‰ν•˜κ³  μ„œλΉ„μŠ€λ₯Ό λŸ°μΉ­ν•˜κΈ° 전에 ν™•μΈν•΄λ³΄λ‹ˆ 버그가 λ„ˆλ¬΄ λ§Žλ‹€. 차라리 λ‹€μ‹œ λ§Œλ“œλŠ”κ²Œ 더 λΉ λ₯Ό 것 κ°™μ•„ λ‹€μ‹œ λ§Œλ“ μ λ„ μžˆλ‹€. 이런 것을 κΈ°μˆ λΆ€μ±„λΌκ³  ν•œλ‹€.

λͺ©ν‘œλ₯Ό μ–΄λ–»κ²Œ μ„Έμš°λ©΄ μ’‹λ‚˜? SMARTν•˜κ²Œ μ„ΈμšΈ 것.

  1. Specific (ꡬ체적)

  2. Measurable (μΈ‘μ • κ°€λŠ₯)

  3. Attainable (달성 κ°€λŠ₯)

  4. Realistic (ν˜„μ‹€μ )

  5. Timely (κΈ°κ°„)

λͺ©ν‘œλ₯Ό μ“°κΈ°, 이 λͺ©ν‘œλ“€μ„ 잘게 λ‚˜λˆ μ„œ λͺ©λ‘μœΌλ‘œ λ§Œλ“€κΈ°. 그리고 ν•˜λ‚˜μ”© μ‹€ν–‰ν•˜κΈ°(CHECK LIST)

λͺ©ν‘œλž€, μ§€κΈˆμ€ μ•ˆλ˜λŠ” 것 -> μ‹€νŒ¨λ₯Ό μ˜λ―Έν•œλ‹€. κΈ°λ₯Όμ“°κ³  μ–΄λ–»κ²Œ ν•΄μ„œλ“  되게 ν•΄μ•Ό ν•œλ‹€. 일단 되게 ν•˜λΌ.

μ•„λ¬΄λ ‡κ²Œκ°€ μ•„λ‹ˆλΌ μ œλŒ€λ‘œ μž‘λ™ν•˜λ„λ‘ ν•œλ‹€. 방법이 μ•„λ‹ˆλΌ μ˜¬λ°”λ₯Έ κ²°κ³Όκ°€ μ€‘μš”ν•˜λ‹€. 해결이 된 λ‹€μŒμ—λŠ” κ·ΈλŒ€λ‘œ κΉ”λ”ν•˜κ²Œ 고쳐라. μž‘λ™ν•˜κΈ° μœ„ν•΄ λΉ„μ—΄ν•œ 방법을 썼기 λ•Œλ¬Έμ—

κ°œμ„ μ„ ν•  λ•Œ μ€‘μš”ν•œ 것은 버그λ₯Ό λ§Œλ“€μ–΄ λ‚΄λ©΄ μ•ˆλœλ‹€. κ·ΈλŒ€λ‘œ κ°œμ„ μ„ ν•˜λŠ” 것 -> 이전에 λ§Œλ“€μ—ˆλ˜ ν…ŒμŠ€νŠΈλ₯Ό ν†΅κ³Όν•˜λŠ” 것 μ–Έμ œλ‚˜ 항상 μ œλŒ€λ‘œ μž‘λ™ν•˜λ„λ‘ ν•˜λŠ”κ²ƒμ΄ 핡심이 λœλ‹€.

ν…ŒμŠ€νŠΈ μ½”λ“œλ₯Ό λ¨Όμ € μ§œμ•Ό λ¬Έμ œκ°€ μ•ˆμƒκΈ΄λ‹€. 기술 뢀채에 λŒ€ν•΄μ„œλ„ λŒ€μ‘ν•  수 μžˆλ‹€.

~ 08:24

Last updated