OKKYCON2018 The Real TDD
ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ก ๊ฐ๋ฐํ๊ธฐ - ์ ์ง์ฑ๋
ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋?
- ๊ฐ์ ์
๋ ฅ์ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ ์ฝ๋ -
Deterministic
- ํญ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ง ์๋ ์ฝ๋๋?
- ์๊ฐ์ ์ํด ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ๋๋ ํจ์.
- ์ค๋ ๋ ์ง๋ฅผ ๊ตฌํ๋ ํจ์
- DB์ ์ํด ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ๋๋ ํจ์.
- ์ ์ฒด ํ์์ ์๋ฅผ ๊ตฌํ๋ ํจ์
- ์๊ฐ์ ์ํด ๊ฒฐ๊ณผ๊ฐ ๊ฒฐ์ ๋๋ ํจ์.
- ํญ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ์ง ์๋ ์ฝ๋๋?
- ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ฝ๋ -
No side effect
- ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋?
Console.WriteLine(result);
- ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ ํจ์๋?
ํ ์คํธ ์๋๋ฆฌ์ค๋ ์ด๋ป๊ฒ ์์ฑํ ๊น?
- ์ ํจ์ฑ ๊ฒ์ฌ
- Email : @๊ฐ ํฌํจ๋์๋๊ฐ?
- ์ด๋ฆ : ์ซ์๊ฐ ํฌํจ๋์๋๊ฐ?
- ConferenceId : ์์์ธ๊ฐ?
- ์ด๋ฏธ ๋ฑ๋ก๋ ์ข์ ์ DB์์ ์ฝ์ด์ค๊ธฐ
- ์์ฒญํ ์ข์ ์๊ฐ ํ๋ณด ๊ฐ๋ฅํ์ง ํ๋จํ๊ธฐ
- ์์ฌ ์ข์์(์ ์ฒด ์ข์ ์ - ๋ฑ๋ก๋ ์ข์ ์) >= ์์ฒญํ ์ข์์
- ํ๊บผ๋ฒ์ 10์ข์์ ์ด๊ณผํด์ ๋ฑ๋กํ ์ ์๋ค.
- ๋ฑ๋ก ์ ๋ณด ์ ์ฅ
- HTTP ๊ฒฐ๊ณผ ๋ฐํ
์ ํ ์คํธ ์๋๋ฆฌ์ค ์ค ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๋ถ๋ถ ์ด๋ ๊ณณ์ผ๊น?
์ด๋ฏธ ๋ฑ๋ก๋ ์ข์ ์ DB์์ ์ฝ์ด์ค๊ธฐ
- DB๋ ํญ์ ๊ฐ์ ์ ๋ ฅ(Query)์ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋๋ค.
๋ฑ๋ก ์ ๋ณด ์ ์ฅ
์ธ๋ถ ์ํ์ ์์กด์ ์ธ ์ฝ๋.
์ด๋ป๊ฒ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊น?
- ํ
์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋์ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์.
- ์ธ๋ถ ์ํ์ ์์กด์ ์ธ ๋ถ๋ถ์ด ์ด๋์ธ์ง ํ์ธํ๊ณ ๋ถ๋ฆฌํ์.
- DB๋ฅผ ์กฐํํ๋ ๋ถ๋ถ
- ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ๋ฃ๊ณ ํ ์คํธ.
- ์ธ๋ถ ์ํ์ ์์กด์ ์ธ ๋ถ๋ถ์ด ์ด๋์ธ์ง ํ์ธํ๊ณ ๋ถ๋ฆฌํ์.
- ์ธ๋ถ ์ํ์ ์์กด ์ ์ด์ง ์๋ ์ฝ๋
- ์ฆ ํ ์คํธ๋ฅผ ํ๊ธฐ ์ฌ์ด ์ฝ๋๋ ๋๋ฉ์ธ ๊ฐ์ฒด์
ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋์ ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๊ฐ ๋ง๋๋ ๋ถ๋ถ์ ์ต๋ํ end-point(controller) ์ชฝ์ผ๋ก ์์ฑํ์ฌ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ๋ค.
TDD ๋ง๋ณด๊ธฐ
์ด๋ฉ์ผ์_๊ณจ๋ฑ
์ด๊ฐ_์์ผ๋ฉด_์ ํจํ์ง_์์_ํ์์
๋๋ค(){
//Arrange
var sut = new ConferenceRegistration{Email = "nesoy.gmail.com"};
//Act
string actual = sut.validate();
//Assert
Assert.Notnull(actual);
}
TDD๋ก Code๋ฅผ ์์ฑํ ๋ ์ฃผ์ํ ์ .
- ํ
์คํธ๋ฅผ ๋ง์กฑํ๋ ๋งํผ๋ง ์ฝ๋๋ฅผ ์์ฑํ์.
- ๊ทธ ์ด์ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ํ ์คํธ๋ก ์ปค๋ฒํ ์ ์๋ค.
- ์ฆ ์ฝ๋์ ๋ณ๊ฒฝ๋๋ ๋ถ๋ถ์ ๋์น ์ ์๋ค.
์๊ฒ ์๊ฒ
๋ณ๊ฒฝ๋๋ ๋ถ๋ถ์ ์ง์คํ๊ณ Coverํ์.
๋ ๋ถ๋ฅ ์ฝ๋(ํ ์คํธ ํ๊ธฐ ์ฌ์ด ์ฝ๋, ํ ์คํธ ํ๊ธฐ ์ด๋ ค์ด ์ฝ๋)๊ฐ ๋ง๋๋ Edge์์ ์ด๋ป๊ฒ ํ ์คํธํ๋๊ฐ?
- ์๋ ํ
์คํธ
- curl, Postman
- ์๋ ํ
์คํธ
- DB์ ํ ์คํธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ
- POST๋ก API๋ฅผ ํธ์ถํฉ๋๋ค.
- ๊ฒฐ๊ณผ ๊ฐ์ ๊ฒ์ฆํ๋ ๊ณผ์ ์ ์งํํฉ๋๋ค.
Mock ์ฌ์ฉ ํ๋ค๋ ๊ฑด?
- ์์ฑ๋ ์ฝ๋์ฌ์ฉ์ ๊ฐ์ ํ ์ ์๋ค.
- Mock์ ํตํด ์ด์์(Seam) ๋์
- ํ์ ๊ฒ์ฆ(mock)
- ์ด๋ค ๋ฉ์๋๊ฐ ํธ์ถ๋์๋๊ฐ?
- ์ถ์ํ๊ฐ ํ์ํจ. โ
๋ถํ์ํ ์ถ์ํ๊ฐ ํ์
- Outside-in
- ์ํ ๊ฒ์ฆ(value)
- ๊ฒฐ๊ณผ ๊ฐ์ด ๋ฌด์์ธ๊ฐ?
- ๋ถํ์ํ ์ถ์ํ ํ์์์.
- ๊ตฌํ๋ ์ฝ๋์๋ง ์์กดํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๋ฐ์ดํฐ๊ฐ ํ์.
- Inside-out
Mock์ ๋จ์ ์ ๋ฌด์์ผ๊น?
- Mock์ด ์ฌ์ฉํ๊ธฐ ์ฌ์ฐ๋ ๋จ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ํฌ๋ค.
- ๋๋ถ๋ถ Mock ์ฌ์ฉ ์์ ๋ ๊ฐ๋จํ๋ค. ๊ทธ๋์ ์ฅ์ ์ด ํฌ๊ฒ ๋ณด์ธ๋ค.
- ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํ๋ฉด ํ๊บผ๋ฒ์ ๋ง์ ์์ Mock์ ๋ค๋ฃจ๋ฉด์ ๊ณค๋์ ๊ฒช๋๋ค.
- ์ ๋น ์์ Mock ์ฌ์ฉ์ ๋ํ ๋ต์ ์ฐพ๊ธฐ ์ด๋ ต๋ค.
- ๋๋ก๋ ์ํ ๊ฒ์ฆ์ผ๋ก ๋์๊ฐ๋ณด์.
Mock์ ๋์ ํ์ฌ ์ํ ๊ฒ์ฆ๋ฅผ ํ๋ค๋ ๊ฒ์?
- TDD๋ฅผ ํตํ ์ฌ์ ์ด ์๋๋ผ ์ฌํ ํ ์คํธ๋ฅผ ํ์.
- ๋ํดํ ์ฝ๋๊ฐ ์๋๋ค.
- ๊ตฌํ๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ตณ์ด ์ด๋ ค์ด ๊ธธ์ ํํ ์ด์ ๊ฐ ์๋ค.
- ์๋ฒฝ์ ์ถ๊ตฌํ๋ฉด์ Mock์ ์ฌ์ฉํ๋ ๋น์ฉ์ ๋ค์ผ ํ์๊ฐ ์๋๊ฐ?
์ ๋ฆฌํ์๋ฉด?
- ํ
์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋?
- ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ ๋ฐํ
- ์ธ๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ์ง ์๋ ์ฝ๋
- ํ
์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ก ๊ฐ๋ฐํ๊ธฐ
- ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋์ ์ด๋ ค์ด ์ฝ๋ ๋ถ๋ฆฌ
- ๋ ๋ถ๋ฅ์ ์ฝ๋๋ ์ต๋ํ ๊ฐ์ฅ ์๋ฆฌ์ ์์น(์์ธ: ๋ก๊น , ํผ์ฌ๋)
- ํ
์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฅผ ์ต๋ํ ๊ฐ์ฅ์๋ฆฌ์์ ๋ง๋๊ฒ ๋ง๋ค์.
- endpoint
Reference
ํ๊ธฐ
- ๊ณผ๋ํ Mock์ ์ ๋ต์ด ์๋๋ฏ ํ๋ค.
- Mock๊ณผ ์ํ ๊ฒ์ฆ ์ ์ ํ ์ฌ์ฉํ๋ ๊ฒ์ด ์ค์ํ Point๋ผ๊ณ ์๊ฐ๋๋ค.
์์์ ์ธ ์ฐ์ต์ผ๋ก TDD, ๋ฆฌํฉํ ๋ง ์ฐ์ตํ๊ธฐ - ๋ฐ์ฌ์ฑ๋
- TDD < Refactoring
์์์ ์ธ ์ฐ์ต์ด๋?
- ๋ฌด์กฐ๊ฑด ์ฐ์ต์ ๋ง์ด ํ๋ค๊ณ ์ํ ์ ์์๊น?
- ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋์ ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๋ณด๋ ๋
- ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ก ์ค๊ณํ๋ ๊ฐ(sense)
- ๋ชฉ์ ์์ ์๋ ์ฐ์ต์ ์ผ๋ง๋ ๋ง์ ์๊ฐ์ ํฌ์ํ๋๋?
- 1๋ง ์๊ฐ์ ์ฌ๋ฐ๊ฒฌ
- ๊ตฌ์ฒด์ ์ธ ๋ชฉํ ์ธ์ฐ๊ณ ์คํํ๊ธฐ
- ํผ๋๋ฐฑ๊ณผ ํผ๋๋ฐฑ์ ๋ฐ๋ฅธ ํ๋ ๋ณ๊ฒฝ์ ์๋ฐ
์์์ ์ธ ์ฐ์ต์ผ๋ก TDD, ๋ฆฌํฉํ ๋ง ์ฐ์ต ๊ณผ์
- ๋จ์ ํ
์คํธ ์ฐ์ต
- ์ฌ์ฉํ๋ API ์ฌ์ฉ๋ฒ์ ์ตํ๊ธฐ ์ํ
ํ์ต ํ ์คํธ
์์ฑ ์์ - xUnit์ ์ฌ์ฉ๋ฒ์ ์ตํ ์ ์๋ค.
- ์ฌ์ฉํ๋ API์ ๋ํ ํ์ต ํจ๊ณผ๊ฐ ์๋ค.
- input๊ณผ output์ด ๋ช ํํ ํด๋์ค ๋ฉ์๋(๋ณดํต util ์ฑ๊ฒฉ์ ๋ฉ์๋)
- ์ฌ์ฉํ๋ API ์ฌ์ฉ๋ฒ์ ์ตํ๊ธฐ ์ํ
- TDD ์ฐ์ต
- ํ ์ด ํ๋ก์ ํธ๋ก ์์ํ๊ธฐ
- ์์กด๊ด๊ณ๊ฐ ์๋ ํ๋ก์ ํธ๋ก ์์ํ๊ธฐ
- Refactoring ์ฐ์ต
- Method ๋ถ๋ฆฌํ๊ธฐ
- Depth๊ฐ 2๋จ๊ณ ์ด์
- Else๋ฅผ ์ ์ฐ๋ ์ฐ์ต
- Method๋ ํญ์ SRP๋ฅผ ์ง์ผ์ผ ํ๋ค.
ํ ๋ฒ์ ํ ๊ฐ์ง ๋ช ํํ๊ณ ๊ตฌ์ฒด์ ์ธ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์ฐ์ตํ๋ผ. ์ฐ์ต์ ๊ทน๋จ์ ์ธ Rule์ ์ธ์ ์ฐ์ตํ๋ ๊ฒ๋ ์ข๋ค. ๊ทธ๋์ผ insight๋ ์๊ธด๋ค.
๊ทน๋จ์ ์ธ Rule์ด๋ผ๋ฉด?
- ์ผ๊ธ Collection๋ง ์ฌ์ฉํ๊ธฐ.
- 3๊ฐ ์ด์์ ์ธ์คํด์ค ๋ณ์๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ์ฐ์ง ์๋๋ค.
- ์ ์ง์ ์ผ๋ก ์๊ตฌ์ฌํญ์ด ๋ณต์กํ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ๋ค.
์์กด๊ด๊ณ ์ถ๊ฐ๋ฅผ ํตํ ๋์ด๋ ๋์ด๊ธฐ
- ์ ๋จ๊ณ ์ฐ์ต์ ์ ์ํํ๋ค๋ฉด ํ ์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋์ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฐ์ตํ๊ธฐ
- ATDD ๊ธฐ๋ฐ์ผ๋ก ์์ฉ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐํ๊ธฐ
- ์ปดํ์ผ ์๋ฌ๋ฅผ ์ต์ํํ๋ฉด์ Refactoring
Book
Question
- comfort zone์ ๋์ค๋ ๋
ธํ์ฐ๋ ์์ผ์ ์ง?
- ์๊ฐ๊ณผ ๋ง์์ ์ธ ์ฌ์ ํ๋ณดํ๊ธฐ.
- ํ๋ณดํ ์๊ฐ๊ณผ ์ฌ์ ๋ก ์์์ ์ธ ์ฐ์ตํ๊ธฐ.
- ์๊ตฌ ์ฌํญ์ด ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ ํ
์คํธ ๋ณ๊ฒฝ ๋ํ ๋ง์ ๊ฒฝ์ฐ์๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
- ์ ๋๋ก ์ค๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ.
- ์ค๊ณ์ ๋ค์ ๊ณ ๋ฏผํ๊ณ ์๊ฐํ๊ธฐ.
- ๋ณ๊ฒฝ์ด ํ ๊ณณ์ผ๋ก ์ง์ค๋์ด์ผ ํ๋ค.
- ์ ๋๋ก ์ค๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ.
ํ๊ธฐ
- ๊ฐ์ฅ ์ฌ๋ฐ๊ฒ ๋ฃ๊ณ ์ดํด์ ๊ณต๊ฐ์ด ๋ง์ด ๊ฐ๋ ๊ฐ์์๋ค.
- ์๊ฐ์ด ๊ด์ฐฎ๋ค๋ฉด Toy Project๋ก ์์ํด๋ด์ผ๊ฒ ๋ค.
- ์ฐ์ ์๊ฐ๊ณผ ์ฌ์ ํ๋ณดํ๊ธฐ.
์ฝ๋ ํ์ง์ ์ํ ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ - ํ์ฑ๊ณค๋
TDD๋?
- Fail Test
- Write Production Code
- Refactoring
From Test
- ๋์ํ๋ ์ฝ๋์ ๋ํ ์์ ๊ฐ
- ํ๊ทํ ์คํธ๋ฅผ ํตํ ์์ ๋ก์ด ๋ฆฌํฉํ ๋ง
- ์ฝ๋์ ๋ํ ์ง์์ด ์ฆ๊ฐ
- ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์
From Test-first
- ๊ณผ๋ํ ์ค๊ณ๋ฅผ ํผํ๊ณ , ๊ฐ๊ฒฐํ interface๋ฅผ ๊ฐ์ง
- ๋ถํ์ํ ๊ธฐ๋ฅ(Gold-Plating)์ ์ค์
- ์คํ ๊ฐ๋ฅํ ๋ฌธ์(Executable documents)๋ฅผ ๊ฐ์ง
- ์ฝ๋ ํ์ง์ ๋์
TDD Metric
-
Software Quality
- External Quality + Internal Qulity
-
Internal Qulity
- Coding Rules : ๊ฐ๋ฐ ํ์ค ๋ฐ ๊ธฐ๋ณธ์ ์ธ ๊ด๋ก ์ค์
- Potential Bugs : Inspection์ ํ์ฉํ ์ ๊ฒ
- Comments : ์ ์ ํ ์ฃผ์, Public Method๋ง ํ์ธ
- Duplication : DRY
- Complexity : ์ ์ ํ ๋ถํฌ
- Unit Tests : Lack of Unit Test
ํ๊ธฐ
- ์๊ฐ๋ณด๋ค ์ธก์ ํ๋ ๋ฐฉ์์ด ๋ค์ํ๊ณ ์ธก์ ํ๋ Metric ๋ํ ๋๋ฌด ๋ง์๋ค.
- ๋จ์ํ Coverage๊ฐ ๋๋ค๊ณ ์ข์ Software๋ ์๋๋ผ๊ณ ๋ง์ํด์ฃผ์ ๊ฒ ๊ธฐ์ต์ด ๋จ๋๋ค.
ํ ์๋ชป ์ ์ ์ ์ด๋ป๊ฒ ํ ์คํธ๋ฅผ ์์ํ์๊น? - ์ดํ์น๋
-
์ด๋ฏธ ํ ์คํธ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋ค์ด์ ธ ์๋ ์ฝ๋๋ก ์์ํ๋ค.
- ์์ ํจ์
- ์ธ๋ถ ์์กด์ฑ(Dependency)์ด ์๋ ํจ์.
- utility, helper
-
ํ ์คํธ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค์ด์ ธ ์๋ ์ฝ๋์์ ํ ์คํธ ํ๊ธฐ ์ฌ์ด ๊ฒ๋ง ๋ถ๋ฆฌํ๊ธฐ
- ์ค์๋๊ฐ ๋์ ๋น์ฆ๋์ค ๋ก์ง์ด ํฌํจ๋ ๋ถ๋ถ
- ๋ฒ๊ทธ๊ฐ ๋ฐ๊ฒฌ๋ ๋ถ๋ถ(๊ณผ๊ฑฐ X)
- ๊ฒฐํฉ์ด ๋ฎ๊ณ ๋ ผ๋ฆฌ๋ ๋ณต์กํ ๋ถ๋ถ
-
์ธ๋ถ ์์กด์ฑ์ ์ ๊ฑฐํ๊ธฐ ์ํด Parameter๋ก ์์ฑํ๊ธฐ.
-
์ค์๋๊ฐ ๋์ ๋น์ฆ๋์ค ๋ก์ง๋ถํฐ ์์ํ๊ธฐ.
TDD์ ์ข์ ์ ์?
- ๋ถ์๊ฐ์ด ์ ๊ฑฐ๋๋ค.
- ์คํ ๋ฌธ์ ๊ฐ๋ฅ
- ์ค์ ๋ก ํ๋ผ๋ฏธํฐ ๋ญ๊ฐ ์๋ ์ง, ๋ฐํ ๊ฐ์ ์ด๋ค ๋ชจ์์ธ์ง ๋ฑ ์คํ์ ํ์ธํ ๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋ด ๋๋ค.
- ๋์์ธ ๊ฐ์ ํจ๊ณผ
- ํ ์คํธ ์ฝ๋๋ฅผ ํตํด์ ๋์์ธ ์์ ๊ฒฐ์ ์ ๊ฝค ์์ฃผ ๋ฐ๊ฒฌ
- ํ์ต ๋๊ธฐ๋ถ์ฌ
- ๊ฐ๋ฐ ์์ฐ์ฑ ํฅ์
- ๋ฒ๊ทธ๋ฅผ ์ถ์ ํ๋ ์๊ฐ์ด ํ์ ํ๊ฒ ์ค์ด๋ค์ด์.
- ํ ์คํธ ์ ํด์ ์๋ ์๊ฐ โ ํ ์คํธ ์ ํด์ ๋์จ ๋ฒ๊ทธ ๊ณ ์น๋ ์๊ฐ
- ํ๋ก์ ํธ ์์ฐ์ฑ ํฅ์
- ๋น์ฆ๋์ค ๋ก์ง์ ํ์ ์ ์ฌ์ ์ ๋ฐ๊ฒฌํ๊ธฐ๋ ํด์
- ์ง์ค๋ ฅ ํฅ์
- ๋์์ ํ ๊ฐ์ง ์ด์์ ์ผ์ ํ์ง ์๋๋ก ํต์ ํด์ค๋ค.
TDD๋ฅผ ์งํํ๋ฉด์ ์ค์๋?
- ํ
์คํธ ๋์ ์ค๋ฅ
- ๋น์ฆ๋์ค์ ๊ด๋ จ๋ ๋ฒ๊ทธ๋ฅผ ๋ผ ๊ฐ๋ฅ์ฑ์ด ๋ฎ๊ฑฐ๋ ์๊ณ ,
- ํ ์คํธ๋ฅผ ์ ์งํจ์ผ๋ก์จ ์ป๋ ์ด์ต < ํ ์คํธ ์ ์ง์ ๊ด๋ฆฌ์ ๋๋ ๋น์ฉ์ผ ๋
- ํ ์คํธ๊ฐ ๋จ์ธํ๊ณ ์๋ ๋ด์ฉ์ด ์ฌ์ฉ์์๊ฒ ์ค์ํ ๊ฐ์น๋ฅผ ์ฃผ๋ ๊ฒ์ด ์๋๋๋ ์์ฑํ์ง ์๋๋ค.
- ๊ฒ์ฆ๋ ฅ์ด ๋จ์ด์ง๋ ํ
์คํธ
- ์๋ชป๋ ๊ฒ์ฆ.
- ์ฐจ๋ผ๋ฆฌ ์ํ๋๊ฒ ๋ซ๋ค.
- ํ
์คํธ๋ฅผ ์์๊ฐ๋ ํ๋ก๋์
์ฝ๋
- ์์๋๊ฐ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ๋นํ์ด ์๊ธฐ๊ฒ ๋๋ค.
- ๋นํ์ ํตํด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ ์ ์๋ ๊ฐ๋ฅ์ฑ.
- ํจ์๊ฐ ๊ณณ๊ณณ์ ํผ์ง๊ฒ ๋๋ค.
- ๋ฎ์ ๊ฒฐํฉ๋๋ ์ป์์ง๋ง ๋์ ์์ง๋ ฅ์ ์ป์ง ๋ชปํ๋ค.
๋ฌด์์ ๊ฒ์ฆํ ๊ฒ์ธ๊ฐ?
- ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ์ฃผ๋ ๋ถ๋ถ์ ํ ์คํธ ํ์.
- ํ ์คํธ ์ฝ๋๋ ์ฝ๋. ๊ฐ์ ํ๊ณ ์ ์ง๋ณด์ํ๋ค.
ํ๊ธฐ
- ๋น์ทํ ๊ฒฝํ๋ ํ๊ณ ํ ์คํธ๋ฅผ ์์ฑํ๊ธฐ์ ์์ ๋น์ฆ๋์ค ๊ฐ์น๋ฅผ ์ฃผ๋ ์ง ํ์ธํ๋ ์์ ๋ ํ์ํด ๋ณด์ธ๋ค.
ํ ์คํธ๋ฅผ ๋๋ณด๊ธฐ ์ํ ๊ฐ๋จํ ์ค์ฒ ๋ฐฉ๋ฒ, ํจ๊ณผ - ์์์๋
-
๊ท์ฐฎ์ ๊ฒ.
-
๊ณ ํต์ค๋ฝ๊ฒ ํ๋ ๊ฒ.
- ์จ๊ฒจ์ง ๋ณธ์ง
- ํ
์คํธ ์์ฌ์์ด
- ํ ์คํธ๊ฐ ์คํจํ๋ ์ด์ ๋ ๋จ ํ๋
- ํ๋์ ํ ์คํธ๋ ์ค์ง ํ ๊ฐ์ง๋ง ๋๋ฐ๋ก ๊ฒ์ฌํด์ผ ํ๋ค.
- ๋ฌด์์ ํ
์คํธํ๋์ง? ์ธ์ง๋ฅ๋ ฅ์ ๊ณผ๋ถํ
- ํฉ์ด์ง ์ฝ๋์ ๋ฐ์ดํฐ
- ๋งค์ง๋๋ฒ
- ํ
์คํธ๊ฐ ๊นจ์ง๊ธฐ ์ฌ์ด ๊ฒ๋ค
- ๋์ ๊ฒฐํฉ
- ๋ฎ์ ์์ง
-
์ถ์์ด๋?
- ๋ฌธ๋งฅ(Context) ์์์ ์ค์ง ๊ด์ฌ ์๋ ๊ฒ๋ค์ ๋ํด์๋ง ์ง์คํ์ฌ ๋ช ํํ๊ฒ ํ๋ ๊ฒ.
-
์จ๊ฒจ์ง ๋ณธ์ง
- ๋ฎ์ ์ถ์ํ
- ๋ค์ญ๋ ์ญํ ์ถ์ํ
- ๋์ด์ง ๋ ผ๋ฆฌ
- ์ ์ ์๋ ์๋
Reference
ํ๊ธฐ
- ํ ์คํธ ์ฝ๋๋ ํ๋ก๋์ ์ฝ๋์ฒ๋ผ ๊ฐ์ ํด๋๊ฐ๋ ๋ชจ์ต์ด ์ธ์์ ์ด์๋ค.
๋น์ ์ TDD๊ฐ ํญ์ ์คํจํ๋ ์ด์ - ์ด๊ท์๋
์ฐ๋ฆฌ๊ฐ ์ ์ดํ ์ ์๋ ๊ฒ
- ์ธ๋ถ ์ธ์
- ํ์ค ์ธ๊ณ
- ์ธํ๋ผ
- ์ธ๋ถ ์๋น์ค
- ๋ ๊ฑฐ์
์ค๊ณ
-
๋ฎ์ ๊ฒฐํฉ
-
๋์ ์์ง
-
๋๋ฉ์ธ ๋ชจ๋ธ ๋ณดํธ
-
์ ๋ณด ์จ๊น(information hiding)
- ์ด๋ ค์ด ์ค๊ณ ๊ฒฐ์ ๊ณผ ๋ณ๊ฒฝ๋ ๊ฐ๋ฅ์ฑ์ด ๋์ ์ค๊ณ ๊ฒฐ์ ๋ค์ ๋ค๋ฅธ ๋ชจ๋๋ก๋ถํฐ ์จ๊ธฐ๋ ๊ฒ.
- ์ธํฐํ์ด์ค ํ ์คํธ
-
๋ฐ๋ณต ์ฃผ๊ธฐ
- ๊ณํ
- ์คํ
- ํ๊ฐ
-
๊ณต์ ํ๋ ๋ฌธํ
- ๋ชฉํ
- ์ง์
-
๋๋ฉ์ธ ๋ชจ๋ธ๊ณผ ํ๋ซํผ
- ๋๋ฉ์ธ ๋ชจ๋ธ์ ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ด์ด์ผ ํ๋ค.
๋จ์ ํ ์คํธ๋ ํต๊ณผ๋์ง๋ง ํญ์ ์์ ํ ๊น?
- ํญ์ ์์ ํ์ง ์๊ธฐ์ ํตํฉ ํ
์คํธ๋ ํ์ํ๋ค.
- ๋ฉ๋ด์ผ ํ ์คํธ
- ๊ธฐ๋ฅ ํ ์คํธ
- ์ธ๋ถ ์ฐ๋ ํ
์คํธ์ธ ๊ฒฝ์ฐ?
- Fake Service๋ฅผ ๋ง๋ค์ด์ ์งํ
ํ๊ธฐ
- ๋จ์ ํ
์คํธ๋ก๋ ๋ฐ๊ฒฌํ ์ ์๋ ๋ถ๋ถ๋ ์๋ ์ค์ ์ฌ๋ก๋ฅผ ์ง์ ๋ณด๊ฒ ๋์ด ๊ธฐ์๋ค.
- ์ฌ๋ด์์๋ ํตํฉ ํ ์คํธ์ ํ์์ฑ์ ๋ํด ์กฐ์ธ์ ๋ง์ด ํด์ฃผ์ จ๋ค.
Q & A
์ TDD๊ฐ ํ์ํ๊ฐ?
- ๋๋ฅผ ์ํด์ ํ์.
- ์ ํํ๋ ๊ฑด ๋์ค์ ํ์.
- ์ค์ค๋ก ํ์์ฑ์ ๋๋ผ๊ฒ ํ๋๊ฒ์ด ๊ฐ์ฅ ์ค์.
- TDD ์ข์ ์ ์?
- ์ถ์ ๋ง์กฑ๋๋ฅผ ๋์ฌ์ค๋ค.
- ๋น ๋ฅธ ํผ๋๋ฐฑ์ ํตํด ์ง๋ฌด์ ํ์ง์ ๋ฎ์ถฐ์ค๋ค.
- TDD๋ ์ด๋์ ์๊ฒผ์๊น?
- Pair Programming์ ํ๋ฉด์ ์๊ฒผ๋ค.
- ๋จผ์ ์ ์์ผ์ด๋ ํ๊ฒฝ์ด ๊ฐ์ถฐ์ค์ผ ํ๋ค.
- ์ ์์ผ์ ์ฌํ์ ์ธ ํ์.
- ๋๋ง ํ๋ ๊ฒ์ด ์๋๋ผ ๋ค๊ฐ์ด ํ๋ ํ์
- ์๊ฐ์ด ๋ง์ด ํ์ํฉ๋๋ค.
- ์์ ๋ณํ๋ฅผ ์ผ์ผํค๊ธฐ ์ํด์๋?
- ๋ง์ ๋์ ๊ณผ ์คํจํ๊ธฐ
- TDD๋ฅผ ๋์
ํ๋ ค๋ฉด?
- ํ๋ฒ์ ๋์ ํ๋ ค ํ์ง ๋ง๊ณ ์์ Step ์งํํ์.
- ํ๋ฒ์ ํ๋์ ์คํจ
- ํ ์คํธ์ ์์๊ฐ ์ค์.
์ฒซ ํ ์คํธ๋ฅผ ์์ฑํ ๋ ํต์ฌ์ ํ ์คํธํ์. ์ฒซ ๋จ์ถ๋ถํฐ ์๋ชป ์์ฑํ๊ฒ ๋๋ฉด ๋ฐฉํฅ์ฑ ์๊ฒ ๋์ด ํ ์คํธ์ ์์ฑ ๋ฐฉํฅ์ด ์์ ๋ค๋ฅด๊ฒ ์งํ๋๋ค.
์ปค๋ฒ๋ฆฌ์ง๋ ์๋ฏธ ์๋ ์ซ์์ธ๊ฐ?
- Metric์ ์ด์ ์ ๋ง์ถ๊ฒ ๋๋ฉด ์์ด๋ฒ๋ฆฌ๋๊ฒ ๋ง๋ค.
- ํ ์คํธ์ ํ์ง๋ ์ค์ํ๋ค.
- ์งํ๋ฅผ ๋์ด๊ธฐ ์ํ ํ ์คํธ๋ ์ข์ง ์๋ค.
- ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง์ ์ด์ ์ ๋ง์ถ์ง ๋ง์.