[TDD] JUnit 기초 문법들 정리 모음

JUnit5 기준으로 작성되었습니다 !

JUnit ?


  • 자바 개발자 93%가 사용하는 단위 테스트
  • JUnit5는 2017에 공개
  • 부트 2.2 버전부터 기본 제공

  • Jupitor: JUnit5 구현체
  • Vintage: Junit3~4 구현체

둘다 TestEngine API 구현체이다

항상 햇갈리는 assertThat의 클래스


자주 사용하는 API로 assertThat가 있는데

보통 static import로 사용할 떄가 많다

이때

org.assertj.core.api
org.junit.jupitor.api

위 두 api가 있는데

assertj 를 선택하면 된다 !

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

assertThat 뒤에는 actual 실제로 나온 값이 오고

그 뒤에 .을 찍어서 오는 메서드의 인자는 expected 기대하는 값이다

기본적인 사용법


assertThat(replaceString).isEqualTo("1,2");
assertThat(splitString).containsExactly("1", "2");

보면 바로 이해가 될 것이다

생명주기 어노테이션


항목설명
@BeforeAll클래스 내 모든 테스트 메서드 실행 전에 딱 한 번 실행
@AfterEach클래스 내 모든 테스트 메서드 실행 후에 딱 한 번 실행
@BeforeEach클래스 내 모든 테스트 메서드 실행 전에 각각 실행
@AfterEach클래스 내 모든 테스트 메서드 실행 후에 각각 실행

예외 상황에서


assertThatThrownBy(() -> testString.charAt(3))
			.isInstanceOf(StringIndexOutOfBoundsException.class);
assertThatExceptionOfType(StringIndexOutOfBoundsException.class)
			.isThrownBy(() -> testString.charAt(3))
			.withMessageMatching("String index out of range: \\d+");

하지 않을 테스트


파이썬의 pass 문법처럼 당장하고 싶지 않은 처리에 대해서 넘기고 싶을 때가 있다

그럴때 사용하는 기능이다

@Disabled
@Test
@DisplayName("하지 않고자 하는 테스트 👻")
public void testDisable() {
    assertThat(1).isEqualTo(2);
}

반복 테스트


@RepeatedTest(10)
	@DisplayName("반복 테스트")
	public void repeatedTest() {
		System.out.println("(++a) = " + (++a));
	}
@RepeatedTest(value = 10, name = "{displayName} 중 {currentRepetition} of {totalRepetitions}")
@DisplayName("이름이 설정된 반복 테스트")
public void repeatedTestWithName() {
    System.out.println("(++b) = " + (++b));
}

매개변수 사용법


조금더 어려운 사용법이다 !

@ValueSource

@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
@DisplayName("매개변수 : ValueSource 테스트")
public void parameterizedTest1int(int number2) {
    System.out.println("number2 = " + number2);
}

@CsvSource

처음 봤을 때 문법이 이해가 가지 않았다

, 등 구분자에 대해 나뉜 값들이 메서드의 인자로 들어간다

@ParameterizedTest
@CsvSource({"test,TEST", "tEst,TEST", "Java,JAVA"})
@DisplayName("매개변수 : CsvSource 테스트")
void toUpperCase_ShouldGenerateTheExpectedUppercaseValue(String input, String expected) {
    System.out.printf("[input] %s  :: [expected] %s \n ", input, expected);
    String actualValue = input.toUpperCase();

    assertThat(actualValue).isEqualTo(expected);
}
@ParameterizedTest
@CsvSource(value = {"test:test", "tEst:test", "Java:java"}, delimiter = ':')
@DisplayName("매개변수 : CsvSource with delimiter 테스트")
void toLowerCase_ShouldGenerateTheExpectedLowercaseValue(String input, String expected) {
    String actualValue = input.toLowerCase();
    System.out.printf("[input] %s  :: [expected] %s \n ", input, expected);

    assertThat(actualValue).isEqualTo(expected);
}

@Nested

참고

바다의 JUnit5 사용법 https://youtu.be/EwI3E9Natcw ParameterizedTest 사용법 https://gmlwjd9405.github.io/2019/11/27/junit5-guide-parameterized-test.html

assertThat(..).isEqualTo(..) 가 비교하는 것은 동등성일까 동일성일까?


위 사항이 궁금하여 아래의 코드로 테스트를 돌려보았다

결과는 동등성을 비교하였다

image

또한 객체를 따로 생성하여서 아래와 같이 동등성을 비교해보았다

image

euals를 오버라이드 하기 전에는 fail이었지만 한 후에는 pass가 되었다

만일 동일성을 비교하는 것이었으면 오버라이드 유무에 관계 없이 모두 fail이었을 것이다

따라서 동등성이 기준이었음을 확인하였다




© 2020.12. by 따라쟁이

Powered by philz