테스트 코드

rami·6일 전
0

Today I Learned

목록 보기
35/38

프로젝트 세팅

Kotlin 프로젝트의 build.gradle.kts 파일에 테스트 관련 라이브러리를 추가해야 합니다.

dependencies {
    testImplementation("org.junit.jupiter:junit-jupiter:5.10.0") // JUnit 5 라이브러리 또는 4
    testImplementation("io.mockk:mockk:1.13.7") // Mock 라이브러리 (선택)
}

tasks.test {	       // 테스트 태스크도 설정
    useJUnitPlatform() // JUnit 플랫폼 사용
}

테스트 파일 작성

클래스에 커서를 두고 alt + insert 누르면 Generate이 뜨는데 test를 택하면 test 디렉토리에 해당 테스트 클래스가 자동으로 생성됩니다.

테스트 코드 구성

import org.junit.jupiter.api.Test
import org.junit.jupiter.api.Assertions.*

class ExampleTest {

    @BeforeEach	// Lifecycle 메서드 (junit4에서는 Each떼고)
    fun setup() {
        println("테스트 실행 전 준비 작업")
    }

    @AfterEach
    fun tearDown() {
        println("테스트 실행 후 정리 작업")
    }

	@Test
	fun testException() {
    val exception = assertThrows<IllegalArgumentException> {
        throw IllegalArgumentException("예외 발생")
    }
    assertEquals("예외 발생", exception.message)
	}
    
    @ParameterizedTest	// 파라미터화 테스트
    @ValueSource(ints = [1, 2, 3, 4, 5])
    fun testValueSource(value: Int) {
        assertTrue(value > 0) // 모든 값이 0보다 큰지 확인
    }
}

테스트 코드 패턴

  • AAA (Arrange-Act-Assert)
    단순한 논리와 검증을 포함할 때 더 일반적으로 사용됩니다.
    @Test
	fun testStringLength() {
    // Arrange : 테스트의 초기 상태를 설정. 테스트에 필요한 객체나 데이터 준비
    val input = "Kotlin"

    // Act : 동작을 수행하거나 메서드를 호출
    val length = input.length

    // Assert :예상 결과와 실제 결과를 비교
    assertEquals(6, length) // 길이가 6인지 확인
	}
  • GWT (Given-When-Then)
    주로 행위 기반 테스트(Behavior-Driven Development, BDD)에서 사용됩니다.
import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Test

class CalculatorTest {

    @Test
    fun `should return correct sum`() {
        // Given : 테스트의 초기 상태를 설정 (조건, 전제 조건)
        val calculator = Calculator()
        val a = 5
        val b = 10

        // When : 수행하려는 동작이나 이벤트를 명시
        val result = calculator.add(a, b)

        // Then : 기대하는 결과를 명확히 작성
        assertEquals(15, result)
    }
}

class Calculator {
    fun add(a: Int, b: Int) = a + b
}

테스트 검증 메서드

assertEquals(expected, actual)	두 값이 같은지 비교
assertNotEquals(expected, actual)	두 값이 같지 않은지 확인
assertTrue(condition)	조건이 참인지 확인
assertFalse(condition)	조건이 거짓인지 확인
assertNull(value)	값이 null인지 확인
assertNotNull(value)	값이 null이 아닌지 확인
assertThrows(exceptionClass, executable)	특정 예외가 발생했는지 확인
assertDoesNotThrow(executable)	실행 중 예외가 발생하지 않는지 확인
assertContains(collection, element)	컬렉션에 특정 요소가 포함되어 있는지 확인.
assertFailsWith<T>()	특정 예외 발생 여부 확인
assertIs<T>()	객체의 타입이 특정 타입인지 확인

Mock 객체를 사용하는 이유

Mock 객체는 주로 단위 테스트(Unit Test)에서 외부 의존성을 모킹(mocking)하여 테스트 환경을 통제하고, 테스트 대상을 격리하는 데 사용됩니다. 모킹을 통해 실제 객체를 사용하는 대신, 테스트에 필요한 가짜 객체를 사용하여 테스트의 일관성, 속도, 안정성을 높일 수 있습니다.

profile
앞으로 나아가는 사람

0개의 댓글