๐ก ๋ณธ ๊ฒ์๊ธ์ ์ต๋ฒ๊ท ์ ์๋์ "ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ ์์ํ๊ธฐ"์ ๋ํด ๊ณต๋ถํ๊ณ , ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
Chapter 02. TDD ์์
1) TDD๋?
- TDD(Test-Driven Development)๋ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค. ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ ํ ์คํธ ์ฝ๋๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ์ด ํ ์คํธ๋ฅผ ํต๊ณผ์ํค๊ธฐ ์ํด ํ์ํ ์ต์ํ์ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
2) ๊ฐ๋จํ ๋ง์ ๊ธฐ๋ฅ์ TDD๋ก ๊ตฌํํ๊ธฐ
1. ํ ์คํธ ์ฝ๋ ์์ฑ
- Calculator ํด๋์ค๋ฅผ ์์ฑํ์ง ์์์ผ๋ ๋น์ฐํ ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํด์ผ ํฉ๋๋ค.
public class CalculatorTest { @Test void plus() { int result = Calculator.plus(1, 2); assertEquals(3, result); } }
2. ๊ตฌํํ ๋ฉ์๋์ ๋ํด ๊ณ ๋ฏผํ๊ธฐ
- ๋ง์
๋ฉ์๋ ์ด๋ฆ์
plus
๊ฐ ์ข์๊น? ์๋๋ฉดsum
์ด ์ข์๊น? - ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ฉ์๋๋ ํ๋ผ๋ฏธํฐ๊ฐ ๋ช ๊ฐ์ฌ์ผ ํ ๊น? ํ๋ผ๋ฏธํฐ์ ํ์ ์? ๋ฐํํ ๊ฐ์?
- ๋ฉ์๋๋ฅผ ์ ์ ๋ฉ์๋๋ก ๊ตฌํํ ๊น ์ธ์คํด์ค ๋ฉ์๋๋ก ๊ตฌํํ ๊น?
- ๋ฉ์๋๋ฅผ ์ ๊ณตํ ํด๋์ค ์ด๋ฆ์ ๋ญ๊ฐ ์ข์๊น?
3. Calculator ํด๋์ค ๊ตฌํ
(1) ์ฐ์ ํ ์คํธ ์ฝ๋์์ ์ฌ์ฉํ๋ ์คํ์ ๋ง๋ค์ด์ฃผ๊ณ ๋ด๋ถ ๊ตฌํ์ 0์ผ๋ก ๋ฆฌํดํ๋๋ก ์์ฑํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ ์คํธ ์ฝ๋๋ฅผ ์คํํ๋ฉด ์คํจ๊ฐ ๋ฐ์ํฉ๋๋ค.
public class Calculator {
public static int plus(int a1, int a2) {
return 0;
}
}
(2) ์คํจ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๊ฒฐ๊ณผ๊ฐ์ 3์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค. ํ ์คํธ ์ผ์ด์ค๋ ์ฑ๊ณตํฉ๋๋ค. ์ด์ ๋ง์ ๊ฒ์ฆ ์ฝ๋๋ฅผ ํ๋ ๋ ์ถ๊ฐํฉ๋๋ค.
public class Calculator {
public static int plus(int a1, int a2) {
return 3;
}
}
(3) ํด๋น ํ ์คํธ ์คํ ์ ์คํจ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
@Test
void plus() {
int result = Calculator.plus(1, 2);
assertEquals(3, result);
assertEquals(5, Calculator.plus(4, 1));
}
(4) ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ๋ง์กฑํ๋ ๋ง์ ๋ก์ง์ผ๋ก ๊ตฌํํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๊ฒ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ถ๊ฐํ๋ค ๋ณด๋ฉด ๊ฒฐ๊ตญ ์๋์ ๊ฐ์ ๊ตฌํ ์ฝ๋๊ฐ ์์ฑ๋ ๊ฒ์ ๋๋ค.
public class Calculator {
public static int plus(int a1, int a2) {
if (a1 == 4 && a2 == 1) return 5;
else return 3;
}
}
(5) ๋ง์ ๊ธฐ๋ฅ์ ๋ํ TDD๋ก ๊ตฌํํด ๋ดค์ต๋๋ค.
public class Calculator {
public static int plus(int a1, int a2) {
return a1 + a2;
}
}
3) TDD ์: ์ํธ ๊ฒ์ฌ๊ธฐ
- ์ํธ ๊ฒ์ฌ๊ธฐ๋ ๋ฌธ์์ด์ ๊ฒ์ฌํด์ ๊ท์น์ ์ค์ํ๋์ง์ ๋ฐ๋ผ ์ํธ๋ฅผ '์ฝํจ', '๋ณดํต', '๊ฐํจ'์ผ๋ก ๊ตฌ๋ถํฉ๋๋ค.
1. ๊ฒ์ฌํ ๊ท์น
- ๊ธธ์ด๊ฐ 8๊ธ์ ์ด์
- 0๋ถํฐ 9 ์ฌ์ด์ ์ซ์๋ฅผ ํฌํจ
- ๋๋ฌธ์ ํฌํจ
2. ๊ท์น์ ๋ฐ๋ฅธ ๋ถ๋ฅ
- ์ธ ๊ท์น์ ๋ชจ๋ ์ถฉ์กฑํ๋ฉด ์ํธ๋ ๊ฐํจ์ ๋๋ค.
- ๋ ๊ฐ์ ๊ท์น์ ์ถฉ์กฑํ๋ฉด ์ํธ๋ ๋ณดํต์ ๋๋ค.
- ํ ๊ฐ ์ดํ์ ๊ท์น์ ์ถฉ์กฑํ๋ฉด ์ํธ๋ ์ฝํจ์ ๋๋ค.
3. ํ ์คํธ ์ฝ๋ ์์ฑ
public class PasswordStrengthMeterTest {
@Test
void name() { }
}
(1) ์ฒซ ๋ฒ์งธ ํ ์คํธ: ๋ชจ๋ ๊ท์น์ ์ถฉ์กฑํ๋ ๊ฒฝ์ฐ
@Test
void meetsAllCriteria_Then_Strong() {
private PasswordStrengthMeter meter = new PasswordStrengthMeter();
PasswordStrength result = meter.meter("ab12!@AB");
assertEquals(PasswordStrength.STRONG, result);
}
(2) PasswordStrengthMeter ํ์ ๊ณผ PasswordStrength ํ์ ์ด ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ์ ์ ์์ฑํฉ๋๋ค.
public enum PasswordStrength {
STRONG
}
public class PasswordStrengthMeter {
public PasswordStrength meter(String s) { return null; }
}
4. ๋ชจ๋ ๊ท์น์ ์ถฉ์กฑํ๋ ํ ์คํธ ํต๊ณผ
public class PasswordStrengthMeter {
public PasswordStrength meter(String s) { return PasswordStrength.STRONG; }
}
5. ์กฐ๊ฑด๋ณ ํ ์คํธ ์ฝ๋ ์์ฑ ๋ฐ ๊ตฌํ
- ๊ฐ ์กฐ๊ฑด๋ณ๋ก ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๊ณ , ํด๋น ์กฐ๊ฑด์ ํต๊ณผํ๋๋ก ๊ตฌํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ง์ ์ผ๋ก ๊ธฐ๋ฅ์ ์์ฑํฉ๋๋ค.
์์)
- ๊ธธ์ด๋ง 8๊ธ์ ๋ฏธ๋ง์ด๊ณ ๋๋จธ์ง ์กฐ๊ฑด์ ์ถฉ์กฑํ๋ ๊ฒฝ์ฐ
@Test
void meetsOtherCriteria_except_for_length_Then_Normal() {
private PasswordStrengthMeter meter = new PasswordStrengthMeter();
PasswordStrength result = meter.meter("ab!@ABqwer");
assertStrength(result, PasswordStrength.NORMAL);
}
- ๊ตฌํ ์ฝ๋
public class PasswordStrengthMeter {
public PasswordStrength meter(String s) {
if (s.length() < 8) {
return PasswordStrength.NORMAL;
}
return PasswordStrength.STRONG;
}
}
6. ์ฝ๋ ์ ๋ฆฌ ๋ฐ ๋ฆฌํฉํ ๋ง
- ํ ์คํธ๊ฐ ๋ชจ๋ ํต๊ณผํ ํ์๋ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ค๋ณต์ ์ ๊ฑฐํฉ๋๋ค.
4) TDD ๋ด์ฉ ์ ๋ฆฌ
1. TDD ํ๋ฆ
- TDD๋ ๊ธฐ๋ฅ์ ๊ฒ์ฆํ๋ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ํ ์คํธ๋ฅผ ํต๊ณผํ๊ธฐ ์ํ ์ต์ํ์ ์ฝ๋๋ฅผ ์์ฑํ ํ, ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ๊ฐ์ ํ๋ ๊ณผ์ ์ ๋ฐ๋ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ง์ ์ผ๋ก ๊ธฐ๋ฅ์ ์์ฑํด ๋๊ฐ๋๋ค.
2. ๋ ๋ - ๊ทธ๋ฆฐ - ๋ฆฌํฉํฐ
- ๋ ๋(Red): ์คํจํ๋ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
- ๊ทธ๋ฆฐ(Green): ํ ์คํธ๋ฅผ ํต๊ณผ์ํค๊ธฐ ์ํ ์ฝ๋๋ฅผ ์์ฑํฉ๋๋ค.
- ๋ฆฌํฉํฐ(Refactor): ์ฝ๋๋ฅผ ์ ๋ฆฌํ๊ณ ๊ฐ์ ํฉ๋๋ค.
3. ํ ์คํธ๊ฐ ๊ฐ๋ฐ์ ์ฃผ๋
- ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๋ฉด ํ ์คํธ๊ฐ ๊ฐ๋ฐ์ ์ฃผ๋ํ๊ฒ ๋ฉ๋๋ค. ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ณผ์ ์์ ๊ตฌํ์ ์๊ฐํ์ง ์๊ณ ๊ธฐ๋ฅ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋์ํ๋์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค.
4. ์ง์์ ์ธ ์ฝ๋ ์ ๋ฆฌ
- ๊ตฌํ์ ์๋ฃํ ํ์๋ ๋ฆฌํฉํ ๋ง์ ์งํํ์ฌ ์ฝ๋ ํ์ง์ ์ ์งํฉ๋๋ค. ํ ์คํธ ์ฝ๋๊ฐ ์์ผ๋ฉด ๋ฆฌํฉํ ๋ง์ ๋ณด๋ค ๊ณผ๊ฐํ๊ฒ ์งํํ ์ ์์ต๋๋ค.
5. ๋น ๋ฅธ ํผ๋๋ฐฑ
- TDD๋ ์ฝ๋ ์์ ์ ๋ํ ํผ๋๋ฐฑ์ ๋น ๋ฅด๊ฒ ์ ๊ณตํฉ๋๋ค. ์๋ก์ด ์ฝ๋๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ๋ฉด ํ ์คํธ๋ฅผ ๋๋ ค์ ํด๋น ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅธ์ง ๋ฐ๋ก ํ์ธํ ์ ์์ต๋๋ค.
5) ๊ฒฐ๋ก
- TDD๋ ํ ์คํธ๋ฅผ ๋จผ์ ์์ฑํ๊ณ , ํ ์คํธ๋ฅผ ํต๊ณผ์ํค๊ธฐ ์ํ ์ต์ํ์ ์ฝ๋๋ฅผ ์์ฑํ ํ, ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ์ ์ง์ ์ผ๋ก ๊ธฐ๋ฅ์ ์์ฑํด ๋๊ฐ๋ ๊ฐ๋ฐ ๋ฐฉ๋ฒ๋ก ์ ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ํ์ง์ ์ ์งํ๊ณ , ๋น ๋ฅธ ํผ๋๋ฐฑ์ ๋ฐ์ ์ ์์ต๋๋ค.
'Spring > Test Driven Development' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
1. ์์ง๋์ด๋ง๊ณผ ์์น (0) | 2025.07.20 |
---|---|
์ด๋ ธํ ์ด์ ์ ๋ฆฌ (1) | 2024.11.02 |
Practical Testing: ์ค์ฉ์ ์ธ ํ ์คํธ ๊ฐ์ด๋ (0) | 2024.06.28 |