본문 바로가기
  • 실행력이 모든걸 결정한다
개발 프로젝트/[팀] Web - SQL 교육 사이트

[팀 프로젝트] SQL 교육 사이트 - 테스트 코드 강의 정리

by 김코더 김주역 2022. 12. 27.
반응형

1. 테스트의 목적

- 테스트는 특정한 기능이 잘 수행되고 있는지 검사하는 과정이다.

- 테스트 코드를 통해 테스트를 자동화할 수 있다. 일일이 서버를 구동해서 테스트하고 싶은 페이지에 접속해서 테스트케이스를 직접 입력할 필요 없이 능동적인 테스트를 수행하지 않아도 된다.

- 어제 팀장 강의에서는 mockMvc와 JUnit에 대해 설명함

 

 

 

2. mockMvc

- mockMvc는 MVC에 대한 테스트에 사용되는 객체다.

- URL 요청과 응답에 대한 테스트, 컨트롤러 테스트라고 이해해도 무방하다.

- 팀장이 mockMvc에 대해 정리한 포스팅을 참고하며 test/java/com/example/demo/SampleTests.java의 테스트 메소드들과 mockMvc에서 사용되는 메소드들을 이해하는 시간을 가졌다.

https://kimcoder.tistory.com/567

 

[Spring] MockMvc 테스트

1. MockMvc란? - 애플리케이션 서버를 구동하지 않고도 Spring MVC 동작을 재현할 수 있는 모의 객체다. MockMvc 공식 문서 https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/test/web/servlet/Moc

kimcoder.tistory.com

 

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

 

[Spring] 테스트 코드의 작성

1. 테스트 소개 - 테스트는 자신이 예상하고 의도했던 대로 코드가 정확히 동작하는지를 확인하는 것이다. - Spring은 편리하고 빠른 테스트에 큰 가치를 두고 있다. - 구현한 기능을 직접 동작시키

kimcoder.tistory.com

 

 

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일까지

 

반응형

댓글