코틀린

Kotlin Unit Test 하는법

태인킴 2020. 12. 10. 23:32
반응형


1. 의존성 설정

먼저, 코틀린 테스트를 위해서 아래와 같이, dependency를 설정해 주어야 합니다.

dependencies {
   // kotlin unit test
    testImplementation 'io.kotlintest:kotlintest-runner-junit5:3.3.0'
}

 

 

2. kotlin Unit Test

KotlinTest는 Spec이라는 여러 종류의 테스트 스타일을 지원 합니다. StringSpec, FunSpec, ShouldSpec, WordSpec, BehaivorSpec, AnnotationSpec 등이 있습니다. 이 클래스들을 상속하여 사용하면 됩니다. 이 Spec들은 테스트를 설명하는 description만 다를 뿐 입니다.

 

 

3. Unit Test - String Spec

class StringSpecTest : StringSpec() {
    init {
        "strings.length should return size of string" {
            "hello".length shouldBe 5
        }
    }
}

그 중 가장 간단한 것StringSpec 입니다. StringSpec을 상속받아 위와 같이 작성 할수 있습니다. StringSpec은 보통 init 안에서 테스트 코드를 작성 합니다. "strings.length should return size of string"는 단순히 테스트를 설명하는 description 입니다. 괄호 안에 블럭은 실제 테스트를 진행하는 부분 입니다.

 

 

4. Unit Test - Fun Spec

class FunSpecTests : FunSpec({
    test("String length should return the length of the string") {
        "sammy".length shouldBe 5
        "".length shouldBe 0
    }
})

Fun Spec은 함수 형태로 테스트 코드를 작성하도록 도와 줍니다. "strings.length should return size of string"은 역시 descripton 부분 입니다. test 함수 블럭 안에서 실제 테스트를 진행하면 됩니다.

 

 

5. Unit Test - Should Spec

class ShouldSpecTests : ShouldSpec({
    should("return the length of the string") {
        "sammy".length shouldBe 5
        "".length shouldBe 0
    }
})

Should Spec은 FunSpec과 비슷합니다. test 키워드 대신 should 키워드를 사용 합니다. "return the length of the string"은 역시 description 부분 입니다. 블럭 안에서 테스트를 진행 하면 되겠습니다.

 

 

6. Unit Test - Word Spec

class WordSpecTests : WordSpec({
    "String.length" should {
        "return the length of the string" {
            "sammy".length shouldBe 5
            "".length shouldBe 0
        }
    }
})

"String.length"context string 이라고 합니다. 이것은 어떤 환경에서 테스트를 진행한다는 것을 알려 줍니다. "return the length of the string" 역시 description 입니다. 그 블럭 안에서 실제 테스트를 진행 합니다.

 

 

7. Unit Test - Behavior Spec

class BehaviorSpecTests : BehaviorSpec({
    given("a broomstick") {
        `when`("I sit on it") {
            then("I should be able to fly") {
                // test code
            }
        }
        `when`("I throw it away") {
            then("it should come back") {
                // test code
            }
        }
    }
})

Behavior SpecBDD(Behavior-Driven Development) 스타일로 테스트 코드를 작성하도록 도와줍니다. given, when, then 키워드가 주어지고, then 안의 블럭에서 실제 테스트를 진행 합니다.

 

 

8. Unit Test - Annotation Spec

class AnnotationSpecExample : AnnotationSpec() {

    @BeforeEach
    fun beforeTest() {
        println("Before each test")
    }

    @Test
    fun test1() {
        1 shouldBe 1
    }

    @Test
    fun test2() {
        3 shouldBe 3
    }
}

Annotation Spec은 Junit 스타일로 테스트 코드를 진행 할수 있습니다.

 

 

9. Matcher

class MatcherTest : StringSpec() {
    init {
        "hello world" shouldBe haveLength(11)
        "hello" should include("ll")
        "hello" should endWith("lo")
        "hello" should match("he...")
        "hello".shouldBeLowerCase()

        val list = emptyList<String>()
        val list2 = listOf("aaa", "bbb", "ccc")
        val map = mapOf<String, String>(Pair("aa", "11"))

        list should beEmpty1()
        list2 shouldBe sorted<String>()
        map should contain("aa", "11")
        map should haveKey("aa")
        map should haveValue("11")
    }
}

테스트 작성을 도와주는 요소들을 Matcher 라고 합니다.

  • 'shouldBe' 동일함을 체크하는 Matcher 입니다.
  • haveLength()는 length가 11이어야 함을 체크 합니다.
  • include()는 파라미터가 포함되어 있는지 체크 합니다.
  • endWith()는 파라미터가 끝의 포함되는지 체크 합니다.
  • match()는 파라미터가 매칭되는지 체크 합니다.
  • shouldBeLowerCase()는 소문자로 작성되었는지 체크 합니다.
  • beEmpty()는 원소가 비었는지 체크 합니다.
  • sorted<String>()은 해당 자료형이 정렬 되었는지 체크 합니다.
  • contain()은 해당 원소가 포함되었는지 체크 합니다.
  • haveKey()는 해당 key가 포함되었는지 체크 합니다.
  • haveValue()는 해당 value가 포함되었는지 체크 합니다.

더 자세한 내용은 아래 github에서 확인하실수 있습니다.

 

kotest/kotest

Powerful, elegant and flexible test framework for Kotlin - kotest/kotest

github.com

반응형

'코틀린' 카테고리의 다른 글

코틀린 setter, getter  (0) 2021.02.20
코틀린 apply, with, let, also, run  (0) 2020.12.08
Kotlin 코루틴(Coroutine)  (0) 2020.12.07
코틀린 SAM 변환이 왜 되지 않을까?  (0) 2020.11.25
코틀린 6편 (lateinit)  (0) 2020.11.13