단위 테스트
- 어떤 단위의 코드를 테스트하려고 테스트 코드를 작성하는 것
=> 이러한 단위 테스트를 작성하는 이유는,
1. 어떤 기능을 막 작성했고, 그것이 예상한대로 동작하는지 확인하기 위해
2. 작성한 변경사항을 문서화해서 자신과 다른 사람들이 나중에 이해하도록 하기 위해
3. 기존 동작을 깨뜨리지 않았는지 확인하기 위해
4. 시스템의 현재 동작을 확인하기 위해
5. 서드 파티 코드가 더 이상 기대한대로 동작하지 않는지 확인하기 위해
단위 테스트와 통합 테스트의 차이
-단위 테스트는 소프트웨어의 가장 작은 단위, 즉 개별적인 함수나 메서드를 테스트하는 것이고, 통합 테스트는 소프트웨어의 여러 구성 요소(모듈, 서비스, 시스템 등)를 결합하여 이들이 함께 올바르게 동작하는지 검증하는 테스트.
https://f-lab.kr/insight/unit-vs-integration-test 참고
기본 메서드
BeforeEach, AfterEach
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.*;
public class CalculatorTest {
private Calculator calculator;
@BeforeEach
public void setUp() {
calculator = new Calculator();
}
@Test
public void testAddition() {
int result = calculator.add(2, 3);
assertEquals(5, result);
}
@Test
public void testSubtraction() {
int result = calculator.subtract(5, 3);
assertEquals(2, result);
}
@AfterEach
public void tearDown() {
calculator = null;
}
}
- @BeforeEach: 각 테스트 메서드가 실행되기 전에 실행되어야 하는 작업을 정의함
- @AfterEach : 각 테스트 메서드 후에 실행
BeforeAll, AfterAll
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
public class ExampleTest {
@BeforeAll
static void initAll() {
System.out.println("Before all tests");
// 여기서 공통적인 자원을 초기화할 수 있습니다.
}
@Test
void testOne() {
System.out.println("Executing test one");
}
@Test
void testTwo() {
System.out.println("Executing test two");
}
}
- BeforeAll : 테스트 실행 전에 단 한 번만 호출됨
- AfterAll : 모든 테스트 실행 후에 단 한 번 호출 됨.
- 보통 아래와 같은 사례로 쓰인다.
- 데이터베이스 연결: 테스트가 시작되기 전에 데이터베이스 연결을 설정하고, 모든 테스트가 완료된 후에 연결을 해제하는 작업.
- 파일 생성/삭제: 테스트 전에 필요한 파일을 생성하고, 테스트가 끝난 후에 해당 파일을 삭제하는 작업.
- 서버 시작/종료: 통합 테스트의 경우, 테스트 실행 전에 임베디드 서버를 시작하고, 모든 테스트가 완료된 후에 서버를 종료하는 작업.
AfterAll
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Test;
public class ExampleTest {
@AfterAll
static void tearDownAll() {
System.out.println("After all tests");
// 여기서 공통적인 자원을 해제할 수 있습니다.
}
@Test
void testOne() {
System.out.println("Executing test one");
}
@Test
void testTwo() {
System.out.println("Executing test two");
}
}
- junit 5.8 이전 버전에는 beforeAll과 afterAll을 사용할 때
Disabled
@Disabled("Not implemented yet")
@Test
void testFeatureX() {
}
- 테스트를 실행하지 않게끔 하는 메서드
Assertions
- 실제 결과와 예상 결과를 비교하는데 사용
assertEquals
@Test
void testAssertEquals() {
int expected = 42;
int actual = 40 + 2;
assertEquals(expected, actual);
}
- 두 값이 같은 것인지 비교하는데 사용
assertTrue
@Test
void testAssertTrue() {
assertTrue(5 > 3);
}
- test결과가 True인지 확인
assertFalse
@Test
void testAssertFalse() {
assertFalse(5 < 3);
}
- test 결과가 false 인지 확인
assertNull
@Test
void testAssertNull() {
String str = null;
assertNull(str);
}
- 객체가 null 인지 확인
assertNotNull
@Test
void testAssertNotNull() {
String str = "Hello, JUnit 5";
assertNotNull(str);
}
- 객체가 not null인지 확인
assertThrows
@Test
void testAssertThrows() {
assertThrows(IllegalArgumentException.class, () -> {
throw new IllegalArgumentException("Invalid argument");
});
}
- 특정 예외가 발생하는지 확인
그 외 Hamcrest 라이브러리
dependencies {
// Hamcrest 추가
testImplementation 'org.hamcrest:hamcrest:2.2'
}
- dependency에 hamcrest 관련 라이브러리를 추가할 수 있음
import org.junit.jupiter.api.Test;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
public class HamcrestTest {
@Test
void testHamcrestMatchers() {
String str = "Hello, Gradle with Hamcrest!";
// 문자열이 "Hello"로 시작하는지 확인
assertThat(str, startsWith("Hello"));
// 문자열이 "Hamcrest!"로 끝나는지 확인
assertThat(str, endsWith("Hamcrest!"));
// 문자열의 길이가 29인지 확인
assertThat(str.length(), is(29));
}
}
주요 햄 크레스트 matcher
- is(): 값이 일치하는지 확인함
- equalTo(): 값이 동일한지 확인함
- not(): 조건이 일치하지 않는지 확인함
- startsWith(), endsWith(): 문자열의 시작 또는 끝이 특정 문자열과 일치하는지 확인함
- containsString(): 문자열이 특정 부분 문자열을 포함하는지 확인함
- greaterThan(), lessThan(): 숫자 비교를 수행함.
'TDD' 카테고리의 다른 글
TDD 사이클 (0) | 2024.09.16 |
---|---|
Test Smell 처리 방법 (0) | 2024.09.09 |
Mock과 Stub의 차이 (0) | 2024.09.09 |
좋은 테스트의 요건 - RIGHT BICEP (0) | 2024.08.31 |
좋은 테스트의 요건 - FIRST (0) | 2024.08.31 |