diff --git a/.gitignore b/.gitignore index 090a1f0..c61597b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,28 @@ +.gradle +/build/ +!gradle/wrapper/gradle-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### .idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ + +### ETC ### .DS_Store diff --git a/README.md b/README.md index fd5dea0..38b133d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,12 @@ # TDD Test-Driven Development + +## 주기 +1. 작은 테스트를 하나 추가한다. +2. 모든 테스트를 실행해서 테스트가 실패하는 것을 확인한다. +3. 조금 수정한다. +4. 모든 테스트를 실행해서 테스트가 성공하는 것을 확인한다. +5. 중복을 제거하기 위해 리팩토링을 한다. + +## ETC +- [의존성과 중복](./etc/dependency_and_duplication.md) diff --git a/etc/dependency_and_duplication.md b/etc/dependency_and_duplication.md new file mode 100644 index 0000000..c9357ff --- /dev/null +++ b/etc/dependency_and_duplication.md @@ -0,0 +1,15 @@ +# 의존성과 중복 + + 스티브 프리만(Steve Freeman)은 테스트와 코드 간의 문제는 중복이 아님을 지적한 바 있다(중복에 대해서는 아직 이야기하지 않았지만, 이 여담이 끝나는 대로 언급할 생각이다). 문제는 테스트와 코드 사이에 존재하는 의존성이다. 즉 코드나 테스트 중 한쪽을 수정하면 반드시 다른 한쪽도 수정해야만 한다는 것이다. 우리의 목표는 코드를 바꾸지 않으면서도 뭔가 의미 있는 테스트를 하나 더 작성하는 것인데, 현재의 구현으로는 불가능하다.
+ +### 의존성(Dependency) + + 의존성은 소프트웨어 개발의 모든 부분에서 핵심적인 문제다. 만약 특정 데이터베이스 벤더가 제공하는 세세한 기능들을 코드 여기저기에서 사용하는 상황에서 데이터베이스를 다른 벤더의 제품으로 변경하고자 한다면 코드가 해당 벤더에 대해 의존성을 갖는다는 사실을 알게 될 것이다. 코드를 변경하지 않고는 벤더를 바꿀 수 없다. + +### 중복(Duplication) + + 의존성이 문제 그 자체라면 중복은 문제의 징후다. 중복의 가장 흔한 예는 로직의 중복이다. 중복된 로직이란 동일한 문장이 코드의 여러 장소에 나타나는 것을 의미한다. 중복된 로직을 하나로 끄집어내는 일엔 객체를 이용하는 것이 최고다. + +### ... + + 문제 자체는 남겨둔 채로 징후만을 제거하면 다른 어딘가에서 최악의 형태로 문제가 드러나곤 하는 현실 세계의 일반적인 양상과는 달리, 프로그램에서는 중복만 제거해 주면 의존성도 제거된다. 이게 바로 TDD의 두 번째 규칙이 존재하는 이유다. 다음 테스트로 진행하기 전에 중복을 제거함으로써, 오직 한 가지(one and only one)의 코드 수정을 통해 다음 테스트도 통과되게 만들 가능성을 최대화하는 것이다. diff --git a/test_driven_development_by_example/src/main/java/com/tdd/test/money/Dollar.java b/test_driven_development_by_example/src/main/java/com/tdd/test/money/Dollar.java new file mode 100644 index 0000000..2e7b9e7 --- /dev/null +++ b/test_driven_development_by_example/src/main/java/com/tdd/test/money/Dollar.java @@ -0,0 +1,14 @@ +package com.tdd.test.money; + +public class Dollar { + + public int amount; + + public Dollar(int amount) { + this.amount = amount; + } + + public void times(int multipler) { + amount *= multipler; + } +} diff --git a/test_driven_development_by_example/src/test/java/com/tdd/test/money/MoneyTests.java b/test_driven_development_by_example/src/test/java/com/tdd/test/money/MoneyTests.java new file mode 100644 index 0000000..e8eb0bd --- /dev/null +++ b/test_driven_development_by_example/src/test/java/com/tdd/test/money/MoneyTests.java @@ -0,0 +1,15 @@ +package com.tdd.test.money; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class MoneyTests { + + @Test + public void testMultiplication() { + Dollar five = new Dollar(5); + five.times(2); + assertEquals(10, five.amount); + } +} diff --git a/test_driven_development_by_example/todo.md b/test_driven_development_by_example/todo.md index 26225cb..9690e4e 100644 --- a/test_driven_development_by_example/todo.md +++ b/test_driven_development_by_example/todo.md @@ -25,7 +25,10 @@ |CHF|USD|1.5| ``` $5 + 10CHF = $10(환율이 2:1일 경우) -$5 x 2 = $10 +~~$5 x 2 = $10~~ +amount를 private으로 만들기 +Dollar 부작용(side effect)? +Money 반올림? ``` - [ ] 통화가 다른 두 금액을 더해서 주어진 환율에 맞게 변한 금액을 결과로 얻을 수 있어야 한다.