Kotest 자원(Resources)

Kotest에서의 리소스 자동으로 닫도록 하는 방법과 테스트에 필요한 파일 및 디렉터리 임시 생성 방법에 대해서 설명한다.

자동으로 리소스 닫기

모든 테스트가 실행된 후 Kotest가 자동으로 리소스를 닫도록 할 수 있다:

Kotest의 autoClose 함수를 사용하면, 특정 리소스를 사용 후 자동으로 리소스를 해제할 수 있어, 리소스 관리를 간편하게 해준다. 주로 테스트에서 외부 리소스를 사용할 때 사용되며, 리소스 해제를 명시적으로 처리하지 않고도 자동으로 처리할 수 있다.

예를 들어, 파일이나 데이터베이스 연결과 같은 외부 리소스를 테스트에서 사용하는 경우, 해당 리소스를 사용한 후에는 명시적으로 리소스를 해제해야 한다. 하지만 autoClose를 사용하면 테스트가 끝나면 리소스가 해제된다.

package com.devkuma.kotest.tutorial.resources

import io.kotest.core.spec.style.StringSpec
import io.kotest.matchers.shouldBe
import java.io.StringReader

class StringTest : StringSpec({

    val reader = autoClose(StringReader("xyz"))

    "test" {
        val text = reader.readText()

        println(text)

        text shouldBe "xyz"
    }
})

이 방법으로 닫아야 하는 리소스는 java.lang.AutoCloseable을 구현해야 한다. 닫기는 마지막 사양 인터셉터가 반환된 후 선언 순서가 역순으로 수행된다.

임시 파일

테스트에 파일을 생성하고 테스트 후 삭제해야 하는 경우가 있는데, 수동으로 삭제하면 테스트가 실패할 수 있다.

예를 들어, 테스트 중에 임시 파일을 생성하고, 테스트가 성공적으로 통과하면 정리 코드가 실행되고 파일이 삭제된다. 그러나 단언문이 실패하거나 다른 오류가 발생하여 파일이 삭제되지 않은 경우, 다음 실행 시 테스트에 영향을 줄 수 있는 부실 파일이 생성된다(파일 덮어쓰기 불가 예외 등).

예를 들어, 테스트 중에 임시 파일을 사용할 수 있는데, 테스트가 성공적으로 통과하면 정리 코드가 실행되고 파일이 삭제되록 하였다고 하자. 여기서 단언문이 실패하거나 다른 오류가 발생하여 파일이 삭제되지 않을 수 있는 경우, 다음 실행 시 테스트에 영향을 줄 수 있는 오래된 파일을 받게 된다(파일을 덮어쓸 수 없음 예외 등).

Kotest는 스펙에서 테스트용 임시 파일을 생성하는 데 사용할 수 있는 tempfile() 함수를 제공하며, 이 함수는 스펙의 모든 테스트를 실행한 후 Kotest가 정리를 하게 된다. 이렇게 하면 테스트에서 임시 파일을 삭제할 걱정할 필요가 없어진다.

package com.devkuma.kotest.tutorial.resources

import io.kotest.core.spec.style.FunSpec
import io.kotest.engine.spec.tempfile
import io.kotest.matchers.shouldBe
import java.io.FileReader

class TempFileTest : FunSpec({

    val file = tempfile()

    test("a temporary file dependent test") {
        // 파일 경로
        println(file.path)

        // 파일 쓰기
        val text = "Hello, Kotest!"
        file.writeText(text)

        // 파일 읽기
        val reader = autoClose(FileReader(file))
        reader.readText() shouldBe text
    }
})

임시 디렉터리

임시 파일과 마찬가지로 tempdir()을 사용하여 임시 디렉터리를 만들 수 있다.

package com.devkuma.kotest.tutorial.resources

import io.kotest.core.spec.style.FunSpec
import io.kotest.engine.spec.tempdir
import io.kotest.matchers.shouldBe

class TempDirTest : FunSpec({

    val dir = tempdir()

    test("a temporary dir dependent test") {
        println(dir.path)

        dir.isDirectory shouldBe true
    }
})

참조




최종 수정 : 2024-04-21