Spring Test - 1 : V - model

S.Sun·2024년 4월 26일

스프링

목록 보기
16/17

질문 내용

  1. JUNIT 이란?
  2. 테스트에서 v-model 에 대하여 설명하시오.
  3. 소프트웨어 개발에서 폭포수 모델에 대하여 설명하시오
  4. v-model 에 대하여 설명하시오.
  5. 단위 테스트 , 통합 테스트, 인수 테스트에 대하여 설명하시오.
  6. Spring에서, 커넥션 풀 테스트 코드를 코딩 하시오.

  1. 스프링 컨트롤러를 테스트 하는 2가지 방법은?
  2. 게시판에서 페이징시 2페이지 10개의 값을 확인 하도록 테스트 코드를 작성하시오.

개인 작성

  • JUNIT
    - 자바에서 사용되는 단위 테스트 프레임워크
    - annotation 기반 테스트
    - assert로 시작되는 메서드들(assertions : 단정문으로 번역됨)을 활용
    - 테스트를 실행하는 데 사용되는 테스트 러너를 제공
    -> 테스트 러너 : 테스트 클래스 로드 및 테스트 메서드 실행. 실행된 테스트 결과 보고 및 테스트 결과 제공
    - 이외의 다양한 기능 또한 제공한다고 함.

  • V-model
    - 폭포수 모델에서 확장된 형태 중 하나
    - 설계에 따라 구현을 하게 됨.
    - 각 단계별로 대응되는 시험을 수행
  • 폭포수 모델
    - 요구 사항 분석, 설계, 구현, 테스트, 유지 보수의 단계를 순차적으로 진행
    - 각 단계는 이전 단계의 완료 후에 진행됨.
    - 요구 사항을 미리 명확하게 정의하여 전체 개발 프로세스를 진행
  • V-model
    - Vue.js에서 사용되는 디렉티브(directive)
    - 양방향 데이터 바인딩을 제공
    - 사용자 입력 요소(예: input, select, textarea)와 Vue.js의 데이터 속성을 연결
    -> 입력 요소의 변경 사항이 데이터에 반영됨, 데이터의 변경 사항이 입력 요소에 반영되도록 함
  • 단위 테스트
    - 주로 메서드 수준으로 단위를 정하여 테스트

  • 통합 테스트
    - 여러 모듈을 모아, 의도대로 협력되는지 여부를 확인하는 테스트
    - 현재 배우는 상황에서는 클래스 기준으로 테스트하는 것을 통합 테스트로 표현

  • 인수 테스트
    - 사용자 스토리(시나리오)에 맞춰 수행하는 테스트
    -> 다른 의사소통집단으로부터 시나리오를 받아 개발한다는 의미
    - 요구사항대로 잘 작동되는가를 따지는 것

ConnectionPoolTest 파일
- 수업 전 개인작성해본 코드

package edu.sejong.ex.database;

import static org.junit.jupiter.api.Assertions.*;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;



import lombok.extern.slf4j.Slf4j;

@Slf4j
@SpringBootTest
class DataBaseTest {

	@Autowired
	private DataSource dataSource;
	
	@Test
	void testDataSource() {
		assertNotNull(dataSource);
		log.info("DS = " + dataSource);
	}
	
	@Test
	void testConnection() throws SQLException{
		Connection connection = dataSource.getConnection();
		log.info("== connection == : " + connection.toString());
		assertNotNull(connection);
		
		connection.close();
	}
	

}

	
  • 빨간 박스, 주황색 박스로 표시한 부분이 log를 남게 된 부분이다.


수업 내용을 반영하여 수정한 파일

package edu.sejong.ex.database;

import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.sql.DataSource;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@SpringBootTest
class DataBaseTest {

	@Autowired
	private DataSource dataSource;
	
	@Test
	void testDataSource() {
		assertNotNull(dataSource);
		log.info("DS = " + dataSource);
	}
	
	@Test
	void testConnection(){
		try (Connection connection = dataSource.getConnection();){
			log.info("== connection == : " + connection.toString());
			assertThat(connection).isInstanceOf(Connection.class);	
			
			assertEquals(100, getLong(connection,"select 100 from dual"));
		} catch (Exception e) {
			e.printStackTrace();
		} 
	}
	
