Registry test 코드 수정
이전에 작성했던 test코드를 재실행해봤는데 registry 관련 test코드에서 에러가 떴다.
기존에는 nickname을 저장하지 않고 진행했었는데
이후에 nickname이 필요하다고 판단하여 추가로 칼럼을 넣었는데(필수 입력값으로 설정)
test코드에서는 미처 수정을 하지 못했다.
그래서 registry test 코드에서 에러가 뜬 것이었고 수정을 했다.
에러를 보고 느낌으로 nickname이 필수값인데 null로 되어서 에러가 뜬걸로 알았지만
혹시나 하고 글을 찾아봤다.
not-null property references a null or transient value
→ nullable = false인 칼럼이 null로 DB에 들어간다면,
다음과 같이 not-null 칼럼이 null을 참조한다는 예외
출처 : Entity
Paging 테스트 코드
페이징 기능 구현을 완료해서 테스트 코드를 작성해보려고 했는데 자료가 생각보다 없었다.😭
내가 못찾는 걸까..?
그래서 그냥 맨땅에 헤딩으로 작성해봤다.
잘 돌아가기는 하는데 맞게 하는건지는 잘 모르겠다.
최근에 스프링이 재밌어지는 것도 방법을 잘 모르니깐 이것저것 찾아가다가 점점 알아가는게 생겨서 그런 것 같다.
* 전체 코드는 따로 작성했다. ( github나 이후에 작성한 글 보면 됨! )
github - [add] 페이징 test 코드 작성(h2활용) [#51]
test1. 기존 db로 확인하기(단순 출력)
db를 불러와서 curpage가 x 일때 보여지는 페이지가 맞게 보여지는지를 test하는 것으로 작성했다.
test코드를 작성할 때 print 코드는 아무 의미가 없는 코드이지만 확인차 초반에 작성했다.
curpage가 x일 때 보여지는 페이지가 되려면 1부터 총 페이지 수까지 랜덤으로 지정하여 띄워준다.
Random random = new Random();
int count = registryService.getBoards(1).getCount(); // 총 페이지 수
int randomCount = random.nextInt(count + 1); // 1~count 사이의 랜덤
int nextInt(int n) 0~n : 미만의 정수형 난수 반환
출처 : [JAVA] 자바_Random (랜덤 클래스)
randomCount를 이용해서 시작번호, 끝번호, 이전 버튼, 끝 버튼을 출력하면 끝이다.
참고로 randomCount와 현재 페이지가 맞는 지 확인하기 위해
변수 nowPage를 RegistryService의 PagingResult에 잠시 추가해서 test 해봤다.
System.out.println("randomCount = " + randomCount); // 7
System.out.println("registryService.getBoards(randomCount).getNowPage = " + registryService.getBoards(randomCount).getNowPage());
// 7
System.out.println("data = " + data);
System.out.println("start = " + start); // 6
System.out.println("end = " + end); // 10
System.out.println("prev = " + prev); // true
System.out.println("next = " + next); // true
test에 출력만 하는 것은 의미가 없으니 assertThat을 이용해서 추가로 작성해봤다.
눈으로 확인하기 위해서 print도 같이 작성했다.
System.out.println("randomCount = " + randomCount);
if (prev) {
Assertions.assertThat(start).isGreaterThan(5);
System.out.println("시작 페이지가 5보다 큽니다.");
}else{
Assertions.assertThat(start).isLessThan(6);
System.out.println("시작 페이지가 6보다 작습니다.");
}
if (next) {
Assertions.assertThat(count).isGreaterThan(5);
System.out.println("총 페이지가 5보다 큽니다.");
} else {
Assertions.assertThat(count).isLessThan(6);
System.out.println("총 페이지가 6보다 작습니다.");
}
현재 페이지가 8이므로 이전 버튼과 다음 버튼이 있어야 한다.
false로 나오면 제대로 나오는지 test 해보기 위해서
count와 현재페이지를 각각 4, 2로 고정해서 test 해봤다.
int count = 4; // 총페이지수
int randomCount =2 ; // 현재 페이지
실행해보니 에러가 떴다.
next가 true로 나오면서 에러가 뜬 것인데 확인해보니
실제 RegistryService에서 endPage를 startPage+4로 설정하고
만약에 총 페이지보다 endPage가 더 크면 총 페이지로 맞춰지게 설정하였으나
test 코드에서 총 페이지가 4로 적용이 안되고 db에 있는 총 페이지로 설정되면서 에러가 뜬 것이었다.
*db에 있는 총 페이지 수는 13
그래서 test 코드에 if문을 추가하여 재실행했다.
if(end >= count) {
end = count;
next = false;
}
정상적으로 실행되었다.
그리고 인프런 김영한님 강의에서
import static org.assertj.core.api.Assertions.*;
위 코드로 바꿔주는 것이 좋다고 하신게 기억나서 아래와 같이 변경했다.
참고 : 2021.12.21 - [T.S.L/스프링 입문] - 100일차(회원 리포지토리 테스트 케이스 작성)
if (prev) {
assertThat(start).isGreaterThan(5);
System.out.println("시작 페이지가 5보다 큽니다.");
}else{
assertThat(start).isLessThan(6);
System.out.println("시작 페이지가 6보다 작습니다.");
}
if (next) {
assertThat(count).isGreaterThan(5);
System.out.println("총 페이지가 5보다 큽니다.");
} else {
assertThat(count).isLessThan(6);
System.out.println("총 페이지가 6보다 작습니다.");
}
* isEqualTo말고 다른게 있는지 assertThat(count). 찍고 나오는 메소드를 살펴보다가
더 큰 값, 더 작은 값을 비교하는 isGreaterThan(), isLessThan()을 발견해서 쓰게 되었는데
다른 메소드는 뭐가 있는지 찾아보다가 정리된 글을 발견했다.
참고하면 좋을 듯 ! >> AssertJ 소개
test 2. H2 로 TEST 하기
기존 MySql로 진행하게 되면 데이터가 추가 삭제 되면서 id값이 비는 곳도 있었고
데이터를 어느정도 넣느냐에 따라 test 해보고 싶었다.
그렇게 구글링을 해보니 기존 application은 mysql로 진행하고
test만 h2로 진행할 수도 있다는 것을 알게 되었다.
방법은 간단했다.
test 용 application.properties만 만들면 되었다.
그리고 test 코드에 아래 코드를 추가하면 끝난다.
@TestPropertySource(locations = "/application.properties")
출처 : 프로퍼티 파일을 활용해 쉽게 실행 환경 분리하기
@TestPropertySource(locations = "/application.properties")
@SpringBootTest
public class PagingTest {
@Autowired
RegistryRepository registryRepository;
@Autowired
RegistryService registryService;
@Test
public void paging2() {
}
실행을 하니 에러가 떴다.
javax.websocket.server.ServerContainer not available
원인은 아래와 같다.
SpringBootTest가 시작할 때 서버를 시작하지 않기 때문에
WebSocket은 당연히 오류를 보고할 수 있다.
이럴 때 웹 환경을 테스트할 수 있도록 옵션을 추가해야 한다.
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
나도 위 코드를 복붙했으나 @RunWith는 JUnit4 설치얘기가 나와서
JUnuit5로 진행하면 그냥 넘어가도 되는 것 같아 아래 코드인 @SpringBootTest에 옵션만 추가했다.
출처 : SpringBoot 시작 테스트 타임즈 오류 (javax.websocket.server.ServerContainer not available)
@TestPropertySource(locations = "/application.properties")
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class PagingTest {
@Autowired
RegistryRepository registryRepository;
@Autowired
RegistryService registryService;
@Test
public void paging2() {
}
하나의 데이터만 작성하고 실행을 해봤다. (페이징에 띄우는 게시글은 1개)
@Test
public void paging() {
Registry registry = new Registry();
registry.setNickname("nickName");
registry.setTitle("title");
registry.setMain("main");
registryRepository.save(registry);
int curPage = 1;
Pageable pageable = PageRequest.of(curPage - 1, 1);
Page<Registry> boards = registryRepository.findAllByOrderByCreatedAtDesc(pageable);
System.out.println("전체 데이터 = " + registryService.getBoards(1).getData());
System.out.println("시작 페이지 = " + registryService.getBoards(1).getStartPage());
System.out.println("끝 페이지 = " + registryService.getBoards(1).getEndPage());
System.out.println("전체 페이지 수 = " + boards.getTotalPages());
Assertions.assertThat(boards.getNumber() + 1).isEqualTo(curPage);
Assertions.assertThat(registryService.getBoards(1).getStartPage()).isEqualTo(1);
Assertions.assertThat(registryService.getBoards(1).getEndPage()).isEqualTo(1);
Assertions.assertThat(registryService.getBoards(1).isPrev()).isEqualTo(false);
Assertions.assertThat(registryService.getBoards(1).isNext()).isEqualTo(false);
}
* 참고 : 로그 다르게 띄우기 → [ Github ] JPA 심화 (Github에서 spring repository에 들어가면 있음)
이번엔 데이터를 5개 추가만 하고 실행했다. (에러가 떠야함)
5개의 하단 버튼이 있고 1페이지마다 1개씩 글이 저장되게 size를 1로 설정
6개의 데이터를 저장함 → 6개의 페이지
따라서 next 버튼이 true가 되야한다. (데이터만 추가하고 나머진 수정안해서 에러가 떠야함)
그런데 에러가 뜨지 않고 통과가 되었다.
다음 버튼 검증에서 에러가 떠야 했다. (전체 페이지 수는 6인데 현재 페이지는 1이므로)
확인차 RegistryService에 print로 endPage와 getTotalPage()를 출력했다.
RegistryService에 띄워지는 게시글은 6개, test 용으로는 1개 였으나
다음 버튼에 적용되는 코드가 실제 로직 size인 6개로 적용되면서 실행되어
전체 페이지수는 1, endPage는 5로 띄워지면서 다음 버튼이 false가 되었다.
그래서 RegistryService가 잘 동작하는지 확인하기 위해서 test를 2개 작성하기로 했다.
1. 위에서 작성한 코드에서 size를 5로 수정해서 실제 코드가 잘 동작하는지 test
@Test
@DisplayName("실제 로직이 잘 동작하는지 test")
public void paging() {
Registry registry = registryRepository.save(new Registry(1L,"HI","TEST","TEST"));
Registry registry1 = registryRepository.save(new Registry(2L,"HI","TEST","TEST"));
Registry registry2 = registryRepository.save(new Registry(3L,"HI","TEST","TEST"));
Registry registry3 = registryRepository.save(new Registry(4L,"HI","TEST","TEST"));
Registry registry4 = registryRepository.save(new Registry(5L,"HI","TEST","TEST"));
Registry registry5 = registryRepository.save(new Registry(6L,"HI","TEST","TEST"));
int curPage = 1;
Pageable pageable = PageRequest.of(curPage - 1, 5);
Page<Registry> boards = registryRepository.findAllByOrderByCreatedAtDesc(pageable);
Assertions.assertThat(boards.getNumber() + 1).isEqualTo(curPage);
Assertions.assertThat(registryService.getBoards(1).getStartPage()).isEqualTo(1);
Assertions.assertThat(registryService.getBoards(1).getEndPage()).isEqualTo(1);
Assertions.assertThat(registryService.getBoards(1).isPrev()).isEqualTo(false);
Assertions.assertThat(registryService.getBoards(1).isNext()).isEqualTo(false);
}
2. 변수 계산을 잘 작성한게 맞는지 size를 바꿔도 실행이 잘 되는지 test
@Test
@DisplayName("size를 바꿔도 실행이 잘 되는지 test")
public void paging2() {
int curPage = 1;
int startPage;
int endPage;
boolean prev;
boolean next;
int nowPage;
int displayPageNum=5;
Registry registry = registryRepository.save(new Registry(1L,"HI","TEST","TEST"));
Registry registry1 = registryRepository.save(new Registry(2L,"HI","TEST","TEST"));
Registry registry2 = registryRepository.save(new Registry(3L,"HI","TEST","TEST"));
Registry registry3 = registryRepository.save(new Registry(4L,"HI","TEST","TEST"));
Registry registry4 = registryRepository.save(new Registry(5L,"HI","TEST","TEST"));
Registry registry5 = registryRepository.save(new Registry(6L,"HI","TEST","TEST"));
Pageable pageable = PageRequest.of(curPage-1, 1);
Page<Registry> boards = registryRepository.findAllByOrderByCreatedAtDesc(pageable);// 생성 날짜 순으로 보여주기
nowPage = (boards.getNumber()+1);
startPage = ( ((int) Math.ceil(nowPage/ (double) displayPageNum )) -1) *5 +1;
endPage = startPage+4;
prev = startPage == 1 ? false : true;
next = endPage < boards.getTotalPages()? true : false;
if(endPage >= boards.getTotalPages()) {
endPage = boards.getTotalPages();
next = false;
}
Assertions.assertThat(startPage).isEqualTo(1);
Assertions.assertThat(endPage).isEqualTo(5);
Assertions.assertThat(prev).isEqualTo(false);
Assertions.assertThat(next).isEqualTo(true);
}
test 코드를 작성하면서 내가 로직을 잘못 작성한 것인지 체크 할 수 있었는데
이래서 test 코드를 작성하는 건가 싶었다.
오늘의 결론! test코드는 중요하다 😲
근데 이렇게 하는게 맞는건가..?
'TIL' 카테고리의 다른 글
257일차(모험 166일차) - 분석 (0) | 2022.05.30 |
---|---|
254일차(모험 163일차) - 프로젝트 (0) | 2022.05.27 |
252일차(모험 161일차) - 스프링 페이징 정리, MySQL DB 추가하기 (0) | 2022.05.25 |
251일차(모험 160일차) - 페이징 코드 추가 완료 (0) | 2022.05.24 |
250일차(모험 159일차) - 배달 팁 예측하기, 페이징 (0) | 2022.05.23 |