본문 바로가기
프로그래밍/JUnit

Java Junit 5 with VSCode(실행, assert ) #2

by Flow.X 2022. 1. 22.
728x90

테스트 수행 시 해당 테스트 코드에서 딱 한번만, 아님 함수마다 한번씩만 실행하려 하면 해당 어노테이션을

사용하면 된다. 

 

실행 관련 Annotation

@BeforeAll - 테스트 수행 시 한번만 실행
@BeforeEach - @Test가 붙은 함수 수행 전  실행

@AfterEach - @Test가 붙은 함수 수행 후 실행
@AfterAll - 테스트 종료 시 한번 호출 
import static org.junit.jupiter.api.Assertions.assertTrue;

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

public class App {
    @BeforeAll
    static void BeforeAll() {
        System.out.println("@BeforeAll : 초기화-한번만 수행");
    }

    @BeforeEach
    void BeforeEach() {
        System.out.println("@BeforeEach : 초기화-테스트 하나당 한번씩 수행");
    }

    @AfterEach
    void AfterEach() {
        System.out.println("@AfterEach : 종료-테스트 하나당 한번씩 수행");
    }

    @AfterAll
    static void AfterAll() {
        System.out.println("@AfterAll : 종료-마지막 수행");
    }

    @Test void calc_add(){
        assertTrue(2==new Calculator().add(1, 1),"덧셈오류");
        assertTrue(1==new Calculator().multiple(1, 1),"곱셈오류");
    }
    @Test void calc_multiple(){
        assertTrue(1==new Calculator().multiple(1, 1),"곱셈오류");
    }
}

class Calculator {
    public int add(int x, int y) { // 덧셈
        System.out.println("Calculator-add");
        return x + y;
    }

    public int multiple(int x, int y) {// 곱셈
        System.out.println("Calculator-multiple");
        return x * y;
    }

    public double div(int x, int y) {// 나눗셈
        System.out.println("Calculator-div");
        return x / y;
    }
}

실행 결과 

@BeforeAll : 초기화-한번만 수행

@BeforeEach : 초기화-테스트 하나당 한번씩 수행
Calculator-multiple
@AfterEach : 종료-테스트 하나당 한번씩 수행

@BeforeEach : 초기화-테스트 하나당 한번씩 수행
Calculator-add
Calculator-multiple
@AfterEach : 종료-테스트 하나당 한번씩 수행

@AfterAll : 종료-마지막 수행

Assert 관련 Annotation

assertAll

모두가 만족해야만 통과된다.

여긴 여러개의 조건을 넣을 수 있고 "()-> {}"조건을 넣어서 직접 함수 구현도 가능하다.

물론 {} 안에 또 함수를 넣을 수도 있다 

assertAll("계산오류",
    () -> assertEquals(2, new Calculator().add(1, 1)),
    () -> assertEquals(1, new Calculator().multiple(1, 1)));

assertAll("계산오류",
    () -> {
        int a=1;
        int b=1;
        assertEquals(2, a+b);
    },
    () -> {
        int a=1;
        int b=2;
        assertAll("내부오류",
            ()->assertEquals(3,new Calculator().add(a,b),"덧셈오류"),
            ()->assertTrue(new Calculator().multiple(a,b)==2)
        );
    }
);

assertThrows

exception이 정상적으로 발생하는지를 체크한다. 

가령 당연히 Exception이 발생해야만 하는걸 점검할때는 테스트 코드가 멈춤으로 이걸 사용해서 정상적으로 오류가 발생하는걸

체크할 수 있을것 같다 

//Exception이 발생한걸 받아서 
Exception exception = assertThrows(ArithmeticException.class, () -> new Calculator().div(1, 0));

//점검한다
assertEquals("/ by zero", exception.getMessage());

assertTimeout

원하는 시간 이내에 수행이 안될 경우 테스트에 사용하면 될듯 하다.

//100 ms동안 기다렸는데 안오면 오류
assertTimeout(
        Duration.ofMillis(100),
        ()->{
            Thread.sleep(100); //100 ms동안 기다린다.
        }
    ,"시간초과");

//성공 후 결과값을 받아서 비교 
String actualResult = assertTimeout(
        Duration.ofMillis(100),
        ()->{
            Thread.sleep(90); //90 밀리세컨더만 쉬었다가
            return "aa";  //aa를 리턴 
        }
    ,"시간초과");
assertEquals("aa", actualResult); //값이 aa가 안오면 오류
728x90

'프로그래밍 > JUnit' 카테고리의 다른 글

Java JUnit5 with VSCode #1  (0) 2022.01.22