[ 단위테스트 ]
: 작은 단위로 잘게 쪼개서 해당 단위가 잘 작동하는지를 검사
Junit 5 : 자바용 단위 테스트 프레임워크
Before - After
public class BeforeAfterTest {
@BeforeEach
void setUp() {
System.out.println("각각의 테스트 코드가 실행되기 전에 수행");
}
@AfterEach
void tearDown() {
System.out.println("각각의 테스트 코드가 실행된 후에 수행\n");
}
@BeforeAll
static void beforeAll() {
System.out.println("모든 테스트 코드가 실행되기 전에 최초로 수행\n");
}
@AfterAll
static void afterAll() {
System.out.println("모든 테스트 코드가 수행된 후 마지막으로 수행");
}
@Test
void test1() {
System.out.println("test code 1");
}
@Test
void test2() {
System.out.println("test code 2");
}
}
Custom
public class CustomTest {
@Test
@DisplayName("테스트의 내용을 한 눈에 알아볼 수 있도록 네이밍 해줄 때")
void test1() { // DisplayName이 있기 때문에 메서드 이름에 신경쓸 필요가 없음
System.out.println("test naming");
}
// 내부 클래스를 만들 수 있음 - 주제별로 테스트 가능
@Nested
@DisplayName("주제 별로 테스트를 그룹지어서 파악하기 좋습니다.")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 순서대로 테스트 실행
class Test1 {
@Order(1)
@Test
@DisplayName("Test1 클래스")
void test() {
System.out.println("\nTest1 클래스");
}
@Order(3)
@Test
@DisplayName("Test1 - test1()")
void test1() {
System.out.println("Test1.test1");
}
@Order(2)
@Test
@DisplayName("Test1 - test2()")
void test2() {
System.out.println("Test1.test2");
}
}
@Nested
@DisplayName("Test2 다른 주제")
class Test2 {
@Test
@DisplayName("Test2 - test1()")
void test1() {
System.out.println("Test2.test1");
}
@Test
@DisplayName("Test2 - test2()")
void test2() {
System.out.println("Test2.test2");
}
}
}
Repeat
public class RepeatTest {
@RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}") // 메서드를 반복해서 테스트(for문처럼 사용 가능) / name으로 이름을 정할 수 있음
void repeatTest(RepetitionInfo info) {
System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
}
@DisplayName("파라미터 값 활용하여 테스트 하기")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
void parameterTest(int num) {
System.out.println("5 * num = " + 5 * num);
}
}
Assertion
public class AssertionTest {
Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator(); // 테스트 할 때마다 객체 생성해줌
}
@Test
@DisplayName("assertEquals")
void test1() { // '/' 기능에 문제가 있으면 콘솔로 알려줌
Double result = calculator.operate(5, "/", 2);
assertEquals(2.5, result);
}
@Test
@DisplayName("assertEquals - Supplier")
void test1_1() { // 메세지로 문제를 알려줌
Double result = calculator.operate(5, "/", 0);
// 테스트 실패 시 메시지 출력 (new Supplier<String>())
assertEquals(2.5, result, () -> "연산자 혹은 분모가 0이 아닌지 확인해보세요!");
}
@Test
@DisplayName("assertNotEquals")
void test1_2() { // 틀린 것을 예측함
Double result = calculator.operate(5, "/", 0);
assertNotEquals(2.5, result);
}
@Test
@DisplayName("assertTrue 와 assertFalse")
void test2() { // boolean 값을 확인함
assertTrue(calculator.validateNum(9));
assertFalse(calculator.validateNum(0));
}
@Test
@DisplayName("assertNotNull 과 assertNull")
void test3() {
Double result1 = calculator.operate(5, "/", 2);
assertNotNull(result1);
Double result2 = calculator.operate(5, "/", 0);
assertNull(result2);
}
@Test
@DisplayName("assertThrows")
void test4() { // exception 체크
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> calculator.operate(5, "?", 2));
assertEquals("잘못된 연산자입니다.", exception.getMessage());
}
}
Given - When - Then
class CalculatorTest {
Calculator calculator;
@BeforeEach
void setUp() {
calculator = new Calculator();
}
@Test
@DisplayName("계산기 연산 성공 테스트")
void test1() {
// given : 값 선언
int num1 = 5;
String op = "/";
int num2 = 2;
// when : 실행
Double result = calculator.operate(num1, op, num2);
// then : 결과 예측 - 확인
assertNotNull(result);
assertEquals(2.5, result);
}
@Test
@DisplayName("계산기 연산 실패 테스트 : 분모가 0일 경우")
void test1_1() {
// given
int num1 = 5;
String op = "/";
int num2 = 0;
// when
Double result = calculator.operate(num1, op, num2);
// then
assertNull(result);
}
@Test
@DisplayName("계산기 연산 실패 테스트 : 연산자가 잘못됐을 경우")
void test1_2() {
// given
int num1 = 5;
String op = "?";
int num2 = 2;
// when - then : 실행과 예측을 한번에
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> calculator.operate(5, "?", 2));
assertEquals("잘못된 연산자입니다.", exception.getMessage());
}
}
'스파르타 내배캠' 카테고리의 다른 글
[TIL] #37. MockMvc (0) | 2024.06.18 |
---|---|
[TIL] #36. AOP (0) | 2024.06.13 |
[TIL] #34. Web Application, Servlet (0) | 2024.06.10 |
[TIL] #33. ResponseEntity (0) | 2024.06.10 |
[TIL] #32. Spring Security (0) | 2024.06.05 |