1. 테스트의 목적
- 테스트는 특정한 기능이 잘 수행되고 있는지 검사하는 과정이다.
- 테스트 코드를 통해 테스트를 자동화할 수 있다. 일일이 서버를 구동해서 테스트하고 싶은 페이지에 접속해서 테스트케이스를 직접 입력할 필요 없이 능동적인 테스트를 수행하지 않아도 된다.
- 어제 팀장 강의에서는 mockMvc와 JUnit에 대해 설명함
2. mockMvc
- mockMvc는 MVC에 대한 테스트에 사용되는 객체다.
- URL 요청과 응답에 대한 테스트, 컨트롤러 테스트라고 이해해도 무방하다.
- 팀장이 mockMvc에 대해 정리한 포스팅을 참고하며 test/java/com/example/demo/SampleTests.java의 테스트 메소드들과 mockMvc에서 사용되는 메소드들을 이해하는 시간을 가졌다.
https://kimcoder.tistory.com/567
1) Home_테스트()
@Test
public void Home_테스트() throws Exception {
mockMvc.perform(get("/home")) // "/home" 요청을 받는 핸들러가 있음
.andExpect(status().isOk())
.andDo(print());
}
- "/home" 요청을 받는 핸들러(HomeController의 home())가 있기 때문에 HTTP 응답 상태는 Ok(200)가 나올 것을 예상하는 테스트 코드다.
- andExpect()의 인자에 작성된 조건이 테스트의 통과 여부를 결정하는 조건이다.
- andDo(print())는 테스트의 요청/응답 결과를 출력하는 메소드다.
2) 존재하지_않는_페이지_테스트()
@Test
public void 존재하지_않는_페이지_테스트() throws Exception {
mockMvc.perform(get("/fakepage")) // "/fakepage" 요청을 받는 핸들러가 없음
.andExpect(status().isNotFound())
.andDo(print());
}
- "/fakepage" 요청을 받는 핸들러가 없기 때문에 HTTP 응답 상태는 Not Found(404)가 나올 것을 예상하는 테스트 코드다.
3) Unit1_테스트()
@Test
public void Unit1_테스트() throws Exception {
int unit=1;
int question1 = 5;
int question2 = 2;
String question3 = "SELECT NAME, POSITION, SALARY FROM EMPLOYEE";
String body = "{\"unit\":"+unit+", \"question1\": "+question1+", \"question2\": "+question2+", \"question3\": \""+question3+"\"}";
mockMvc.perform(post("/test/grading")
.content(body)
.contentType(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andExpect(jsonPath("$.questionList[0].isCorrect").value(true))
.andExpect(jsonPath("$.questionList[1].isCorrect").value(true))
.andExpect(jsonPath("$.questionList[2].isCorrect").value(true))
.andDo(print());
}
- Unit1 테스트에 대한 답이 다음과 같을 것을 예상하는 테스트 코드다.
- Question 1 : 5
- Question 2 : 2
- Question 3 : "SELECT NAME, POSITION, SALARY FROM EMPLOYEE"
- 주의할 점이 있는데 우리는 테스트 답안지를 완전히 form으로 제출한게 아니다. 제출 버튼을 눌렀을 때 test.js에서 submit 이벤트를 가로채서 Ajax로 답안지를 전송했다. 즉, 우리는 답안지를 요청 파라미터로 전송한 것이 아니고 다음과 같은 HTTP request body를 전송했다.
{"unit":1, "question1":5, "question2":2, "question3":"SELECT NAME, POSITION, SALARY FROM EMPLOYEE"}
아래 코드는 test.js에 있는 코드다. form에 작성된 답안지를 위와 같은 json 포맷으로 변환해준 것이다.
var serializedFormData = $('#answer-form').serializeObject();
결과적으로 이 body는 GradingController.gradingUnit()의 @RequestBody Map<String, Object> userAnswer로 전달된다.
지금까지 설명한 이유가 param()이 아닌 content()를 사용한 이유다. 다시 한번 강조하지만, param()은 요청 파라미터를 부여하는 메소드고, content()는 HTTP request body 값을 부여하는 메소드다.
- jsonpath() 메소드로 각 문제의 정답 여부(isCorrect)를 검사했다. json path가 깊어질 때마다 .을 추가하면 되고, json 배열의 경우 [인덱스]를 표기하면 된다.
3. JUnit
- MVC 테스트 외에 객체 비교 또는 값 비교 등의 테스트는 JUnit으로 진행했다. JUnit에 대해 정리한 포스팅도 첨부했다.
https://kimcoder.tistory.com/418
1) CovidVaccinationCenterServiceTest() 테스트
public void CovidVaccinationCenterServiceTest() throws Exception {
List<CovidVaccinationCenter> covidVaccinationCenterList = covidVaccinationCenterService.getAllData(1, 100);
assertEquals(covidVaccinationCenterList.size(), 100);
}
- 조회한 CovidVaccinationCenter가 총 100건일 것을 예상하는 테스트 코드다.
- assertEquals() 외의 JUnit Assert 메소드들은 위에 첨부한 포스팅을 참고하자.
2) NullPointerExceptionTest() 테스트
@Test(expected=NullPointerException.class)
public void NullPointerExceptionTest() throws Exception {
String str = null;
int len = str.length();
}
- 테스트 메소드가 NullPointerException 예외를 리턴할 것을 예상하는 테스트 코드다. 테스트 메소드가 NullPointerException 예외를 리턴하면 테스트가 성공한다.
- null 값을 참조했기 때문에 NullPointerException 예외가 발생한다. 즉, 테스트는 성공한다.
4. 마지막 임무
- 지금까지 진행한 프로젝트에서 테스트해보고 싶은 부분을 선정하여 3개의 테스트 메소드를 작성합니다.
- test/java/com/example/demo에, 즉 SampleTests.java와 동일한 경로에 [본인 이름+Tests] 이름의 테스트 클래스를 생성하고 그 안에 테스트 메소드 3개를 작성하면 됩니다. - 예) JooyeokTests.java
- 복잡한 부분을 작성해볼수록 실력이 는다는 점을 기억합시다.
- 기한은 1월 7일까지
'개발 프로젝트 > [팀] Web - SQL 교육 사이트' 카테고리의 다른 글
[개발 완료] SQL 교육 사이트 - SQL Practice (0) | 2023.01.12 |
---|---|
[팀 프로젝트] SQL 교육 사이트 - 20221212 후반 작업 안내 (0) | 2022.12.12 |
[팀 프로젝트] SQL 교육 사이트 - 채점 로직 상세 설명 (0) | 2022.11.03 |
[팀 프로젝트] SQL 교육 사이트 - 20221009 중반 작업 안내 (0) | 2022.10.07 |
[팀 프로젝트] SQL 교육 사이트 - 20220925 안내 사항 (0) | 2022.09.25 |
댓글