	public long getLong(Connection connection, String sql) {
		long result = 0;
		try(Statement stmt = connection.createStatement();
			ResultSet rs = stmt.executeQuery(sql)){
			if(rs.next()) {
				result = rs.getLong(1);
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
		return result;
	}

}
  • 빨간 박스, 주황 박스는 기존과 동일하게 각각 DataSource, Connection 체크
  • 녹색 박스는 sql 실행 결과를 확인하는 것.



  1. @ExtendWith(MockitoExtension.class) 활용 : Controller만 테스트하기 위함
@ExtendWith(MockitoExtension.class)

해당 annotation을 해야 MockitoExtension 객체(Mock 객체)를 가져올 수 있음.

	@Autowired
	private MockMvc mockMvc; // HTTP 호출을 위한  MockMVC 사용

MockMvc : 웹 브라우저 역할을 함.

	@BeforeEach// JUNIT4에서는 @Before였다고.
	void setUp() {
		mockMvc = MockMvcBuilders.standaloneSetup(new HomeController()).build();
	}

@BeforeEach : 실행되기 전 먼저 처리해야 하는 것들을 처리.


  1. @SpringBootTest ,@AutoConfigureMockMvc 활용
@Slf4j
@SpringBootTest
@AutoConfigureMockMvc

@AutoConfigureMockMvc : IOC컨테이너에 MockMvc 를 집어넣고, 이를 꺼내쓸 수 있도록 한다.

MockMvc를 사용하는 것까진 동일하지만, @BeforeEach는 사용하지 않음.
대신, import시켜야 하는 클래스 개수가 많음.


  1. 수업 내용
  • 해당 링크로 전달되는 값을 확인해야 하는데, 다른 걸 확인하고 있었음.
package edu.sejong.ex.controller;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;

import org.hamcrest.Matchers;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
class BoardControllerTest {

	@Autowired
	private MockMvc mockMvc;
	
	@Disabled
	@Test
	void testHome() throws Exception{
		mockMvc.perform(MockMvcRequestBuilders.get("/board/list"))
			   .andExpect(MockMvcResultMatchers.status().isOk())
			   .andDo(print());
	}

	@Disabled
	@Test
	void testBoard() throws Exception{		
		mockMvc.perform(MockMvcRequestBuilders.get("/"))
			   .andExpect(MockMvcResultMatchers.status().isOk())			 
               .andDo(print());
	}
	
	@Test
	void testBoardLists() throws Exception{				
//		mockMvc.perform(MockMvcRequestBuilders.get("/board/list2?pageNum=1&amount=10"))
//				.andExpect(MockMvcResultMatchers.status().isOk())			 
//		        .andDo(print());
		
		mockMvc.perform(MockMvcRequestBuilders.get("/board/list2")
				.param("pageNum", "2")
				.param("amount", "10"))
				.andExpect(MockMvcResultMatchers.status().isOk())			 
				.andDo(print());
		
	}
	
	@Disabled
	@Test
	void testBoardJson() throws Exception{
		mockMvc.perform(MockMvcRequestBuilders.get("/boards/list"))
			   .andExpect(MockMvcResultMatchers.status().isOk())
			   .andDo(print());
	}
}

request에 데이터가 전달되는 걸 확인할 수 있음.


이전에 개인적으로 작성했던 내용이며, 질문의 의도를 잘못 이해하긴 했지만 다른 부분을 체크(ModelAndView에 데이터가 있느냐)할 때 사용하게 될 것

  • 테스트를 위해 이전에 '/board' 에 걸어뒀던 접근 권한을 해제하고 진행했음
  • testBoard()만 실행된다고 보면 됨.
package edu.sejong.ex.controller;

import static org.hamcrest.CoreMatchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;

import org.hamcrest.Matchers;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@SpringBootTest
@AutoConfigureMockMvc
class BoardControllerTest {

	@Autowired
	private MockMvc mockMvc;
	
	@Disabled
	@Test
	void testHome() throws Exception{
		mockMvc.perform(MockMvcRequestBuilders.get("/board/list"))
			   .andExpect(MockMvcResultMatchers.status().isOk())
			   .andDo(print());
	}

	@Test
	void testBoard() throws Exception{		
		mockMvc.perform(MockMvcRequestBuilders.get("/board/list2"))
			   .andExpect(MockMvcResultMatchers.status().isOk())
			   .andExpect(MockMvcResultMatchers.view().name("/board/boardlist2"))
               .andExpect(MockMvcResultMatchers.model().attributeExists("boards"))
               .andExpect(MockMvcResultMatchers.model().attributeExists("pageMaker"))
               .andExpect(MockMvcResultMatchers.model().attribute("pageMaker", Matchers.hasProperty("criteria")))
               .andExpect(MockMvcResultMatchers.model().attribute("pageMaker", Matchers.hasProperty("criteria", Matchers.hasProperty("pageNum", equalTo(1)))))
               .andExpect(MockMvcResultMatchers.model().attribute("pageMaker", Matchers.hasProperty("criteria", Matchers.hasProperty("amount", equalTo(10)))))
               .andDo(print());
	}
	
	@Disabled
	@Test
	void testBoardJson() throws Exception{
		mockMvc.perform(MockMvcRequestBuilders.get("/boards/list"))
			   .andExpect(MockMvcResultMatchers.status().isOk())
			   .andDo(print());
	}
}
  • 녹색 상자에 표시된 것처럼, criteria에 담긴 변수 값을 확인 가능.
  • 위 코드에서는 확인 뿐만 아니라, 들어가 있는 값이 각각 1,10과 동일한지도 체크한 거라고 이해하는 중...

profile
두리둥둥

0개의 댓글