TDD(Test Driven Development)
연결된 노트와 함께 읽기
TDD(Test Driven Development)
-
TDD(Test Driven Development) 테스트 주도 개발이라고 부른다.
-
프로덕션 코드보다 테스트 코드를 먼저 작성하는 개발 방법이다.
-
TFD(Test First Development) + 리팩토링이다.
-
기능 동작을 검증한다.(메서드(Method) 단위이다.)
테스트 코드를 작성하는 이유
- 문서화 역할을 한다.
- 코드에 결함을 발견하기 위함이다.
- 리팩토링 시 안정성을 확보한다.
- 테스트 하기 쉬운 코드를 작성하다 보면 더 낮은 결합도를 가진 설계를 얻을 수 있다.
- 특히 경계조건에 대해서 테스트 코드를 작성해야 한다.
- 테스트 코드 가독성을 높여주는 라이브러리이다.
- 자바 단위 테스팅 프레임워크이다.(기본적으로 dependency가 걸려있다.)
AssertJ을 더 사용해야되는 이유
- 그 다음 테스트 코드에 static import를 통해 가져와서 사용하면 된다.
- 확실히 JUnit보다는 AssertJ가 더 직관적이다.
- 심지어 AssertJ는 as 메서드를 통해 에러 메시지까지 정의가 가능하다.
Collection Test
- Student라는 Class를 타입으로 가지는 Collection을 테스트하는 코드를 JUnit, AssertJ 둘다 살펴보자.
JUnit
AssertJ
- 다음은 AssertJ를 사용한 테스트 코드를 살펴보자.
testImplementation 'org.assertj:assertj-core:3.13.2'
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
public class JUnitTest {
@Test
public void testEqual() {
Object object1 = new Object();
Object object2 = object1;
Assertions.assertEquals(object1,object2);
}
}
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
public class AssertJTest {
@Test
public void testEqual() {
Object object1 = new Object();
Object object2 = object1;
assertThat(object1).isEqualTo(object2);
}
}
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
public class AssertJTest {
@Test
public void testEqual() {
Object object1 = new Object();
Object object2 = object1;
Object object3 = new Object();
// failing assertion, with custom error message
assertThat(object1).as("Checking whether objects are the same").isEqualTo(object3);
}
}
class Student {
private String name;
private int age;
private int level;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class StudentTest {
@Test
public void testStudentArrayList() {
ArrayList<Student> characters = new ArrayList<>();
Student frodo = new Student("Frodo", 32);
Student aragorn = new Student("Aragorn", 62);
Student sam = new Student("Sam", 36);
characters.add(frodo);
characters.add(aragorn);
characters.add(sam);
List<Student> expected = new ArrayList<>();
expected.add(frodo);
expected.add(aragorn);
List<Student> filteredList = characters.stream()
.filter((character) -> character.name.contains("o"))
.collect(Collectors.toList());
Assertions.assertEquals(expected,filteredList);
}
}
import org.junit.jupiter.api.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import static org.assertj.core.api.Assertions.assertThat;
public class StudentTest {
@Test
public void testStudentArrayList() {
ArrayList<Student> characters = new ArrayList<>();
Student frodo = new Student("Frodo", 32);
Student aragorn = new Student("Aragorn", 62);
Student sam = new Student("Sam", 36);
characters.add(frodo);
characters.add(aragorn);
characters.add(sam);
assertThat(characters)
.filteredOn(character -> character.name.contains("o"))
.containsOnly(aragorn, frodo);
}
}