@See Also)
테스트스프링이 개발자에게 제공하는 가장 중요한 가치는
객체지향
과 테스트
테스트란
예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인해서 만든 코드를 화신할 수 있게 해주는 작업 - 토비
테스트란 개발자가 마음 편하게 잠자리에 들 수 있게 해주는 것 - 켄트 벡
테스트의 가치와 장점
- 테스트를 통해 코드의 설계나 결함을 확인 할 수 있다.
- 리팩토링에 대한 두려움이 없어진다.
- 테스트는 그 자체로 코드에 대한 명세가 된다.
테스트의 활용 전략
Unit Test - 마틴 파울러테스트 주도 개발 - Test-Driven Development, TDD
테스트 주도 개발의 세 가지 단순한 규칙
- 해당 코드가 없어서 실패하는 테스트 코드를 쓰기 전에 제품 코드를 먼저 쓰면 안 된다.
- 테스트 코드를 쓸 때 실패하도록 만들기 위해 필요한 것 보다 더 많이 쓰면 안 된다. 컴파일 실패도 실패로 간주한다.
- 실패하는 테스트를 통과시키기 위해 필요한 코드보다 더 많은 제품 코드를 쓰면 안 된다.
테스트 주도 개발의 좋은 점
- 작업하던 코드는 아무리 길어도 1분 전까지는 실행 가능했고, 테스트를 모두 통과한다.
디버깅이 필요없다. 디버깅은 선망할 만한 기술이 아니다.
- 테스트는 전체 시스템의 코드 예제가 된다.
- 제품 코드 → 테스트/ 테스트 → 제품 코드 : 전자는 재미없다. 후자는 재미 있다.
- 테스트 코드는 개발자의 설계에 대한 고민을 유도 하고 더 잘 분리된 설계로 이끈다.
- 테스트 코드는 과감한 리팩토링을 위한 용기를 준다.
Note
- 테스트 코드 자체가 이미 자신에 대한 테스트라고 생각할 수 있다.
- 테스트 결과가 일정하게 유지된다면 얼마든지 리팩토링을 해도 좋다.
Junit5 의 실행 스텝
아주 오래된 책이라 junit4 를 기준으로 설명을 하고 있으며 내용도 어렵지 않은것 같아서 생략하려고 했는데 Junit5의 테스트 수행 사이클은 한번 정리하는 것이 좋을것 같아 181쪽에 나오는 7 단계의 junit 실행 스텝을 junit5에 맞게 조금 더 풀어서 찾아보고 알고 사용해본 기능내에서 정리했습니다.


하나의 테스트 클래스를 실행하는 과정
- Container (Test Class)에서 Test(Test Method)를 모두 찾는다.
- 테스트 인스턴스의 라이프 사이클을 확인한다.
- @TestInstance(Lifecycle.PER_CLASS)
- @TestInstance(Lifecycle.PER_METHOD) - default
- 테스트 클래스의 오브젝트를 하나 만든다.
- @BeforeAll 메서드가 있다면 실행한다.
- @BeforeEach 메서드가 있다면 실행한다.
- 테스트 실행 순서 전략을 통해 실행할 테스트를 결정한다.
- 테스트 메서드를 하나 호출하고 테스트 결과를 저장한다.
- @AfterEach 메서드가 있다면 실행한다.
- 나머지 테스트 메서드에 대해
- 테스트 인스턴스 라이프 사이클이 PER_CLASS라면 3~8을 반복한다.
- @BeforeAll, @AfterAll 메서드의 static 여부에 따라 실행 순서가 달라 질 수 있다.
- 테스트 인스턴스 라이프 사이클이 PER_METHOD라면 5~8을 반복한다.
- @AfterAll 메서드가 있다면 실행한다.
- 모든 테스트의 결과를 종합해서 돌려준다.
테스트와 스프링의 관계
Junit5에서는 @SpringBootTest 어노테이션으로 간편하게 spring container를 사용할 수 있다.
학습 테스트로 배우는 스프링
- 학습 테스트에 관한 내용은 자바지기 박재성님의 아래 영상을 참고하자