TDD (Test Driven Development), ν μ€νΈ μ£Όλ κ°λ°μ΄λ?
2010λ μ μ°μΈ π μ±μμλμ TDD μ€μ²λ²κ³Ό λꡬ κ³΅κ° PDF λ₯Ό μ°Έκ³ νμλ€.
μ§κΈκΉμ§λ...
λ΄κ° μ§κΈκΉμ§ μννΈμ¨μ΄λ₯Ό κ°λ°ν λ νλ λ°©μμ μ€κ°μ€κ° println μ΄λ congole.log λ , νΉμ logging λΌμ΄λΈλ¬λ¦¬λ μ½μμ°½μ λ°μ΄ν°λ₯Ό μ°μ΄λ³΄λ©° μ½λλ₯Ό κ²μ¦νλ€. μ΄λ° κ²½μ° μμ μ λ¨Έλ¦¬λ‘ λλΆλΆμ μμ‘΄ν΄μΌνλ€. κ²λ€κ° λ§μ½ κΈ°λ₯μ΄ μΆκ°λκ±°λ μ½λμ μΌλΆλΆμ΄ λ³κ²½λλ€λ©΄? λ€μ λ‘κ·Έλ₯Ό μ°κ³ λ¬Έμ λλ λΆλΆμ μ΄ν΄λ³΄λ μμ μ λ°λ³΅ν΄μΌ νλ€. μ¬κΈ°μ μ½λμ λͺΈμ§μ΄ κ±°λν΄μ§λ€λ©΄? λλ²κΉ ν΄μΌνλ λΆλΆμ μ°Ύμλ΄κΈ° λ μ΄λ €μμ§λ€. μ μ μ°¨λ €λ³΄λ©΄ μ΄λμ λ‘κ·Έ μ°λ μ½λκ° λΉμ¦λμ€ λ‘μ§λ§νΌ μ ν μλ€.
TDD, ν μ€νΈ μ£Όλ κ°λ°
κ·Έλμ λμ¨ κ²μ΄ ν μ€νΈκ° μ£Όλνλ κ°λ°, TDD λ€. ν μ€νΈκ° μ£Όλνλ€λ 건 ν¨μλ λͺ¨λμ λ§λ€κΈ° μ μ ν μ€νΈλ₯Ό λ¨Όμ νλ€λ κ²μ΄λ€. νλ‘λμ μ½λλ₯Ό μμ±νμ§λ μμλλ° μ΄λ»κ² ν μ€νΈνμ§? λΌλ μλ¬Έμ κ°μ‘λλ°, μλ μ€λͺ μ 보λ μ΄ν΄κ° λμλ€.
ν μ€νΈλ₯Ό λ¨Όμ νλΌ!
int a, b λ₯Ό λν ν©κ³λ₯Ό λ°ννλ sum ν¨μλ₯Ό μκ°ν΄λ³΄μ. μ μμ μΌλ‘ λμνλ€λ©΄ sum(a,b) = (a+b) κ° true μΌ κ²μ΄λ€. νλ‘λμ μ½λλ₯Ό μμ±νμ§ μμλ μ΄λ»κ² ν μ€νΈν μ§ κ°μ΄ μ‘νλ€. sum(1,2) = 3 / sum(6, 20) = 26 μ΄ true μΈμ§ false μΈμ§ κ²μ¬νλ©΄ λλ€. μλ μ½λλ₯Ό μ°Έκ³ νμ.
public class Calculator {
public int sum(int a, int b) {
return 0;
}
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println( calc.sum(10, 20) == 30);
System.out.println( calc.sum(1, 2) == 3);
System.out.println( calc.sum(-10, 20) == 10);
System.out.println( calc.sum(0, 0) == 0);
}
}
-----μ€ν κ²°κ³Ό-----
false
false
false
true
μ¬κΈ°μλ main λ©μλκ° ν μ€νΈ λ©μλμ²λΌ μ¬μ©λμλ€. ν μ€νΈ λμμΈ sum λ©μλλ μ»΄νμΌ μλ¬κ° λμ§ μλ λΉ μνμ΄λ€. λͺΈμ²΄ μμ ꡬννμ§ μκ³ ν μ€νΈ μ½λλ₯Ό μμ±νλ€. κ°κ°μ ν μ€νΈ μ½λλ₯Ό ν μ€νΈ μΌμ΄μ€λΌκ³ νλ€. λͺΈμ²΄κ° ꡬνλμ§ μμμΌλ ν μ€νΈ μΌμ΄μ€λ€μ λΉμ°ν μ€ν¨νλ€. μΌλΆλ¬ μ€ν¨νλ μ½λλ₯Ό μ§ κ²μ΄λ€.
ν μ€νΈ μΌμ΄μ€λ€μ λ°λ‘ μμμ λ§ν μ’ λ£ μ‘°κ±΄μ λ°λ₯Έ κ²μ΄λ€. 10+20 = 30 μ΄ λμ€λ©΄ μ’ λ£, -10+20=10 μ΄ λμ€λ©΄ μ’ λ£... ν μ€νΈ μΌμ΄μ€λ₯Ό μμ±νμΌλ μ΄μ λͺΈμ²΄, μ€μ νλ‘λμ μ½λλ₯Ό ꡬννλ€. κ·Έλ¦¬κ³ λ€μ λλ Έμ λ ν μ€νΈ μΌμ΄μ€λ€μ΄ λͺ¨λ true λ‘ μΆλ ₯λλ©΄ sum λ©μλλ μ μμ μΌλ‘ μμ±λλ€κ³ νλ¨νλ€. μ΄νμλ ν μ€νΈλ₯Ό ν΅κ³Όν νλ‘λμ μ½λλ₯Ό μ€λ³΅λ λ‘μ§μ΄ μλμ§, μΈλ°μλ λ°μ΄ν°κ° λ€μ΄κ°μ§ μμλμ§ μ΄ν΄λ³΄κ³ 리ν©ν λ§νλ€.
μ΄λ κ² λ©μλ λ¨μλ‘ νλ ν μ€νΈλ₯Ό λ¨μ ν μ€νΈ(unit test) λΌκ³ νλ€. λ¨μν μ€νΈλ₯Ό μνν¨μΌλ‘μ¨ μ΄νμ λ°μνλ ν μ€νΈ λ¨κ³μμμ κ²°ν¨ λΉμ©μ μ€μΈλ€. κ²°ν¨μ 빨리 λ°κ²¬λ μλ‘ μ μ λΉμ©μΌλ‘ μ²λ¦¬κ° κ°λ₯νκΈ° λλ¬Έμ΄λ€.
λ μ¬κΈ°μλ println μΌλ‘ μΆλ ₯νμ§λ§, μ΄κ±Έ μλμΌλ‘ νμΈν΄μ£Όλ λΌμ΄λΈλ¬λ¦¬λ€μ΄ μμΌλ κ·Έκ±Έ μ¬μ©νλ©΄ λλ€. λ°λΌμ κ°λ°μλ€μ λ‘κ·Έλ₯Ό νλνλ μ°μ§ μμλ μ λ κ² ν μ€νΈ μΌμ΄μ€λ§ λ§λ€μ΄λλ©΄ μλμΌλ‘ ν μ€νΈν μ μλ κ²μ΄λ€.
TDD μ νλ‘μΈμ€
μμμ μ΄ν΄λ³Έ κ²μ²λΌ (νλ‘λμ μ½λκ° μλ λΉ ν¨μμ΄λ―λ‘) μ€ν¨νλ ν μ€νΈ μ½λλ₯Ό μμ±νκ³ -> ν μ€νΈκ° ν΅κ³Όνλ νλ‘λμ μ½λλ₯Ό μμ±νκ³ -> μ½λλ₯Ό 리ν©ν λ§νλ μ¬μ΄ν΄μ λ λ κ·Έλ¦° μ¬μ΄ν΄μ΄λΌκ³ νλ€.
λκ° μ’μκΉ?
μμμ κ°λ΅νκ² λ§νκ³ λμ΄κ°λ ν μ€νΈ κ°λ°μ μ₯μ μ μλμ κ°λ€.
- κ°λ°λ¨κ³ μ΄κΈ°μ λ¬Έμ λ₯Ό λ°κ²¬νκ² λμμ€λ€.
- λμ€μ μ½λλ₯Ό 리ν©ν λ§νκ±°λ λΌμ΄λΈλ μ΄λ λ± κΈ°μ‘΄ κΈ°λ₯μ΄ μ¬λ°λ₯΄κ² μλνλμ§ νμΈν μ μλ€.
- λ¨μ ν μ€νΈ μ체λ₯Ό λ¬Έμλ‘ μ¬μ©ν μ μλ€.
μ΄μ ν μ€νΈλ₯Ό λ¨Όμ νλ€λ λ§μ΄ 무μμΈμ§ μ΄ν΄κ° λμλ€. μ΄λ €μ΄ κΈ°μ μ μ΄ κ²λ μλλ€. νλ‘λμ μ½λλ₯Ό μμ±νκΈ° μ μ ν μ€νΈ μΌμ΄μ€λ₯Ό λ¨Όμ μμ±νλ κ²μ΄λ€!
μ§μ§ κ°λ¨ν κΉ?
μ΄λ κ² κ°λ¨ν κ²μ²λΌ λ§νμ§λ§, TDD λ₯Ό μ μ©νκΈ° μ΄λ €μ΄ μν©μ΄ λ§λ€. νΉν μμ‘΄κ΄κ³κ° λ§μ λͺ¨λμ TDD λ₯Ό μ μ©νκΈ° μ΄λ ΅λ€... κ·Έλμ μ΄μ μλ μ΅μνμ ν μ€νΈ μ½λλ§ μμ±νμλλ° μμ¦ μΆμΈλ λλΆλΆμ μλΉμ€ νμ¬κ° ν μ€νΈ μ½λμ κ΄ν΄ μꡬνκ³ μλ€κ³ νλ€. μ½λ© ν μ€νΈλ₯Ό λ¨μ ν μ€νΈλ‘ 보λ κ²½μ°λ μλ€κ³ ...
TDD μ μ μ μ¬ν
ν μ€νΈ μΌμ΄μ€μ μ΄λ¦
μ’μ μ½λλ νμ λ§νμ§λ§, μ¬λμ΄ μ½κΈ°μλ νΈν μ½λλ€. ν μ€νΈ μΌμ΄μ€λ νμ 'μ΄λ° μν©μ μ΄λ κ² ν μ€νΈ λκ³ μꡬλ' λ₯Ό νμ ν μ μλ μ’μ λͺ μΈμκ° λλ€. λ°λΌμ μ΄λ¦μ μλ―Έ μκ² μ§μ.
μΌμ΄μ€λ λ§μ μλ‘ μ’μ κ² μλλ€
μλνλ ν μ€νΈ μΌμ΄μ€λ μμ€νμ§μ λμ¬μ£Όμ§λ§, κ·Έλ λ€κ³ λ§μ κ² μ’μ 건 μλλ€. μ€λ³΅λ μΌμ΄μ€λ λ μ΄μ μ λλ‘ λμνμ§ μλ μΌμ΄μ€λ κ³Όκ°ν μμ νλ κ² μ’λ€. λ λͺ¨λ μν©μ λν μΌμ΄μ€λ₯Ό λ§λ€ νμλ μλ€. ν μ€νΈ μ£Όλ κ°λ°μ΄λΌκ³ ν΄μ ν μ€νΈμκ² μ£Όλλλ κ°λ°μκ° λλΌλ 건 μλλ€. ν μ€νΈλ μννΈμ¨μ΄κ° μ μμ μΌλ‘ λμνλμ§ νμΈμ μν 보쑰 λꡬμ΄λ€.
μ¬λ¬ κ°μ fail ν μ€νΈ μΌμ΄μ€λ₯Ό ν λ²μ λ§λ€μ§ μλλ€
κ°λ° μ€μλ μμ±νκ³ μλ νλμ ν΄λμ€μ νλμ μ€ν¨νλ ν μ€νΈλ§ μ μ§νλ€. ν΄λΉ μ€ν¨λ₯Ό μ±κ³΅μν¨ ν λ€μ μ€ν¨ μΌμ΄μ€λ₯Ό μμ±νλ κ² μ’λ€. (무μμ μ¬λ¬ κ°λ₯Ό μμ±νλ©΄ λΉμ°ν μ’μ ν μ€νΈ μ½λλ₯Ό μΈ μ μμΌλ...)
νλμ ν μ€νΈ μΌμ΄μ€λ νλλ§ ν μ€νΈνλλ‘ νλ€.
νλμ ν μ€νΈ λ©μλμμ νλ μ΄μμ νλͺ©μ νκΊΌλ²μ ν μ€νΈνλ건 μ’μ§ μλ€. getter, setter μ±κ²© λΉμ·νλ λ λ€ ν μ€νΈν΄! λ λ°λμ§νμ§ λͺ»ν ν μ€νΈλ€...
μ΄λ° νλ¦μ μ μ§νλ©΄ μ’λ€.
μκ°μ΄ 걸리λλΌλ ν μ€νΈ μ½λλ₯Ό λ¬Έλ§₯μ λ§κ² μ μ€κ³νκ³ , νλ‘λμ μ½λκ° λλ ΅λλΌλ μ΅λν λΉ λ₯΄κ² ν μ€νΈ μ½λλ₯Ό ν΅κ³Όνλλ‘ μμ±ν μ΄ν 리ν©ν λ§μ νλ 리λ¬μ μ μ§νλ κ±Έ μΆμ²νλ€.