1. TDD
TDD๋
Jest
Describe - Context - It ํจํด
๋จ์ํ ์คํธ๋
๊ฐ์ ์ ๋ฆฌ
TDD (Test Driven Development)
ํ๋ก ํธ์๋์์์ TDD. Jest, RTL. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ. ํ ์คํธ๋ฅผ ์ถ๊ฐํ๊ณ , ์คํจ์ํค๊ณ , ํ ์คํธ๋ฅผ ํต๊ณผํ๋ ์ฝ๋๋ฅผ ์ง ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ณต์ ์ค์ธ๋ค.
๊ตฌํ๋ถ๋ณด๋ค ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๋ค. ์๋ํ๋ ํ ์คํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์์ฑํ๋ค. ๊ตฌํ๋ณด๋ค ์ธํฐํ์ด์ค์ ์คํ์ ๋จผ์ ์ ์ํจ์ผ๋ก์จ ๊ฐ๋ฐ์ ์งํํ๋ ๋ฐฉ์.
ํ ์คํธ ์ฝ๋๋ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํ๋ ๊ฒ.
// ์ด๊ฒ์ ์๋ฐํ ๋งํ๋ฉด ์๊ทธ๋์ฒ, ์ด๋ฐ ๊ฒ๋ค์ ๋ชจ์๋์ ๊ฒ์ด ์ธํฐํ์ด์ค๋ค.
add(x, y) -> number
TDD๋ผ๋ ๊ฒ์ ๊ณ์ํด์ ๋ฐ๋ณตํ๋ ๊ฒ. ์ผ์ ์์ค์ ๋ค๋ค๋ฅผ๋๊น์ง ๋ฐ๋ณต์ ํ๋ค. (๊ธฐ์ค ์ด์์ ์ฝ๋ ํ๋ฆฌํฐ๊ฐ ๋์ฌ๋ ๊น์ง) ์ผํธ๋ฐฑ์ Green์ ๋ง๋ค๊ธฐ ์ํด ์ฃ์ ์ ํํด๋ ๊ด์ฐฎ๋ค๊ณ ํ๋ค.
TDD Cycle
Red -> ์คํจํ๋ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑ. ์ธํฐํ์ด์ค์ ์คํ์ ์ง์คํ๋ค.
Green -> ์ฌ๋นจ๋ฆฌ ํ ์คํธ๋ฅผ ํต๊ณผ์ํจ๋ค. ์ฌ๋ฐ๋ฅธ ๋ฐฉ๋ฒ์ด ์๋์ด๋ ๊ด์ฐฎ๋ค. Stub์ ํ์ฉํ์ฌ ๊ฐ์ง๋ก ํด๋ ๋๋ค.
Refactor -> ๋ฆฌํฉํฐ๋ง์ ํตํด ์ฝ๋๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ง๋ ๋ค. TDD์์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ด์ง๋ง, ๊ฐ๊ณผ๋ ๋๊ฐ ๋ง๋ค.
์ฒ์๋ถํฐ ์๋ฒฝํ ํด๋ฒ์ ๋ด๋ ค๊ณ ํ๋ฉด ๊ต์ฅํ ์ด๋ ต๋ค. ํ ์คํธ๋ฅผ ๋น ๋ฅด๊ฒ ํต๊ณผ์ํค๊ณ ๋ฆฌํฉํ ๋ง์ ํ๋ค. ๋ฆฌํฉํ ๋ง์ ๋์์ ๋ฐ๊พธ์ง ์๊ณ ๋ด๋ถ ์ค๊ณ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ. 1๋ถ ์ดํ๋ก ํ ์ธ์ดํด์ ๋๋ฆด ์ ์์ผ๋ฉด ์ข๋ค, ๊ธธ์ด๋ 10๋ถ ์ด๋ด 1๋ฒ์์ 2๋ฒ์ผ๋ก ๊ฐ๋ ์๊ฐ์ด ์ค๋๊ฑธ๋ฆฌ๋ฉด 1๋ฒ์ ๋๋ฌด ๋ณต์กํ๊ฒ ์์ฑํ ๊ฒ์ผ์ ์๋ค. 3๋ฒ์ ์ํด ์๋๋ฅผ ๋๋ฌ๋ด๊ณ ์ค๋ณต์ ์ฐพ์ ์ ๊ฑฐํ๋ ์ฐ์ต์ ํด์ผํ๋ค. ์ด ๊ณผ์ ์ด ์ต์ํด์ผ TDD๋ฅผ ํ ์ ์๋ค. ๋๊ตฌ๋ฅผ ์ธ ์ค ์์์ผ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ผ๋ ๋๊ตฌ์ ๋ํด ์์๋ณผ ๊ฒ.
Jest
ํ์ด์ค๋ถ์์ ๋ง๋ ํ ์คํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธ๋งํ๋ค ์ถ์ ๊ฒ๋ค์ ๋ค ๋ค์ด์๊ณ ์ฌ์ฉ๋ฒ๋ ๋จ์ํ๋ค.
ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ํ ๋ ํฌ๊ฒ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
test ํจ์๋ก ๊ฐ๋ณ ํ ์คํธ๋ฅผ ๋์ดํ๋ ๋ฐฉ์
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