본문 바로가기
테스트/테스트코드

테스트코드 수동으로 직접 만들었을 때 단점 (테스트 프레임워크 안 쓸 때)

by 문자메일 2023. 1. 3.

1. 테스트 클래스와 메서드가 생길 때 마다 메인 메서드에 직접 코드를 추가해야 하고, 그럴수록 메인 메서드가 계속 커진다.

테스트 메서드를 개별적으로 실행하기도 어렵다.

 

2. 테스트가 실패한 경우 어떤 값이 나오길 기대하였고, 어떤 잘못된 값이 들어와 실패했는지 알 수 없는 단점이 존재함.

그리고 예외를 던지거나, try catch를 사용해야 하는 등 직접 구현해야 할 부분이 많아 불편하다.

 

3. 테스트 메서드별로 공통적으로 실행되어야 하는 기능이 있다면, 프레임워크 없이 수동으로 작성하면 메서드마다 중복이 생김. (아래 예시 코드에서는 Calculator 생성하는 var calculator = Calculator(5) 부분 중복 발생)

 

아래는 코틀린으로 작성한 수동 예시 코드 ( 프레임워크 없이 메인 메서드에서 작성한 테스트 메서드 직접 수행함)

 

package com.group.libraryapp.calculator

fun main(){
    val calculatorTest = CalculatorTest()
    calculatorTest.addTest()
    calculatorTest.minusTest()
    calculatorTest.multiplyTest()
    calculatorTest.divideTest()
}

class CalculatorTest{

    fun addTest(){
        // given
        val calculator = Calculator(5)

        // when
        calculator.add(3)

        // then
        if (calculator.number != 8){
            throw IllegalStateException()
        }
    }

    fun minusTest(){
        // given
        val calculator = Calculator(5)

        // when
        calculator.minus(3)

        // then
        if (calculator.number != 2){
            throw IllegalStateException()
        }
    }

    fun multiplyTest(){
        // given
        val calculator = Calculator(5)

        // when
        calculator.multiply(3)

        // then
        if (calculator.number != 15){
            throw IllegalStateException()
        }
    }

    fun divideTest(){
        // given
        val calculator = Calculator(5)

        // when
        calculator.divide(2)

        // then
        if (calculator.number != 2){
            throw IllegalStateException()
        }
    }

    fun divideExceptionTest(){
        // given
        val calculator = Calculator(5)

        // when
        try{
            calculator.divide(0)
        } catch (e: IllegalArgumentException){
            // 테스트 성공
            return
        } catch (e: Exception){
            throw IllegalStateException()
        }

        throw IllegalStateException("기대하는 예외가 발생하지 않았습니다.")
    }

}

 

 

JUnit @Test 붙였을 때랑 비교하면 // then 에 해당하는 결과 비교하는 부문이 assert로 대체되어 있고, 테스트 메서드 호출을 main 함수가 아닌 프레임워크에서 실행해준다는 점이 다름.

@Test
fun addTest(){
    // given
    val calculator = Calculator(5)

    // when
    calculator.add(3)

    // then
    assertThat(calculator.number).isEqualTo(8)
}

댓글