테스트를 먼저하고 구현한다.
테스트를 먼저한다는 것은 기능이 올바르게 동작하는지 검증하는 테스트 코드를 작성한다는 것
가장 쉽거나 예외적인 것을 첫번째 테스트로 선택한다.
레드-그린-리팩터
테스트 코드 실패 -> 코드 구현해 테스트 통과 -> 리펙토링
사용자에게 제공할 기능을 구현하려면 기능을 크게 입력과 결과로 나눠 생각할 수 있다.
ex) 로그인
보통 메서드의 파라미터로 전달
여러 형식으로 정의된다.
ex) return 값, 익셉션 등
또한 변경도 포함된다.
ex) 회원가입 기능은 실행 결과로 DB에 회원정보를 추가한다.
이 것은 시스템의 상태를 변경하는 것
이런 변경은 리턴값으로 결과를 알 수 없으므로 테스트 대상 실행 후
변경 대상에 접근하여 결과를 확인해야한다.
설계는 기능 명세에서부터 시작한다.
문서화를 통해 기능 명세를 구체화하고 그 과정에서 입력과 결과를 정의하고 이에 따라 코드를 작성한다.
코드에 반영하는 과정에서 기능 이름,파라미터,리턴 타입 등이 결정된다.
TDD는 테스트 부터 시작
테스트코드를 만들기 위해서는 다음의 두가지를 할 수 있어야한다.
기능을 실행하기 위해선 메서드 혹은 클래스가 우선적으로 정의되어 있어야한다.
책의 암호 강도 측정과 만료일 계산 예제에선 테스트 코드를 작성할 때 다음 4가지를 고려했다
이름을 올바르게 결정하는 것에 대한 시간투자를 아끼지말자
TDD는 테스트를 통과할 만큼만 코드를 작성한다.
복잡한 상황이나 예외적인 상황에 대해 구체적인 경우를 생각해내어 테스트에 반영할 필요가 있다.
크게 3가지로 구성되어 있다.
테스트 클래스의 이름은 구분하기 쉽게 Test를 접미사로 붙인다.
테스트를 실행할 메서드에는 @Test 애노테이션을 붙이고 private이면 안된다.
assert 메서드는 실패하면 다음 코드를 실행하지 않고 바로 익셉션을 발생한다.
assertEquals(expected,actual) : 값이 같은지 검사
assertNotEquals(unexpected,actual)
assertSame(Object expected,Object actual) : 동일 객체인지 검사
assertNotSame(Object unexpected,Object actual)
assertTrue(boolean condition)
assertFalse(boolean condition)
asertNull(Object actual)
assertNotNull(Object actual)
fail() : 테스트를 실패 처리한다.
assertThrows(Class<t'> expectedType,Executable executable)
=>executable을 실행한 결과로 지정한 타입의 익셉션이 발생하는지 검사한다.
발생한 익셉션객체를 리턴한다. 따라서 발생한 익셉션에 대한 추가 검증이 필요한 경우 사용하면된다.
assertAll(): 모든 검증을 실행하고 그 중에 실패한 것이 있는지 확인할 때 사용한다.
@Test 메서드를 실행할 때마다 위의 사이클과 같이 실행된다.
=> 그렇지 않을 경우 테스트 코드 유지보수를 어렵게 만든다.
자바는 메서드 이름에 공백 or 특수 문자를 사용할 수 없기 때문에 메서드 이름만으로
테스트 내용을 설명하기 부족할 수 있다.
상황, 실행, 결과 확인
상황이 주어지고, 해당 상황에서 기능을 실행하고, 결과를 확인하는 기본 골격
(given when then)
테스트 대상이 아닌 외부 요인은 테스트 코드에서 다루 힘들다.
테스트를 작성하다 보면 외부 요인이 필요한 경우가 있다
=>이렇게 테스트 대상이 외부 요인에 의존하면 테스트 작성, 실행이 어렵다.
8. 테스트 가능한 설계
9.테스트 범위와 종류
10. 테스트 코드와 유지보수
11 마치며