ποΈ λ¨μ ν μ€νΈ
μννΈμ¨μ΄μ νΉμ λͺ¨λμ΄λ κΈ°λ₯μ΄ μ¬λ°λ₯΄κ² μλνλμ§λ₯Ό κ²μ¦νλ ν μ€νΈλ‘, μ½λμ μΌλΆλ₯Ό λ 립μ μΌλ‘ ν μ€νΈνλ κ²
νλ‘ νΈμλ ν μ€νΈ μ’ λ₯
- λ¨μ ν μ€νΈ (Unit Test) : μ½λμ μμ λ¨μλ κ°λ³ ν¨μλ₯Ό λ 립μ μΌλ‘ ν μ€νΈνλ©°, λΉ λ₯΄κ³ ν¨μ¨μ μ΄λ€.
- μ€λ μ· ν μ€νΈ (Snapshot Test) : μ£Όλ‘ UIμ λ³κ²½ μ¬λΆλ₯Ό νμΈνμ¬, μμλ UI μνμ νμ¬ UI μνκ° μΌμΉνλμ§ λΉκ΅νλ€.
- μ’ λ¨ κ°(e2e) ν μ€νΈ (End-to-End Test) : μ¬μ©μ μ μ₯μμ μ 체 μ ν리μΌμ΄μ μ νλ¦μ ν μ€νΈνμ¬ μμ€ν μ΄ ν΅ν©λ μνμμ μλνλμ§ νμΈνλ€.
λ¨μ ν μ€νΈμ μ₯μ : λ²κ·Έλ₯Ό μ΄κΈ°μ μ‘μλ΄κ³ , μ½λ λ³κ²½ μ μμνμ§ λͺ»ν μ€λ₯λ₯Ό λ°©μ§, μ μ§ λ³΄μκ° μ©μ΄νλ©°, μ½λμ μμ μ±μ λμ¬μ€λ€.
π₯ F.I.R.S.T
λ¨μ ν μ€νΈ μ½λ μμ± μ μ§μΌμΌ ν μμΉ
- Fast : ν μ€νΈλ λΉ λ₯΄κ² μνν΄μΌν¨. λλ¦° ν μ€νΈλ κ°λ° νλ¦μ λ°©ν΄νκ³ , μ€νμ΄ κΊΌλ €μ§ μ μμ΅λλ€.
- Isolated : λ¨μ ν μ€νΈλ μλ‘ λ 립μ μΌλ‘ μ€νλμ΄μΌνλ€. μλ‘ μμ‘΄νμ§ μλλ‘ μ€μ νλ€.
- Repeatable : νκ²½μ μν₯λ°μ§μμ μ€νν λλ§λ€ μΌκ΄λ κ²°κ³Όλ₯Ό λ΄μΌνλ€.
- Self-validating : ν μ€νΈλ κ²°κ³Όκ° ‘μ±κ³΅’ λλ ‘μ€ν¨’λ‘ μλμΌλ‘ νκ°λλλ‘ μμ±ν΄μΌνλ€.
- Timely/Thorough : ν μ€νΈλ₯Ό 미리 μμ±νμ¬ μ½λμ κΈ°λ₯κ³Ό λμμ κ²μ¦νλ λ°©μμ μ¬μ©ν΄μΌνλ€. => TDD(ꡬννκ³ μ νλ κΈ°λ₯μ 미리 ν μ€νΈλ‘ μμ±)
π₯ DAMP
Descriptive And Meaningful Phrases : μ½κΈ° μ½κ³ μ§κ΄μ μΈ μ½λ μμ±
- μλ―Έ μκ³ μμ μ μΈ νν μ¬μ©: μ½λκ° λ¨μν μλνλ κ²μ λμ΄, μλλ₯Ό λͺ ννκ² μ λ¬ν μ μμ΄μΌνλ€.
- DRY(Don't Repeat Yourself) μμΉκ³Όμ μ°¨μ΄: ν μ€νΈ μ½λμμλ μ€λ³΅μ μ΅μννκΈ°λ³΄λ€ μ½λκ° μ€λͺ μ μ΄κ³ μ§κ΄μ μΈ κ²μ΄ λ μ€μνλ€.
μμ
μ€λ³΅μ μ κ±°ν κΉλν μ½λκ° μλ, κ°λ μ±κ³Ό λͺ νμ±μ λμΈ μ½λκ° μ₯κΈ°μ μΌλ‘ μ μ§ λ³΄μμ μ΄ν΄μ μ 리ν¨.
μλ μ½λλ μ΄λ€ μ»΄ν¬λνΈμμ νΉμ λ²νΌμ ν΄λ¦νμ λ νΉμ ν¨μκ° μ¬λ°λ₯Έ 맀κ°λ³μλ‘ νΈμΆλλμ§λ₯Ό νμΈνλ ν μ€νΈ μ½λμ΄λ€.
// 1λ²
it('μ€λͺ
μ μλ΅νλ©΄ μ΄ν΄κ° λμλμ?', async () => {
const user = userEvent.setup();
render(<Component {...preDefinedProps} />);
const buttonElement = screen.getByRole('button', { name: 'λ²νΌμ
λλ€' });
await user.click(buttonElement);
expect(doSomething).toBeCalledWith(1234);
});
// 2λ²
it('μ€λͺ
μ΄ μμ΄λ λμΆ© λλμ μ€μμ£ ?', async () => {
const something = 1234;
const doSomething = vi.fn();
const user = userEvent.setup();
render(<Component {...preDefinedProps} something={something} doSomething={doSomething} />);
const buttonElement = screen.getByRole('button', { name: 'λ²νΌμ
λλ€' });
await user.click(buttonElement);
expect(doSomething).toBeCalledWith(1234);
});
π₯ Given-When-Then
Given-When-Then ꡬ쑰λ BDDμ μ€μ¬μΈ μ¬μ©μ νμλ₯Ό κΈ°λ°μΌλ‘ ν ν μ€νΈ μλ리μ€λ₯Ό μ μν μ μλλ‘ λμμ€λ€.
- Given: ν μ€νΈλ₯Ό νκΈ° μν΄ μΈν νλ μ£Όμ΄μ§ νκ²½
- When: ν μ€νΈλ₯Ό νκΈ° μν 쑰건μΌλ‘ νλ‘ νΈμλμμ μ¬μ©μμμ μνΈμμ©μΈ κ²½μ°λ λ§μ
- Then: μμ κ²°κ³Όλ₯Ό λνλ΄λ©° μλλλ‘ λμνλμ§ κ²μ¦ λ° νμΈν μ μμ
Given-When-Thenμ μ₯μ
- ν μ€νΈ μ½λκ° λͺ ννκ³ μ½κΈ° μ¬μμ Έ, νμ μ ν μ€νΈ μλλ₯Ό μ½κ² 곡μ ν μ μμ΅λλ€.
- λ‘μ§μ νλ¦μ λ°λΌ μμ°μ€λ½κ² μλ리μ€λ₯Ό μ€μ νκ³ , 쑰건과 κ²°κ³Όλ₯Ό νμΈν μ μμ΅λλ€.
it('λ²νΌμ 1ν ν΄λ¦νλ©΄ 1λ² ν΄λ¦νλ€λ λ¬Έκ΅¬κ° λ
ΈμΆλλ€', async () => {
const user = userEvent.setup();
render(<Component />);
const buttonElement = screen.getByRole('button', { name: 'μ¬κΈ°λ₯Ό λλ¬λ³΄μΈμ' });
await user.click(buttonElement);
expect(screen.getByText('λ²νΌμ 1λ² ν΄λ¦νμ΅λλ€.')).toBeInTheDocument();
});
π₯ κ°λ³ ν μ€νΈ μΌμ΄μ€μ λͺ©μ μ λͺ νν
it('λ²νΌ ν΄λ¦ μ μ’μνλ κ³ΌμΌμ΄ λ°λλλ‘ λ°λλ€', async () => {
const user = userEvent.setup();
render(<WordWithButton />);
await user.click(screen.getByRole('button', { name: 'μ’μνλ κ³ΌμΌ λ°κΎΈκΈ°' }));
expect(screen.getByText(/λ°λλ/i)).toBeInTheDocument();
});
μλνμ§ μμ κ³³μμ λ°λλκ° μΆλ ₯λμμ μ μλ€.
λμμ λν κ²°κ³Όλ₯Ό κ²μ¦νλλ° λ°λλλ μΆλ ₯λμμ§λ§ μ€μ μνλ³νκ° λνλ¬λμ§ νμΈν μ μλ€.
it('λ²νΌ ν΄λ¦ μ heading μμμ λ¬Έκ΅¬κ° λ°λλλ₯Ό μ’μνλ€λ λ΄μ©μΌλ‘ λ³κ²½λλ€', async () => {
const user = userEvent.setup();
render(<WordWithButton />);
await user.click(screen.getByRole('button', { name: 'μ’μνλ κ³ΌμΌ λ°κΎΈκΈ°' }));
expect(screen.getByRole('heading', { name: 'λλ λ°λλλ₯Ό μ’μνλ€!' })).toBeInTheDocument();
});
heading μμμ λνλλμ§λ₯Ό κ²μ¦νκ³ μμ΄ λͺ©μ μ΄ λͺ ννλ€.
μμ±νλ ν μ€νΈ μΌμ΄μ€κ° μ ννκ² μ΄λ€ κ²μ κ²μ¦ν κ²μΈμ§ ν μ€νΈ μΌμ΄μ€μ λͺ©μ μ μκ°νλ©° μ½λμ expectλ₯Ό μμ±ν΄μΌνλ€.
'ποΈ μ€ν°λ νλ > π λ©΄μ μ μν CS μ 곡μ§μ λ ΈνΈ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[λ§λ¬΄λ¦¬] ν΄λ¦°μ½λμ λμμ½λ (0) | 2024.10.17 |
---|---|
[λ§λ¬΄λ¦¬] ν΄λ¦°μ½λ (3) | 2024.10.16 |
[λ§λ¬΄λ¦¬] μΉ μνκ΄λ¦¬μ μΈμ¦ (0) | 2024.10.10 |
[λ§λ¬΄λ¦¬] μΉ ν΅μ κΈ°μ΄ (1) | 2024.10.09 |
[μ΄μ체μ ] νλ‘μΈμ€μ μ€λ λ (0) | 2024.09.18 |