본문 바로가기
Web/스프링 부트와 aws로 구현하는 웹서비스

2. TDD와 테스트 코드

by 장인이 2021. 7. 8.

해당 게시물들은 이동욱 저자님의 "스프링 부트와 AWS로 혼자 구현하는 웹 서비스"를 공부하며 기록한 것입니다.

 

 TDD는 테스트가 주도하는 개발을 이야기 한다. 즉, 테스트 코드를 먼저 작성하는 것을 말한다. TDD는

<TDD>

 

1. 항상 실패하는 테스트를 먼저 작성 (Red)

2. 테스트가 통과하는 프로덕션 코드 작성 (Green)

3. 테스트가 통과하면 프로덕션 코드를 리팩토링 (Refactor)

 

 이 3단계를 거쳐서 개발한다.

 반면 단위 테스트는 TDD의 첫 번째 단계인 기능 단위의 테스트 코드를 작성하는 것을 말한다. 꼭 테스트 코드를 먼저 작성해야 하는 것은 아니며, 테스트 코드를 작성하는 것을 말한다.

 

 

 이 책에서는 단위 테스트 코드를 배우며, 추후에 TDD를 배우는 것을 추천한다고 한다. 

 단순하게 생각하면 테스트 코드의 필요성이 잘 이해되지 않을 수 있다. 굳이 따로 테스트 코드를 작성할 필요 없이 직접 서버를 실행하고 테스트해보면 되는 것 아닌가? 하지만 단위 테스트 코드는 다음과 같은 이점들이 있다.

 

1. 단위 테스트는 개발 단계 초기에 문제를 발견하게 도와준다.

2. 단위 테스트는 추후 라이브러리 업그레이드, 혹은 코드 리팩토링 시 기능이 올바르게 작동하는지 확인할 수 있다.

3. 기능에 대한 불확실성을 감소시킨다.

 

 우선 테스트 코드를 사용하면, 피드백이 빠르다는 장점이 있다. 테스트 코드가 없다면 코드 작성후 서버를 실행하고, api 테스트 도구를 통해 요청한 후 System.out.println()으로 확인해야 한다. 문제는 이를 코드를 수정할 때마다 반복해야 하며, 상당한 시간이 소모된다.

 또한 앞에서도 언급했지만 System.out.println()으로 수동 확인해야 하는 점이다. 테스트 코드를 사용하면 자체적으로 자동검증이 가능하다.

 세 번째로 개발자가 만든 기능을 보호해준다. 예를 들어 B라는 기능을 추가할 경우, 기존 A 기능이 문제가 생길 수 있다. 이렇게 새로운 기능을 추가할 때, 기존 A기능의 테스트 코드를 구현해 놓았다면 문제를 조기에 찾을 수 있게 된다.

 

 

 테스트 코드를 작성하기 위한 여러 프레임워크들이 있는데, 이 책에서는 자바용 xUnit인 JUnit4을 사용한다.

 

 

 

 우선 테스트 코드에 앞서 메인 클래스를 작성한다.

 

 

 @SpringBootApplication을 선언함에 따라 이 클래스는 해당 프로젝트의 메인 클래스가 되며, 항상 최상단에 위치해야 한다. SpringApplication.run을 통해 내장 WAS가 실행되는데, 이로 인해 굳이 별도로 tomcat을 설치할 필요가 없어진다. 이로 인해 어디서나 같은 환경에서 스프링 부트 배포가 가능하게 된다.(tomcat 버전을 신경쓰며 설치할 필요가 없으므로)

 

 

그 후 컨트롤러를 만든다. 우선 간단히 /hello를 GET으로 받을경우, "hello"를 return하는 컨트롤러를 만들어 본다.

 

 

컨트롤러를 만들어 보았다면 테스트 코드를 통해 작동여부를 확인할 차례이다.

 

 

 위의 코드가 HelloController의 작동여부를 확인하는 컨트롤러이다.

 @RunWith(SpringRunner.class)는 JUnit과 스프링부트 테스트 사이의 연결자로, JUnit 내장 실행자 외에 다른 실행자를 실행시키도록 한다. 여기서는 SpringRunner.class의 실행자를 사용할 수 있다. @WebMvcTest(controllers = HelloController.class)는 웹에 집중할 수 있는 어노테이션이다.

 @Autowired는 스프링에서 사용하는 빈을 주입받는다. MockMvc mvc는 웹 api시 사용되는 클래스로서, 이를 통해 HTTP GET, POST등에 대한 API 테스트가 가능해진다.

 

 

하지만 실제로 테스트 코드를 실행해본 결과, 오류가 발생했다.

 

 

 아예 @test를 인식 못하는 것 같았는데, 찾아본 결과 java 버전이 13으로 되어있었다. 이전에 다른걸 하면서 바꾼 것 같은데, 다시 java 8 로 바꾸니 정상적으로 테스트가 성공했다.

 

 

 실제로 application을 실행해 보면 hello가 뜨는 것을 확인할 수 있다.

 

항상 테스트 코드를 통해 검증해보는 습관을 들이고, 가끔씩 프로젝트를 실행해 확인해 보도록 한다.

 


- 학습 내용 저장할 github

https://github.com/imgzon3/imgzon3-springboot-test

 

imgzon3/imgzon3-springboot-test

Contribute to imgzon3/imgzon3-springboot-test development by creating an account on GitHub.

github.com

 

댓글