1. 화살표 연산자 (->), 람다
2. 삼항 연산자
3. (optional) Java 13. switch 연산자
4. JUnit5
2주차의 1~3 내용은 이전 블로그에 존재한다.
https://abbiddo.tistory.com/91
https://abbiddo.tistory.com/93
4. JUnit5
- 테스팅 기반 프레임워크다.
- JUnit Platform, JUnit Jupiter, JUnit Vintage를 결합한 형태다.
- JUnit Platform : 테스트를 실행해주는 런처와 TestEngine API 제공
- Juliter : TestEngine API 구현체로 JUnit5에서 제공
- Vintage : TestENgine API 구현체로 JUnit3, 4에서 제공
Annotations
어노테이션 | 내용 |
@Test | 테스트 Meghod 선언 |
@ParameterizedTest | 매개변수를 받는 테스트 |
@RepeatedTest | 반복되는 테스트 |
@TestFactory | 동적 테스트를 위한 테스트 팩토리 메소드 |
@TestInstance | 테스트 클래스의 생명주기 설정 |
@TestTemplate | 여러번 호출될 수 있도록 설계된 테스트 케이스 템플릿 |
@TestMethodOrder | 테스트 메소드 실행 순서를 구성 |
@DisplayName | 테스트 클래스 또는 메소드에 대한 사용자 정의 이름 설정 |
@DisplayNameGeneration | 테스트 클래스에 대한 커스텀 이름 생성기 생성 ex) _ 를 공백으로 치환해주는 생성기 new_test -> new test |
@BeforeEach | 모든 테스트 실행 전에 실행할 테스트 |
@AfterEach | 모든 테스트 실행 후에 실행할 테스트 |
@BeforeAll | 현재 클래스 실행 전에 실행할 테스트, static으로 선언 |
@AfterAll | 현재 클래스 실행 후에 실행할 테스트, static으로 선언 |
@Nested | non-static 중첩 클래스임을 명시 |
@Tag | 새로운 태그 선언 시 사용 |
@Disable | 클래스나 테스트를 사용하지 않음을 명시 |
@Timeout | 주어진 시간 안에 실행하지 못할 경우 실패하도록 하는 데 사용 |
Meta Annotation
- 사용자가 직접 정의할 수 있는 annotation이다.
- @Tag 어노테이션을 이용한다.
// Fast Annotation 생성
@Tag("fast")
public @interface Fast {
}
class AnnotationTest{
// @Fast 사용 가능
@Fast
@Test
void myFastTest() {
// ...
}
}
Fast Annotation 생성 시 @Test 를 선언하면 Fast Annotation에 @Test가 포함되므로 Fast Annotation 사용 시 @Test를 별도로 작성하지 않아도 된다.
// Fast Annotation 생성
@Test
@Tag("fast")
public @interface Fast {
}
class AnnotationTest{
// @Fast 사용 가능
@Fast
void myFastTest() {
// ...
}
}
Test Class & Test Method
- Test Class : 하나 이상의 테스트 메소드를 포함하는 최상위 클래스, static 멤버 클래스 혹은 중첩 클래스여야 한다. 추상클래스로 정의 되어서는 안되고, 단일 생성자만 가져야 한다.
- Test Method : @Test / @RepeatedTest / @ParameterizedTest / @TestFactory / @TestTemplate 중 하나의 어노테이션으로 선언된 메소드다.
- Lifecycle Method : @BeforeAll / @AfterAll / @BeforeEach / @AfterEach 중 하나의 어노테이션으로 선언되 메소드다.
- 두 메소드는 추상 메소드로 정의되어서는 안되며, 값을 반환하면 안된다. non-static인 인스턴스 메소드여야 한다.
아래는 테스트 클래스 및 메소드를 작성한 예시다.
class Tests {
Calculator c = new Calculator();
int a = 20;
int b = 10;
@BeforeAll
static void begin() {
}
@BeforeEach
void methodBegin() {
}
@Test
@DisplayName("SUM")
void sum() {
assertEquals(30,c.sum(a,b));
}
@Test
@Disabled()
void sub() {
assertEquals(10,c.sub(a,b));
}
@ParameterizedTest
@ValueSource(ints = {2,4,6,8})
void paramTest(int num){
assertEquals(0,num%2);
}
@AfterEach
void methodEnd() {
}
@AfterAll
static void end() {
}
}
이 테스트의 실행 순서는 begin() -> methodBegin() -> sum() -> methodEnd() -> methodBegin() -> paramTest() -> methodEnd() -> end() 이다.
Assertions Methods
- Assertions 메소드는 모두 static 메소드라는 특징이 있다.
- 모든 메소드는 https://junit.org/junit5/docs/current/api/org.junit.jupiter.api/org/junit/jupiter/api/Assertions.html 여기서 확인 가능하다
자주 사용하는 메소드
@Test
void standardAssertions() {
assertEquals(2, calculator.add(1, 1));
assertEquals(4, calculator.multiply(2, 2), "Nope");
assertTrue('a' < 'b', () -> "Nope");
}
- assertEquals() ; 두 개의 인자 사용 시 같은 값인지 비교, 세 개의 인자 사용 시 테스트를 실패하면 세 번째 인자 메시지를 출력한다.
- assertArrayEquals() : 위와 같으나 배열을 비교한다.
- assertSame() : 위와 같으나 객체를 비교한다.
- assertTrue() : 인자가 한 개일 경우 true인지 확인, 두 개일 경우 테스트 실패하면 두 번째 인자 메시지를 출력한다.
- assertFalse() : 위와 같으나 false인지 확인한다.
- assertNull() : 위와 같으나 Null 인지 확인한다.
- assertNotNull() : 위와 같으나 Null이 아닌지 확인한다.
@Test
void groupedAssertions() {
assertAll("person",
() -> assertEquals("Jane", person.getFirstName()),
() -> assertEquals("Doe", person.getLastName())
);
}
- assertAll() : 여러 개의 assertions가 만족할 경우에만 테스트를 통과하였다고 판단하고 싶은 경우 사용한다. 이 메소드 내에서 인자로 람다식을 사용한다.
@Test
void exceptionTesting() {
Exception exception = assertThrows(ArithmeticException.class, () ->
calculator.divide(1, 0));
assertEquals("/ by zero", exception.getMessage());
}
- assertThrows() : 특정 예외가 발생하였는지 확인하고 싶을 때 사용한다. (확인할 예외 클래스, 테스트 할 코드)
@Test
void timeoutNotExceeded() {
assertTimeout(ofMinutes(2), () -> {
});
}
- assertTimeout() : 특정 시간 안에 실행이 끝나는지 확인하고 싶을 때 사용한다.
@Test
void timeoutExceededWithPreemptiveTermination() {
assertTimeoutPreemptively(ofMillis(10), () -> {
new CountDownLatch(1).await();
});
}
- assertTimeoutPreempively() : 위와 같으나 특정 시간 안에 실행이 끝나지 않으면 바로 종료한다.
JUnit 실습
1. 가장 상위 폴더에 test 디렉토리 생성 후 가장 상위 폴더에서 우클릭 -> Open ModuleSettings 를 선택한다.
2. test 폴더를 선택한 후 위의 Mark as 에서 Tests를 선택하고 OK를 누른다.
3. 프로그램 작성 코드의 class 이름에서 우클릭 -> Go To -> Test 를 선택한다.
4. Create New Test를 선택한다.
5. Fix 버튼을 누르고 OK 버튼을 누르면 해당 라이브러리 파일이 다운로드 된다.
6. 테스트 클래스 파일 이름인 Class name을 입력하고, 아래에 테스트하고자 하는 메소드를 선택한 후 OK 버튼을 누른다.
7. 테스트 파일의 기본 형태와 함께 파일이 생성된다.
8. 테스트 코드를 작성한다.
9. 테스트 메소드 왼쪽의 화살표를 눌러 테스트를 진행한다.
'Programming > JAVA' 카테고리의 다른 글
Te JAVA (2) - 자료구조 구현 (Stack) (1) | 2023.10.03 |
---|---|
Te JAVA (2) - 자료구조 구현 (LinkedList) (0) | 2023.10.03 |
Te JAVA (2) - Java 13. switch 연산자 (0) | 2023.10.01 |
Te JAVA (2) - 삼항 연산자 (0) | 2023.10.01 |
Te JAVA (2) - 람다 (lambda) (0) | 2023.10.01 |