개발자를 향해...

[스프링부트와 AWS로 혼자 구현하는 웹 서비스] # 테스트 코드 작성하기 본문

spring boot 강의 따라하기/spring boot 첫걸음

[스프링부트와 AWS로 혼자 구현하는 웹 서비스] # 테스트 코드 작성하기

eugeneHwang1124 2021. 5. 15. 19:12
728x90
반응형

이 글은 스프링부트와 AWS로 혼자 구현하는 웹 서비스 책을 바탕으로 작성되었습니다.

 

요즘 테스트 코드를 작성하는게 기본이라한다. 

여기서는 단위 테스트를 사용한다. TDD와는 다른 개념인데 TDD는 다음과 같다.

  1. 테스트를 작성하고 작성한것이 실패하는것을 본다
  2. 테스트를 통과하는 수준의 코드 작성
  3. 코드의 행동을 바꾸지 않는 선에서 코드를 발전시킨다.
  4. 1번으로 가서 반복한다.

단위테스트Unit Test는 TDD에서 1번 단계를 작성하는 것이다. 단위 테스트로 코드를 작성하면 다음과 같은 장점이 있다.

  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

 

Spring Boot Controller not mapping

I have used STS and now I am using IntelliJ Ultimate Edition but I am still getting the same output. My controller is not getting mapped thus showing 404 error. I am completely new to Spring Framew...

stackoverflow.com

문제는 내가 web 패키지 경로를 com.eujin.admin 패키지의 하위에 놓아야 얘가 메인에서 인식을 하는데 그 밖에다 가져다 놔서 찾지를 못한거였다 .ㅋㅋㅋㅋㅋ 한밤중에 눈물 날 뻔 했지만 울기 직적에 해결책을 찾아서 다행이다.

 

수정한 폴더는 다음과 같다.

중요한 사실이니 이건 사진 크기를 줄이지 않도록 하겠다.

어쨌든 Application의 코드를 실행시키고 웹에서 localhost:8080/hello 로 가보니 다음과 같이 잘 실행되는 것을 볼 수 있었다.

3.  롬복

 

반응형