개발자를 향해...
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] # 테스트 코드 작성하기 본문
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] # 테스트 코드 작성하기
eugeneHwang1124 2021. 5. 15. 19:12이 글은 스프링부트와 AWS로 혼자 구현하는 웹 서비스 책을 바탕으로 작성되었습니다.
요즘 테스트 코드를 작성하는게 기본이라한다.
여기서는 단위 테스트를 사용한다. TDD와는 다른 개념인데 TDD는 다음과 같다.
- 테스트를 작성하고 작성한것이 실패하는것을 본다
- 테스트를 통과하는 수준의 코드 작성
- 코드의 행동을 바꾸지 않는 선에서 코드를 발전시킨다.
- 1번으로 가서 반복한다.
단위테스트Unit Test는 TDD에서 1번 단계를 작성하는 것이다. 단위 테스트로 코드를 작성하면 다음과 같은 장점이 있다.
- 문제점 발견
유닛 테스트의 목적은 프로그램의 각 부분을 고립 시켜서 각각의 부분이 정확하게 동작하는지 확인하는 것이다. 즉, 프로그램을 작은 단위로 쪼개서 각 단위가 정확하게 동작하는지 검사하고 이를 통해 문제 발생 시 정확하게 어느 부분이 잘못되었는지를 재빨리 확인할 수 있게 해준다. 따라서 프로그램의 안정성이 높아진다. 유닛 테스트는 일견 개발 시간을 증가 시키는 것처럼 보이지만 개발 기간 중 대부분을 차지하는 디버깅 시간을 단축시킴으로써 여유로운 프로그래밍을 가능케 한다.
2. 변경이 쉽다
프로그래머는 언제라도 유닛 테스트를 믿고 리팩토링을 할 수 있다. 리팩토링 후에도 해당 모듈이 의도대로 작동하고 있음을 유닛 테스트를 통해서 확신할 수 있다. 이를 회귀 테스트(Regression testing)라 한다. 어떻게 코드를 고치더라도 문제점을 금방 파악할 수 있고 수정된 코드가 정확하게 동작하는지 쉽게 알 수 있게 되므로 프로그래머들은 더욱 더 의욕적으로 코드를 변경할 수 있게 된다. 좋은 유닛 테스트 디자인은 그 유닛이 사용되는 모든 경로를 커버할 수 있는 테스트 케이스를 만들어 준다.
지속적인 유닛 테스트 환경을 구축하면 어떠한 변화가 있더라도 코드와 그 실행이 의도대로 인지를 확인하고 검증 할 수 있게 된다. 확립된 개발 방법과 유닛 테스트의 범위에 따라서 프로그램의 정확성이 좌우된다.
3. 통합이 간단하다
유닛 테스트는 유닛 자체의 불확실성을 제거해주므로 상향식(bottom-up) 테스트 방식에서 유용하다. 먼저 프로그램의 각 부분을 검증하고 그 부분들은 합쳐서 다시 검증하는 통합 테스트에서 더욱 더 빛을 발한다.
[출처: 위키페디아 https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%9B_%ED%85%8C%EC%8A%A4%ED%8A%B8]
테스트 프레임워크로는 JUnit이 가장 많이 사용되는데 여기서는 JUnit4를 사용한다.
2. 테스트 코드 작성하기
위처럼 java 폴더에 package를 추가해보자.
패키지 명은 웹 사이트 주소의 역순으로 한다고 한다. 이제 내 웹 사이트의 주소는 admin.eujin.com 이다.
이제 패키지 하단에 java 클래스를 생성하자.
Application이라는 이름의 메인 클래스가 될 자바 클래스를 생성한다.
코드는 다음과 같다.
package com.eujin.admin;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args){
SpringApplication.run(Application.class, args);
}
}
@SpringbootApplication으로 스프링부트의 자동 설정, 스프링 Bean읽기와 생성을 자동으로 설정하게 되고 이건 무조건 상단에 위치해야한다.
Application.run코드로 웹 어플리케이션 서버를 실행한다. 내장 웹 어플리케이션 서버(= 내장 WAS)는 내부에서 웹 서버를 실행시켜준다는 것을 가르킨다. 이 덕분에 톰캣설치를 하지 않아도 된다. 이를 통해 언제 어디서나 같은 환경에서 스프링 부트를 배포할 수 있게된다.
이제 아까 생성한 패키지 하위에 web이라는 패키지를 생성한다. 이제 테스트를 위한 컨트롤러와 관련된 클래스들은 여기에 넣을것이다.
이제 여기에 테스트해볼 컨트롤러른 넣어보자. HelloController라는 자바 클래스를 생성한다.
여기에 api 코드를 작성한다.
package web;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello") // /hello라는 경로의 웹 요청을 처리한다.
public String hello(){ //GetMapping에노테이션 때문에 /hello라는 경로의 HTTP GET요청이 수신되면 이 메서드가 해당 요청을 수신한다.
return "hello"; //
}
}
이제 코드가 잘 작동하는지 테스트 코드로 검증한다.
위와 같이 test 폴더에 패키지와 파일을 생성한다.
그리고 테스트 코드를 다음과 같이 작성한다.
코드를 실행시켜본다.
에러 발생 ㅎ
에러 전체 내용을 캡쳐했었어야하는데 수정하다 신나는 바람에 부분밖에 캡쳐를 못했다. 에러는 다음과 같았다.
Status expected:<200> but was:<404> ( =>여기서 페이지가 존재하지 않는다는 에러를 눈치챘어야했는데...!)
isOk() 부분에서 에러가 나서 이부분 주석처리하고 content().string("")부분을 실행시키도록 했는데 이걸 실행시키니
response content expected:<hello> but was <>
이런 에러가 떴다.
자꾸 뭘 실행시켜도 /hello라는 경로에서 아무것도 못가져오는것 같았다. 음 마치 페이지가 존재하지 않는것 처럼 에러를 띄워서 처음에는
@GetMapping not working 이런거로 검색을 했는데 stackoverflow에서 해결책을 찾았다
https://stackoverflow.com/questions/45183875/spring-boot-controller-not-mapping
문제는 내가 web 패키지 경로를 com.eujin.admin 패키지의 하위에 놓아야 얘가 메인에서 인식을 하는데 그 밖에다 가져다 놔서 찾지를 못한거였다 .ㅋㅋㅋㅋㅋ 한밤중에 눈물 날 뻔 했지만 울기 직적에 해결책을 찾아서 다행이다.
수정한 폴더는 다음과 같다.
중요한 사실이니 이건 사진 크기를 줄이지 않도록 하겠다.
어쨌든 Application의 코드를 실행시키고 웹에서 localhost:8080/hello 로 가보니 다음과 같이 잘 실행되는 것을 볼 수 있었다.
3. 롬복
'spring boot 강의 따라하기 > spring boot 첫걸음' 카테고리의 다른 글
프로젝트 리팩토링하기(소켓채팅) - 1탄 (0) | 2022.04.05 |
---|---|
나의 첫 Spring 프로젝트를 마치며 - 1 (0) | 2021.10.14 |
[스프링부트와 AWS로 혼자 구현하는 웹 서비스] # 환경 설정 (0) | 2021.05.14 |