✏️ 0613
Spring 심화 강의
수준별 학습: 스탠다드 이론반
단위 테스트 란?
- Development: 개발
- Unit Tests (단위 테스트): 개발자 테스트
- QA Testing: 블랙박스 테스팅
주로 QA 팀이 Production 환경과 유사한 환경(Stage)에서 테스팅 - Production: 실 서비스 운영 환경
버그 발견 시간이 늦어짐에 따라 비용이 기하급수적으로 커지는 걸 알 수 있다
시간이 걸릴 수록 그 버그로 인해 피해본 사용자가 많아지기 때문 !
회사가 손해볼 수 있는 기능들은 무조건 테스트 기능이 있어야 하겠다... (ㅎㄷㄷ
테스트 코드를 작성한다면 프로그램의 버그를 사전에 발견하여
기하급수적인 비용의 증가가능성을 사전에 방지할 수 있다 !!
단위 테스트
작은 단위로 쪼개서 각 단위가 적확하게 동작하는지를 검사하는 테스트 기법
빠르게 작성할 수 있고 문제 발생 시 어느 부분이 잘못되었는지 빠르고 정확하게 확인할 수 있다는 장점
@BeforEach
// 각각의 테스트 코드가 실행되기 전에 수행되는 메서드를 만들어준다
@AfterEach
// 각각의 테스트 코드가 실행된 후에 수행되는 메서드를 만들어준다
@BeforeAll
// 모든 테스트 코드가 실행되니 전에 최초로 수행
@AfterAll
// 모든 테스트 코드가 실행된 후 마지막으로 수행
지인짜 어노테이션 너무 많아...
테스트 코드에서도 내부 메서드를 만들 수 있다
@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");
}
}
@DisplayName("테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 때")
void test1() {
System.out.println("테스트 내용 빠르게 파악");
}
@Nested
주제별로 테스트를 그룹지어 파악하기 좋다
@DisplayName
테스트의 내용을 한눈에 알아볼 수 있게 네이밍 해줄 때 (주석처리 느낌)
메서드 이름에 신경써줄 필요가 없어서 효율적으로 테스트 코드 작성 가능
@Order
메서드 단위로 순서를 매겨야 될 때 사용한다
사용 방법은 TestMethodOder어쩌고저쩌고이러쿵저러쿵 겁나 긴거
를 클래스 위에 달아줘야 한다
메서드를 반복해서 돌릴 수 있는 테스트 기능
// value = 5 >>> 메서드를 5번 반복할 건데
// {currentRepetition} / {totalRepetitions}
// 반복 회차 1 : 종합 회차 5
RepetitionInfo 를 통해 for 문 처럼 현재 반복 횟수와 총 횟수 값을 사용할 수 있다
@RepeatedTest(value = 5, name = "반복 테스트 {currentRepetition} / {totalRepetitions}")
void repeatTest(RepetitionInfo info) {
System.out.println("테스트 반복 : " + info.getCurrentRepetition() + " / " + info.getTotalRepetitions());
}
@RepeatedTest
메서드를 반복해서 돌릴 수 있는 테스트 기능
@DisplayName("파라미터 값 활용하여 테스트 하기")
@ParameterizedTest
@ValueSource(ints = {1, 2, 3, 4, 5, 6, 7, 8, 9})
void parameterTest(int num) {
System.out.println("5 * num = " + 5 * num);
}
@ValueSource
전달해주고 싶은 파라미터 값 (전달되는 파라미터 수 만큼 테스트 메서드가 수행된다)
반복해서 테스트를 수행해야할 때
@RepeatedTest , @ValueSource 두가지 중 상황에 맞게 테스트 코드를 작성하면 될 것 같다
제에에에에에일 중요한 검증할 때 사용하는 Assertions 패키지 에 들어있는 기능들
Given - When - Then 패턴 : 테스트 코드 스타일을 표현하는 방식
테스트 코드 작성하는 스타일이 여러가지 있는데 그중에 굉장히 유명하고 대중적인 방식이다
Given 은 테스트 하고자 하는 대상을 실제로 실행하기 전에 그 테스트에 필요한 값들을 미리 선언
When 은 테스트 하고자 하는 대상을 실제로 실행시킨다
Then 은 어떤 특정한 행동 때문에 발생할 거라고 예상되는 결과에 대해 예측하고 또 맞는지 확인
@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);
}
엄청 특별할 것도 어려울 것도 없이 그냥 우리가 테스트 코드를 좀 더 알아보기 쉽게
그리고 협업하는 과정에서 이런 테스트 코드 짜는 방식이 다 다르면 문제가 발생할 수 있다
해당 테스트 코드를 작성한 사람이 퇴사하면 다른 분들이 작성을 해야 하기 때문에
테스트 코드 스타일을 맞추는 것도 개발 스타일 맞추는 것 만큼 중요하다
그렇기에 테스트 코드 작성하는 패턴들이 많이 생겨났고 그중에 GWT 패턴이 유명한 패턴 중 하나다
❇️ 결론
- Give 우리가 줘야할 데이터, 테스트할 때 필요한 데이터
- When 실행하는 거
- Then 검증하는 거
https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations
🔺🔺🔺🔺🔺
Junit5 에 어떤 annotation들을 제공하고 있는지 볼 수 있당
'개발 일지 > TIL' 카테고리의 다른 글
[ #43 ] TIL (0) | 2024.06.17 |
---|---|
[ #42 ] TIL (0) | 2024.06.14 |
[ #40 ] TIL (0) | 2024.06.12 |
[ #39 ] TIL (3) | 2024.06.11 |
[ #37 ] TIL (0) | 2024.06.07 |