본문 바로가기

공부 자료/코틀린[Kotlin]

[Atomic 22] 테스트

프로그램을 빠르게 개발하기 위한 필수
'지속적인 테스트'

 

 

우리는 코드를 짰을 때 이 코드를 내가 의도한 대로 잘 짰는지, 내부적으로 실행되었을 때 잘못된 곳은 없는지 확인하는 과정이 필요하다.

우리는 이를 위해 println을 사용하여 올바름을 검증하는 것은 부실한 접근 방법이기에 테스트를 배운다.

 

 


 

[ 테스트 ]

 

테스트

- JUnit : 자바에서 널리 쓰이는 테스트 프레임워크로 코틀린에서도 유용하게 사용

- 코테스트 : 코틀린 전용으로 설계되어 코틀린 언어의 여러 기능을 살려 작성

- 스펙 프레임워크 : 명세 테스트라는 다른 형태의 테스트 제공

 

* 아래에서 사용하는 테스트의 경우 Atomic Kotlin 책에서 제공하는 테스트 프레임워크로 아래와 같은 특징을 가지고 있음을 참고

- 식의 예상 결과값을 보여줌

- 프로그램이 실행되고 있음을 알 수 있도록 출력을 제공하며, 모든 테스트가 성공해도 출력을 제공

- 개발을 배우는 과정에서 더 빨리 테스트의 개념을 몸에 익히도록 함

 


 

[ 중위 표기법 ]

- 전위 / 중위 / 후위 표기법이 존재

- infix function() : 중위 표기법으로, a.함수(b)라는 호출을 a 함수 b 처럼 호출자 점(.)과 파라미터 괄호를 생략하고 함수 명만으로 호출할 수 있도록 코틀린에서 제공하는 표현식

- infix 키워드를 붙인 함수만 중위 표기법을 사용해 호출 가능

 

* AtomicTest에서는 infix 키워드를 이용해 infix eq, infix neq가 정의되어 있어 '식 eq / neq 예상값' 으로 사용

* 실행 값이 T일 경우 왼쪽 식의 결과를 출력하며, F일 경우 실행하면서 오류를 보여줌

package atomictest

fun main(){
    val v1 = 11
    val v2 = "Ontology"

    v1 eq 11 // 출력 결과 : 11
    v2 eq "Ontology" // 출력 결과 : Ontology

    v2 neq "Epistemology" // 출력 결과 : Ontology
    v2 eq "Epistemology" // 출력 결과 : [Error]: Ontology != Epistemology
}

 

 

* AtomicTest에서는 println()을 대체할 수 있는 trace()함수(출력을 저장해서 나중에 사용할 수 있도록 함)가 존재

package atomictest

fun main(){
    trace("line 1")
    trace(47)
    trace("line 2")

    trace eq """
        line 1
        47
        line 2
    """
    // 출력 결과 : 
    //line 1
    //47
    //line 2
}

 

 


 

[ 테스트 주도 개발 TDD ]

 

TDD(Test Driven Development, TDD)

- 테스트 주도 개발

- 코드를 작성하기 전에 테스트를 먼저 작성해 실패시킨 후, 나중에 테스트를 통과하도록 코드를 작성

- 자신이 생각하는 대상을 정말로 테스트하고 있는지 확실히 확인할 수 있는 방법

 

* 아래는 테스트를 실패시킨 후 결과를 통해 테스트를 통과할 수 있도록 코드를 Develop 시킨 것을 볼 수 있다.

 

[ 테스트 실패 ]

package testing1
import atomictest.eq

fun main(){
    calculateBMI(160.0, 68.0) eq "Normal weight"
    calculateBMI(100.0, 68.0) eq "Underweight"
    calculateBMI(200.0, 68.0) eq "Overweight"
}

fun calculateBMI(weight:Int, height:Int) = "Normal weight"

 

 

[ 테스트 성공 ]

package testing1
import atomictest.eq

fun main(){
    calculateBMI(160.0, 68.0) eq "Normal weight"
    calculateBMI(100.0, 68.0) eq "Underweight"
    calculateBMI(200.0, 68.0) eq "Overweight"
}

fun calculateBMI(weight:Double, height:Double):String{
    val bmi = weight/(height*height)*703.07
    return if(bmi<18.5) "Underweight"
    else if(bmi<25) "Normal weight"
    else "Overweight"
}

 

 


 

[ 오늘의 학습 소감 ]

 

오늘은 테스트에 대해서 간략하게 보았다. 테스트는 실제로 코드를 작성하면서 매우 중요한 요소이지만 막상 코드를 짜면 테스트 코드 작성이 어려워 작성하지 못하는 경우가 많고 나 또한 이러한 경우 중 한명에 속하고 있다. 그렇기에 이번 아톰이 나에게는 매우 중요한 아톰 중 하나였다고 생각한다. 심화적인 테스트에 대해서  작성하지는 않았지만 infix function, TDD 기법 등 테스트에서 사용하는 것들에 대해서 간략하게 알 수 있었고, AtomicTest에서 제공한 프레임워크를 보고 (물론 어려워서 이해를 하지는 못했다) 테스트 코드를 작성하고 실행해 보면서 테스트에 대한 기초적인 부분은 익힐 수 있는 시간이었다.