보ν΅μ TDD Cycle
-
ν μ€νΈ μμ± (Write a test)
μκ°νκ³ μλ μ°μ°μ μ΄λ»κ² μ½λλ‘ μμ±ν μ§ κ³ λ―Όν΄λ³Έλ€.
νμ¬ μ΄μΌκΈ°λ₯Ό μ°κ³ μλ€κ³ μκ°νκ³ , μμ±ν μ½λκ° κ°μ§κ³ μμμΌλ©΄ νλ μΈν°νμ΄μ€λ₯Ό λμμΈνλ€. μ νν μ°μ°μ μν΄ νμν λͺ¨λ κ²λ€μ μμνκ³ μ΄μΌκΈ°μ ν¬ν¨μν¨λ€. -
μμ±λ ν μ€νΈ λμκ°κ² νκΈ° (Make it run)
λΉ λ₯΄κ² ν μ€νΈλ₯Ό λμκ°κ² νλ κ²(getting bar to go to green) μ΄ λ€λ₯Έ μμλ€λ μ’μ§μ°μ§νλ€.
λ§μ½ ν΄κ²° λ°©λ²μ΄ κ°λ¨νκ³ λͺ ννλ€λ©΄, ν μ€νΈλ₯Ό μμ±ν΄λΌ. ν΄κ²° λ°©λ²μ΄ κ°λ¨νκ³ λͺ ννμ§λ§ μκ°μ΄ 걸릴 κ² κ°λ€λ©΄, μ μ΄ λκ³ μ€μν λ¬Έμ λ‘ λμκ°λ€.
μ΄ μ리λ κ²½ν μλ κ°λ°μλ€μκ²λ μ΄λ €μΈ μ μλ€. κ·Έλ€μ μ’μ κ°λ° κΈ°μ (Good engineering)λ€μ κ·μΉλ€λ§ μκ³ μλ€.
λΉ λ₯΄κ² ν μ€νΈλ₯Ό λμκ°κ² νλ κ²μ λͺ¨λ μ°μ°ν¨(sins) μ λ€λ‘ λ―Έλ€λλ€. μμ£Ό μ κΉλμλ§. -
μ½λ μμ (Make it right)
μμ€ν μ λμκ°λ€(무μν μ°μ°ν¨μ λ€λ‘ λ―Έλ€λ μ±). μ΄μ μ¬λ°λ₯Έ κ°λ°λ‘ λμκ° μκ°μ΄λ€. λͺ¨λ μ€λ³΅λ μ½λλ₯Ό μμ κ³ ν μ€νΈκ° λμκ°κ² λ§λ λ€.
μ΅μ’
λͺ©νλ λμνλ κΉ¨λν μ½λ(μ§μ, clean code
)μ΄λ€. κΉ¨λν μ½λλ μ΄λ°κΈμ© μ΅κ³ μ κ°λ°μλ€λ μμ±νκΈ° νλ€κ³ , λκ°μ λλ€μμ κ°λ°μλ€μκ²μλ λλΆλΆ κ±°μ λΆκ°λ₯ν μΌμ΄λ€.
κ·Έλμ μ°λ¦¬λ μ½λλ₯Ό μκ² μͺΌκ°κ³ μ£ΌλκΆμ κ°μ ΈμΌ νλ€(μμ, divide and conquer
). λ¨Όμ μ°λ¦¬λ μ΄λ€ λ¬Έμ μ μμ΄μ 'λμκ°λ€'(that works) λΆν° ν΄κ²°ν κ²μ΄λ€. κ·Έ νμ 'κΉ¨λν μ½λ'λ₯Ό ν΄κ²°νλ€.
μ΄ κ³Όμ μ 'κΉ¨λν μ½λ'λ₯Ό λ¨Όμ ν΄κ²°ν ν λͺ¨λ κ²λ€μ κ²°μ λ λμμΈμ κ²°ν©νλ©΄μ 'λμκ°λ€'λ₯Ό ν΄κ²°νλ Architecture-driven developmentμ λ°λμ κ³Όμ μ΄λ€.
λΉ λ₯΄κ² ν μ€νΈλ₯Ό μ±κ³΅μν€λ ν
-
μμ¬λΌ (Fake it)
μ΅μ’ μ½λλ₯Ό κ°μ§κΈ° μ κΉμ§ μμ(constant)λ₯Ό λ°ννκ³ μ μ°¨ λ³μ(variable)λ€λ‘ λ³νμν¨λ€.
@Test public void testMultiplication() { Dollar five = Dollar(5); assertEquals(new Dollar(10), five.times(2)); } // Constant int times() { return 10; } // Variables private int amount; public Dollar(int amount) { this.amount = amount; } int times(int multiplier) { return amount *= multiplier; }
-
λͺ νν ꡬνμ μ¬μ©ν΄λΌ (Use Obvious Implementation)
μμ±νλ ν μ€νΈκ° λ¬Έμ μμ΄ μ§ν λκ³ , λ€μ implementationμ΄ λͺ νν κ²½μ°μλ λ°λ‘ ꡬννλ€. (λ¬Όλ‘ ν μ€νΈλ₯Ό κ³μ λ리며 λ΄κ² λͺ νν ꡬνμ΄ μ»΄ν¨ν°μκ²λ λͺ ννμ§ νμΈνλ©΄μ
βΊοΈ ) λ§μ½, ν μ€νΈκ° μ€ν¨νλ©΄ λ€μ Faking implementation μΌλ‘ λμκ°μ 리ν©ν λ§νλ€.@Test public void testArea() { Square s = new Square(2.0); assertEquals(4.0, s.area()); } private double side; public Square(double side) { this.side = side; } public double area() { return side * side; }
-
μΌκ°μΈ‘λ (Triangulation)
λ§μ½ λ κΈ°μ§κ΅ μ¬μ΄μ 거리λ₯Ό μκ³ μκ³ λΌλμ€ μ νΈκ° μ€λ λ°©ν₯μ μκ³ μλ€λ©΄, μ°λ¦¬λ μ νΈμ λ²μμ λ°©ν₯μ κ³μ°ν μ μλ μΆ©λΆν μ 보λ₯Ό κ°μ§κ³ μλ€λ λ»μ΄λ€. μ΄ κ³μ°μ μΌκ°μΈ‘λμ΄λΌκ³ νλ€.Picture: 'Basic Overview: Tracking Radio Signals'
λΉμ μ μΌλ‘ μ°λ¦¬λ λ κ° μ΄μμ μμκ° μμ κ²½μ°μλ§ μ½λλ₯Ό 보νΈν(generalize)μν¨λ€. κ·Έ μ ν μ€νΈμ μ½λ μ¬μ΄μ μ€λ³΅μ 무μνλ€. λλ²μ§Έ μμκ° λ 보νΈνλ ν΄κ²° λ°©λ²μ νμλ‘ ν λλ§ μ½λλ₯Ό 보νΈν μν¨λ€.
// Fake it, no generalizing public boolean equals(Object object) { return true; } @Test public void testEquality() { //First example assertTrue(new Dollar(5).equals(new Dollar(5))); } // Writing the second example.. @Test public void testEquality() { //First example assertTrue(new Dollar(5).equals(new Dollar(5))); //Second example assertFalse(new Dollar(5).equals(new Dollar(6))); } //Now we generalize the code public boolean equals(Object object) { Dollar dollar = (Dollar) object; return amount == dollar.amount; }