스프링 부트와 AWS로 혼자 구현하는 웹 서비스

스프링 부트에서 테스트 코드를 작성하자

단위테스트와 TDD

TDD는 테스트 코드를 먼저 작성하는 것으로 테스트가 주도하는 개발입니다. 아래와 같은 단계를 따라야 합니다.

  1. 항상 실패하는 테스트를 먼저 작성 RED
  2. 테스트가 통과하는 프로덕션 코드를 작성 GREEN
  3. 테스트가 통과되면 리팩토링 REFACTORING 단위테스트는 TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 얘기합니다. TDD와 달리 테스트 코드를 꼭 작성해야하는 것도 아니고 리팩토링도 포함되지 않습니다.

단위 테스트를 작성하는 이유

  • 개발초기에 문제를 발견하게 도와줍니다.
  • 코드를 리팩토링하거나 라이브러리 업그레이드 등에서 기능이 올바르게 작동하는지 확인할 수 있습니다. (회귀 테스트)
  • 기능에 대한 불확실성을 감소시킬 수 있습니다.
  • 단위 테스트 자체가 문서가 될 수 있습니다.

단위 테스트를 배우기 전의 개발방법

  1. 코드 작성
  2. 프로그램 실행
  3. HTTP 요청 해보기
  4. 요청 결과를 System.out.println으로 검증
  5. 코드 수정 단위 테스트를 배우기 전엔 위 과정을 반복해야 합니다. 프로그램을 실행(톰캣을 실행)하는 과정은 프로그램에 따라 수십초에서 분까지 소요되기도 합니다.

단위 테스트를 하게 되면 해결되는 문제들

  1. 톰캣을 올렸다 내렸다 해야하는 문제 테스트 코드가 없다 보니 눈과 손으로 직접 수정된 기능을 확인해야만 했습니다. 테스트 코드를 작성하면 손으로 직접 톰캣을 실행할 필요가 없어집니다.
  2. System.out.println으로 결과를 확인해야만 하는 문제 눈 말고는 검증할 도구가 없어서입니다. 테스트 코드를 작성하면 눈으로 확인하지 않고 코드에 작성하면 됩니다.
  3. 기능검증 기능을 하나 추가했다고 기존의 기능들을 모두 손수 테스트할 수 없습니다. 하지만 테스트 코드를 작성하면 전체 기능 테스트가 가능하고 추가한 기능이 다른 기능에 미칠 영향도를 테스트 할 수 있습니다.

테스트를 시작하기 위한 spring boot의 시작점

  • @SpringBootApplication을 기준으로 설정을 읽기 때문에 이 클래스는 항상 프로젝트의 최상단에 위치해야만 합니다.
  • @SpringBootApplication 애노테이션 덕분에 스프링 부트 설정, 스프링 Bean 설정이 모두 자동입니다.
  • SpringApplication.run()으로 인해 내장 WAS를 실행합니다.
    • Spring Boot는 외부에 별도의 WAS를 두지 않고 애플리케이션을 실행할 때 내부에 WAS를 실행합니다.
    • 톰캣(외부 WAS)를 설치할 필요가 없게 되며 Jar를 실행하기만 하면 됩니다.
    • 언제 어디서나 같은 환경에서 스프링 부트를 배포 할 수 있게 됩니다. ```java @SpringBootApplication public class AwsSpringbootWebserviceApplication {

      public static void main(String[] args) { SpringApplication.run(AwsSpringbootWebserviceApplication.class, args); }

}


### 간단한 컨트롤러 테스트
```java
@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "Hello";
    }
}
@ExtendWith(SpringExtension.class)
@WebMvcTest(HelloController.class)
class HelloControllerTest {

  @Autowired
  private MockMvc mvc;

  @Test
  public void hello가_리턴된다() throws Exception{
    String hello = "hello";
    mvc.perform(get("/hello"))
      .andExpect(status().isOk())
      .andExpect(content().string(hello));
  }
}
  • @SpringBootTest : 스프링부트 테스트를 진행합니다.
  • @WebMvcTest : Web 기능 테스트에만 집중할 수 있도록 합니다.
  • private MockMvc mvc; : 이 클래스를 통해 HTTP GET, POST에 대한 API 테스트를 할 수 있습니다.

댓글남기기