Spring Boot 11_JUnit

송지윤·2024년 6월 21일
0

Spring Framework

목록 보기
65/65

JUnit : Java 개발 표준 단위 테스트 프레임워크
-> 모듈 따로 설치 안해도 됨

=> Project and External Dependencies 에 있음

=> build.gradle
spring-boot-starter-test 안에 JUnit이 포함돼있음
JUnit5 버전 포함돼있어서 별도로 모듈을 추가할 필요가 없음.

-spring boot 버전 2.0 이상부터 포함.


스프링 프로젝트 만들면 기본적으로 생성돼있는 클래스
Spring Boot 어플리케이션을 위한 기본 통합 테스트 클래스 환경

컨텍스트 -> spring framework 개념이 굉장히 많은데 여기 context

모든 Bean 관리하는 중앙 요소
Core 중 하나
생성 관리 주입 -> context

src/test/java 안에 있는 ApplicationTests.java
각각 주석에 대한 설명

package edu.kh.project;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

// Spring Boot 어플리케이션을 위한 기본 통합 테스트 클래스 환경 -> 프로젝트가 온전한지 테스트 해줌

@SpringBootTest // Spring Boot 애플리케이션 컨텍스트를 로드하여 통합테스트를 수행함
// -> 애플리케이션의 모든 빈(Bean)을 로드하고,
//    이를 통해 실제 애플리케이션이 실행되는 것과 같은 방식으로 테스트를 진행
class BoardProjectBootApplicationTests {

	@Test
	// JUnit에게 이 메서드가 테스트 메서드임을 알려줌
	void contextLoads() {
		// 애플리케이션 컨텍스트가 제대로 로드되는지 확인하는 역할을 함.
		// 애플리케이션 컨텍스트에 로딩이 실패하면, 이 테스트는 실패함
		// Test 어노테이션이 붙은 건 결과가 성공 혹은 실패밖에 없음
		// 정삭적으로 로드가 되면 이 테스트는 통과가 됨.
		// => Spring Boot 애플리케이션에 기본 설정이 올바른지 확인하기 위해서 자동 생성 돼있는 애
	}

}

src/main/java 에 있는 클래스를 src/test/java 에 똑같이 만들어서 test

src/main/java 에 클래스 하나 만듦

Calculator

package edu.kh.project.test;

public class Calculator {

	public int add(int a, int b) {
		return a+b;
	}
	
	public int subtract(int a, int b) {
		return a-b;
	}
	
	public int multiply(int a, int b) {
		return a*b;
	}
	
	public int divide(int a, int b) {
		// 0 으로 나눌 수 없다는 예외 처리
		if(b == 0) {
			// 문법적 오류 IllegalArgumentException
			throw new IllegalArgumentException("0으로 나눌 수 없음");
		}
		
		return a / b;
	}
    
    public boolean exam() {
		return 1 == 1;
	}
	
}

src/test/java

주요 어노테이션

@Test: 이 메서드가 테스트 메서드임을 나타냄

@BeforeEach: 각 테스트 메서드가 실행되기 전에 실행되는 메서드를 정의함

@AfterEach: 각 테스트 메서드가 실행된 후에 실행되는 메서드를 정의함

@BeforeAll: 모든 테스트 메서드가 실행되기 전에 한 번 실행되는 메서드를 정의함

@AfterAll: 모든 테스트 메서드가 실행된 후에 한 번 실행되는 메서드를 정의함

주요 메서드

JUnit 에서 제공하는 메서드
(assert : 단언하다/주장하다, (프로그래밍에서) 가정하다)

assertEquals : 두 값이 같은지 확인, 같지 않으면 테스트가 실패함

assertTrue : 조건이 참인지 확인, 거짓이면 테스트가 실패함

assertFalse : 조건이 거짓인지 확인, 참이면 테스트가 실패함

assertNotNull : 객체가 null이 아닌지 확인, null이면 테스트가 실패함

assertThrows : 특정 예외가 발생하는지 확인, 예외가 발생하지 않으면 테스트가 실패함

edu.kh.project.test.CalculatorTest

사용할 인스턴스 꼭 생성해줘야함

package edu.kh.project.test;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;

import lombok.extern.slf4j.Slf4j;

// JUnit : Java 개발 표준 테스트 프레임워크
// 클래스 개개인마다 단위 테스트 가능 / 전체 테스트도 가능
// -> 코드의 정상 동작을 확인하기 위해서 테스트를 작성하고 실행함

@Slf4j
public class CalculatorTest {

	// Calculator 메서드 하나하나 테스트해볼 거임
	
	// 인스턴스 생성
	private Calculator calculator = new Calculator();
	
	// BoforeAll 사용해보기 Slf4j 이용
	@BeforeAll
	public static void start() {
		log.info("테스트 시작");
	}
	
	@Test
	public void testAdd() {
		// assertEquals(예상값, 실제값);
		// Calculator 호출해야함 -> 실제값에 넣어주기 위해
		assertEquals(5, calculator.add(2, 3));
		// => 예상값이 실제값에 적힌 메서드 실행 후 같은 값이면 성공, 다르면 실패
	}
	
	@Test
	public void testSubtract() {
		assertEquals(1, calculator.subtract(3, 2));
	}
	
	@Test
	public void testMultiply() {
		assertEquals(6, calculator.multiply(2, 3));
	}
	
	@Test
	public void testDivide() {
		assertEquals(3, calculator.divide(6, 2));
	}
	
	// assertThrows 특정 예외가 발생하는지 메서드 이용해보기
	@Test
	public void testDivideByZero() {
		// assertThrows(기대되는 예외 클래스, 예외가 발생할 것으로 예상되는 코드); 발생할 것 같은 예외 클래스
		// 예외가 발생할 것으로 예상되는 코드는 lamda 식으로 많이 씀
		assertThrows(IllegalArgumentException.class,
					() -> calculator.divide(1 ,0) );
		// 특정 예외가 발생할 것을 기대하고 테스트 하는 것
		// 0이 아닌 다른 값 전달 시 예외 발생 x => test 실패함
	}
	
	// test 돌리는 방법
	// src/test/java -> CalculatorTest 클래스 오른쪽 마우스 클릭 후
	// run as -> junit test 클릭
	
	
	// assertTrue 사용해보기
	@Test
	public void testExam() {
		// assertTrue(테스트할 값);
		assertTrue(calculator.exam());
	}
	
	// AfterAll 사용해보기
	@AfterAll
	public static void end() {
		log.info("테스트 모두 완료");
	}

	// JUnit5 에서 @BeforAll / @AfterAll 메서드는 기본적으로 static 메서드여야함.
	// 어노테이션 작성 안하면 수행 안됨. Test, BeforeAll, AfterAll 등등 모두 다
	// test 클래스에 있지만 어노테이션 붙이지 않으면 수행 안됨.
}

test 돌리는 방법
src/test/java -> CalculatorTest 클래스 오른쪽 마우스 클릭 후
run as -> junit test 클릭


초록색 체크 => 기능에 문제 없다 테스트 성공


값 바꾸고 실행 -> 남색 x test 실패
오른쪽에 test 실패한 이유가 나옴


int 형이라서 1/2 는 0이 나옴

JUnit5 에서 @BeforAll / @AfterAll 메서드는 기본적으로 static 메서드여야함

메서드에 static 안 적었을 경우 에러남

static 붙였을 경우

0개의 댓글