It's going to be one day 🍀

안녕하세요! 매일 매일 공부하려고 노력하는 백엔드 개발자 지망생의 공부 흔적입니다.

Back-End/Spring

[Spring] 테스트 코드 개념

2jin2 2024. 3. 20. 16:11

HTTP 통신에서 쿠키/세션을 활용하는 이유

- HTTP 통신은 한번 연결했다가 끊어지면 저장된 내용이 사라짐(connectionless, stateless). 이것을 보완하기 위해 쿠키 또는 세션을 사용함.

 

인증에 사용되는 정보

- 쿠키 : 클라이언트(브라우저) 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일

-> 브라우저가 종료되어도 인증이 유지된다는 특징이 있음.

 

- 세션 : 

 

https://interconnection.tistory.com/74

 

쿠키와 세션 개념

노션 페이지(아래 내용과 동일) 개요 쿠키와 세션은 개발자 말고도 인터넷 사용자라면 누구나 많이 들어본 단어입니다. 하지만 개념에 대해서는 많은 사람들이 헷갈려 하기에 쉽고 간단하게 정

interconnection.tistory.com


테스트 코드란?

테스트 코드는 작성한 코드가 잘 동작하고 문제가 없는지를 확인하는 목적을 가진 코드이다. 유지 보수와 기능 검증에 꼭 필요한 코드이다.

 

given-when-then 패턴

- given : 테스트 실행을 위해 필요한 데이터를 준비하는 단계

- when : 테스트를 진행하는 단계

- then : when에서 수행한 테스트 결과를 검증하는 단계


JUnit이란?

JUnit은 자바 언어를 위한 단위 테스트 프레임워크임. 단위 테스트란, 작성한 코드가 의도대로 동작하는지 작은 단위로 검증하는 것을 의미함.

 

JUnit의 특징

-> 테스트 방식을 구분할 수 있는 어노테이션 제공 : @Test 어노테이션으로, 메소드를 호출할 때마다 새 인스턴스를 생성

-> 예상 결과를 검증하는 Assertion 메소드 제공

-> 사용 방법이 단순하고, 테스트 코드 작성 시간이 적음

-> 자동 실행, 자체 결과를 확인하고 즉각적인 피드백 제공

 

ex) 새로운 메뉴를 저장하는 코드 테스트

@DisplayName("새로운 메뉴를 저장한다.")
@Test
public void saveMenuTest() {
		// given : 메뉴를 저장하기 위한 준비 과정
		String name = "카페라떼";
		int price = 5500;
		
		Menu latte = new Menu(name, price);
		 
		// when : 실제로 메뉴를 저장
		long saveId = menuService.save(latte);
		
		// then : 메뉴가 잘 추가되었는지 검증 
		Menu savedMenu = menuService.findById(saveId).get();
		assertThat(savedMenu.getName()).isEqualTo(name);
		assertThat(savedMenu.getPrice()).isEqualTo(price);		
}

 

자주 사용하는 JUnit 어노테이션

- @BeforeAll 어노테이션

전체 테스트를 시작하기 전에 처음으로 한 번만 실행함.

ex) 데이터베이스를 연결해야 하거나 테스트 환경을 초기화할 때 사용함.

이 어노테이션은 전체 테스트 실행 주기에서 한 번만 호출되어야 하기 때문에 메소드를 static으로 선언해야함.

 

- @BeforeEach 어노테이션

테스트 케이스를 시작하기 전에 매번 실행함.

ex) 테스트 메소드에서 사용하는 객체를 초기화하거나 테스트에 필요한 값을 미리 넣을 때 사용함. 

각 인스턴스에 대해 메소드를 호출해야하므로 메소드는 static이 아님.

 

- @AfterAll 어노테이션

전체 테스트를 마치고 종료하기 전에 한 번만 실행함.

ex) 데이터 베이스 연결을 종료할 때나 공통적으로 사용하는 자원을 해제할 때 사용할 수 있음. 

전체 테스트 실행 주기에서 한 번만 호출되어야 하기 때문에 메소드를 static으로 선언해야함.

 

- @AfterEach 어노테이션

각 테스트 케이스를 종료하기 전 매번 실행됨.

ex) 테스트 이후에 특정 데이터를 삭제해야 하는 경우 사용함. 

각 인스턴스에 대해 메소드를 호출해야하므로 메소드는 static이 아님.

 

 

import org.junit.jupiter.api.*;

public class JUnitTotalTest {		
		@BeforeAll					// 전체 테스트를 시작하기 전 1회 실행
		public void beforeAll() {
				System.out.println("@BeforeAll");
		}
		
		@BeforeEach					// 각각의 테스트 케이스를 실행하기 전마다 실행
		public void beforeEach() {
				System.out.println("@BeforeEach");
		}
		
		@Test
		public void test1() {
				System.out.println("test1");
		}
	
		@Test
		public void test2() {
				System.out.println("test2");
		}
	
		@Test
		public void test3() {
				System.out.println("test3");
		}
		
		@AfterAll						// 전체 테스트를 마치고 종료하기 전에 1회 실행
		public void afterAll() {
				System.out.println("@AfterAll");
		}
		
		@AfterEach						// 각각의 테스트 케이스를 종료하기 전마다 실행
		public void afterEach() {
				System.out.println("@AfterEach");
		}
}

어노테이션 중심 JUnit의 실행 흐름

 

AssertJ로 검증문 가독성 높이기

AssertJ는 JUnit과 함께 사용해 검증문의 가독성을 높여주는 라이브러리임.

AssertJ에서 제공하는 다양한 메소드들

 

테스트 코드 쓰는 법을 많이 연습해봐야 할 것 같다...