반응형
테스트 코드의 필요성
- 서버를 실행해서 직접 테스트 해보지 않아도 되기 때문에 시간 단축 가능
- 테스트 코드를 통해 어떤 값이 주어졌을 때(given), 어떤 실행을 하면(when), 어떤 결과가 나와야 되는지(then)를 확인할 수 있기 때문에 코드를 파악하는데도 도움을 줄 수 있음
- given - when - then
- 수정사항 발생 시 기존의 코드에 영향을 주는지 테스트 코드를 통해 파악할 수 있음
- 정확한 테스트 코드를 작성해 놓으면 실제 코드를 제대로 작성했는지 확인할 수 있음
- 테스트 주도 개발 (TDD)
- 이 외에도 여러가지 장점들이 있음
테스트 코드 예제
- CRUD 게시판 만들기 예제를 테스트 해 볼 수 있는 테스트 코드 작성해 보는 예제
- ContentService 기능
- 글 작성
- 글 보기
- 글 수정
- 글 삭제
- 글 전체 불러오기
- 테스트를 위해 ContentService에 전체 글 개수를 조회하는 기능과 전체 글 삭제하는 기능 추가
- ContentServiceTest 설계
- 글 쓰기 테스트
- Content 생성 후 저장
- 전체 글 개수가 1개인지 확인
- 글 보기(불러오기) 테스트
- Content 생성 후 저장 => id가 1번으로 저장될 것임
- 1번 글 조회 후 Content와 제목, 작성자, 비밀번호, 글 내용이 일치하는지 확인
- 글 수정 테스트
- Content 생성 후 저장
- 비밀번호를 틀리게 하고 수정 시도
- 글 내용이 그대로여야 함
- 비밀번호를 맞게 하고 새로운 내용으로 글 수정
- 1번 글 조회 후 글 내용(texts)가 수정한 내용과 같는지 확인
- 전체 글 조회 테스트
- 글 3개 등록
- 전체 글 불러온 리스트의 크기가 3인지 확인
- 글 삭제 테스트
- Content 생성 후 저장
- 1번 글 삭제
- 전체 글 개수가 0인지 확인
- 다음부터는 저장, 수정등을 할 때 id나 객체 등을 return 하면 Test 할 때 더 좋을 것 같음
테스트 코드 생성 방법 ( IntelliJ/MAC )
- ContentService 클래스명 위에 커서를 놓고 단축키를 입력해 Test Code 생성
- 단축키 1 : Shift(⇧) + Command(⌘) + T
- 단축키 2 : Command(⌘) + N -> Test
- JUnit5 선택 후 생성
- 위와 같이 main쪽이 아닌 test쪽에 디렉토리 구조와 파일명을 자동으로 생성해줌
설계한 테스트 코드 구현
- @SpringBootTest : @Autowired 사용 가능하게 해줌
- @Autowired : ContentService를 주입받음
- @BeforeEach : 각각의 테스트 시작 전 실행
- @AfterEach : 각각의 테스트 종료 후 실행
- @Test : 테스트임을 나타냄
- @DisplayName : 화면에 보일 테스트명 지정
- Assertions는 org.assertj.core.api 패키지의 Assertions 사용
- Assertions.assertThat(실행값).isEqualTo(기대값); 이런 식으로 테스트 가능
- Assertions를 static-import 해주면 assertThat만 써줘도 됨
import static org.assertj.core.api.Assertions.assertThat;
@SpringBootTest
class ContentServiceTest {
@Autowired
ContentService contentService;
Content content = null;
@BeforeEach
void beforeEach() {
// 테스트를 시작 할 때 마다 content를 새로 생성
// id와 updateDate는 자동 생성
content = new Content();
content.setTitle("글 제목");
content.setWriter("작성자1");
content.setPassword("1234");
content.setTexts("글 내용");
}
@AfterEach
void afterEach() {
// 테스트가 끝날 때 마다 글 전체 삭제
contentService.deleteAllContent();
}
@Test
@DisplayName("1. 글 쓰기 테스트")
void addTest() {
contentService.writeContent(content);
assertThat(contentService.getContentCount()).isEqualTo(1);
}
@Test
@DisplayName("2. 글 보기(불러오기) 테스트")
void getTest() {
contentService.writeContent(content);
Content findContent = contentService.getContent(1);
assertThat(findContent.getTitle()).isEqualTo(content.getTitle());
assertThat(findContent.getWriter()).isEqualTo(content.getWriter());
assertThat(findContent.getPassword()).isEqualTo(content.getPassword());
assertThat(findContent.getTexts()).isEqualTo(content.getTexts());
}
@Test
@DisplayName("3. 글 수정 테스트")
void editTest() {
content.setTexts("원래 내용");
contentService.writeContent(content);
contentService.editContent(1, "수정 내용", "1");
assertThat(contentService.getContent(1).getTexts()).isEqualTo("원래 내용");
contentService.editContent(1, "수정 내용", "1234");
assertThat(contentService.getContent(1).getTexts()).isEqualTo("수정 내용");
}
@Test
@DisplayName("4. 전체 글 조회 테스트")
void getAllTest() {
// given
contentService.writeContent(new Content());
contentService.writeContent(new Content());
contentService.writeContent(new Content());
// when
List<Content> contents = contentService.getAllContents();
// then
assertThat(contents.size()).isEqualTo(3);
}
@Test
@DisplayName("5. 글 삭제 테스트")
void deleteTest() {
contentService.writeContent(content);
assertThat(contentService.getContentCount()).isEqualTo(1);
contentService.deleteContent(1, "");
assertThat(contentService.getContentCount()).isEqualTo(1);
contentService.deleteContent(1, "1234");
assertThat(contentService.getContentCount()).isEqualTo(0);
}
}
결과
- ContentServiceTest 클래스를 실행시키면 테스트가 진행됨
- Test를 하나씩 진행할 수도 있음
- 테스트 통과 시
- 테스트 실패 시 (기대값과 실행값을 확인할 수도 있음)
반응형
'Spring Boot > 문법 정리' 카테고리의 다른 글
[Spring Boot] Thymeleaf 기능 정리 (0) | 2022.06.04 |
---|---|
[Spring Boot] DI, @Autowired, @RequiredArgsConstructor (0) | 2022.05.17 |
[Spring Boot] @RestController, lombok (0) | 2022.04.29 |
[Spring Boot] MVC 정의 및 예제 (0) | 2022.04.26 |
[Spring Boot] 정적 페이지 생성 예제 (0) | 2022.04.26 |