스프링부트와 aws로 혼자 구현하는 웹 서비스-2 테스트코드작성

kimjingwon·2022년 7월 7일
0

테스트코드

테스트코드 작성하는 이유

테스트코드는 단위테스트를 할 수 있게 해준다.

단위테스트 장점

-텍스트개발단계 초기에 문제를 발견하게 해준다.

-개발자가 코드를 리팩토링하거나 라이브러리 업그레이드에서 기존기능이 올바르 게 작동하는지 확인할 수 있다.

-시스템에 대한 실제 문서를 제공할수있다.

테스트코드를 작성하지 않는다면 프로그램을 실행시켜서 postman과 같은 api테스트 도구, 혹은 실제 결과를 눈은으로 확인, 프로그램 중지 와 같은 과정을 거쳐야하는데
이는 테스트코드를 작성하는 것에 비해

-프로그램의 기능의 확실성을 알 수 없다.

-시간이 오래걸린다.

-실제 문서를 제공하기 때문에 연쇄되는 오류를 조기에 찾을 수 있다.

컨트롤러 테스트 코드

실습 중 발생한 오류

1. Could not autowire. No beans of 'MockMvc' type found.

mockmvc를 빈주입이 불가능하다라는 오류

시도 방법1:
mockmvc를 제어하는 어노테이션인
@AutoConfigureMockMvc를 추가했다.

결과 : 실패

시도 방법2:
@WebMvcTest(controllers = HelloController.class)를
@AutoConfigureMockMvc와 결합된 @SpringBootTest를 변경

결과 : 실패

2. Cannot resolve symbol 'Runwith'

@Runwith(SpringRunner.class) 어노테이션을 찾을수 없다는 오류

Runwith는 junit4에서 사용되던 어노테이션으로
현재 스프링부트버전에서는 junit5가 기본으로 설정되어 있다.

junit5에서는 @ExtendWith(SpringExtension.class)로 바꿔서 사용한다.

결과 : 성공

package com.example.springbootwebservice.web;


import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
import static org.hamcrest.Matchers.is;


@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = HelloController.class)

class HelloCotrollerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void helloreturn() throws Exception{


        String name="hello";
        int amount=1000;

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(name));

        mvc.perform(get("/hello/dto")
                        .param("name",name)
                        .param("amount",String.valueOf(amount)))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name",is(name)))
                .andExpect(jsonPath("$.amount",is(amount)));

    }
}

코드 설명

@WebMvcTest(controllers = HelloController.class)

@Controller,@RestController인 컨트롤러(hellocontroller)를 메모리에 생성한다.

@ExtendWith(SpringExtension.class)

junit과 스프링부트테스트와의 연결자역할을 한다.
즉 테스트코드만 실행시 스프링부트의 실행도 같이 되게끔 해준다.(연결)


@Autowired
private MockMvc mvc

테스트를 위해 실제 객체와 비슷한 모의 객체를 만드는 것을 모킹(Mocking)이라고 하고

MockMvc는 웹 어플리케이션을 애플리케이션 서버에 배포하지 않고 테스트용 MVC환경을 만들어 요청 및 전송, 응답기능을 제공해주는 유틸리티 클래스다.

즉 실제 구현한 어플리케이션 클래스를 구동하지않고 기능을 시뮬레이션하게 도와주는 역할을 한다.

mvc.perform(get("/hello"))

/hello 의 주소로 get요청을 한다.
체이닝이 지원되어서 검증기능을 이어서 선언할 수 있다.

.andExpect(status().isOk())
.andExpect(jsonPath("$.name).is(name)))

perform에 이어서 선언하며 검증해준다.

status().isOk() : 결과 상태 검증
jsonPath("$.name).is(name))) : name의 값 검증

DTO 테스트 코드


import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;


public class HelloResponseDtoTest {

    @Test
    public void testdto(){
        String name= "test";
        int amount=1000;

        HelloResponseDto helloResponseDto = new HelloResponseDto(name,amount);

        assertThat(helloResponseDto.getName()).isEqualTo(name);
        assertThat(helloResponseDto.getAmount()).isEqualTo(amount);


    }
}

1. 메서드에 @test어노테이션

2. 검증에 필요한 변수 선언
String name= "test";
int amount=1000;

3. dto 생성
HelloResponseDto helloResponseDto = new HelloResponseDto(name,amount);

4. 생성한 dto의 필드와 변수가 일치하는지 확인 assertThat(helloResponseDto.getName()).isEqualTo(name);
assertThat(helloResponseDto.getAmount()).isEqualTo(amount);

    

0개의 댓글