모종닷컴

테스트 코드는 버그를 찢어 본문

Programming

테스트 코드는 버그를 찢어

모종 2022. 7. 29. 22:30
반응형

오늘의 주제는 테스트 코드를 적절하게 이용해서 버그를 예방하기입니다. (물론 아닐 수도 있지만..) 대개 테스트 코드를 작성하는 이유는 지속적으로 내가 만든 코드가 정상 동작하는지를 체크하기 위함일 겁니다. 하지만 이 외에도 테스트 코드는 정말 유용하게 사용할 수 있습니다. 

제약을 테스트 코드로

예시를 좀 들어보겠습니다. A 서버에는 Food라는 Enum 클래스가 존재합니다. B 서버에서는 A 서버의 이넘 클래스 정보를 가져와 외부에 등록을 한다고 합니다. 이때 외부에 등록하는 것이다 보니 사이즈나 길이 등의 제약이 존재하게 되었습니다. 최대 10자까지 등록할 수 있다고 하네요. 이러한 상황을 알고 있는 개발자가 Food안에 있는 Enum 값을 모두 10자리 미만으로 만들도록 하였고 주석도 잘 달아주었습니다. 그리고 시간이 지나 해당 개발자가 퇴사한 이후 다른 개발자가 주석을 제대로 보지 못하고 Food에 SPAGHETTI_WITH_CLAMS를 추가해버렸습니다. 해당 코드가 운영에 반영이 되고 나서 B 서버에서 A 서버로부터 받아온 데이터를 외부에 등록하다가 실패합니다.

위와 같은 상황처럼 이러한 제약들은 어플리케이션에서 알 수가 없고, 사람이 매번 이를 인지하고 개발을 할 수는 없는 노릇입니다. 이런 제약에 대한 문제를 테스트 코드로 짜게 되면 이러한 일들을 미연에 방지할 수 있게 됩니다.

enum class Food {
    PASTA,
    CHICKEN,
    PIZZA,
    SPAGHETTI_WITH_CLAMS;
}

class FoodTest {
    @Test
    fun `Food의 값의 길이는 10자리를 넘으면 안됩니다`() {
        assertTrue(Food.values().none { it.name.length > 10 })
    }
}

위와 같이 테스트 코드를 짜 놓으면 빌드가 실패할 테니 개이득입니다.

 

코딩 컨벤션도 챙기기

개발팀 내에 코딩 컨벤션이 존재할 겁니다. 위와 마찬가지로 우리는 사람이고 이 코딩 컨벤션을 잘 모르는 새로 들어온 개발자나 신입 개발자들은 실수할 수 있습니다. 예를 들어 Controller 클래스에는 반드시 Profile을 지정해야 한다고 가정해봅시다. 이걸 문서나 다른 어딘가에 정리해놓아도 안보는 사람은 분명 안 봅니다. 그렇다면 이걸 누가 챙기나요? 넵 테스트 코드가 해결해줄 수 있습니다.

코드가 개판인데 그냥 봐주세요!

제 코드 욕하지 마쉐여!

 

@Test
fun test(){
    val controllerClass = ReflectionUtils.findAllClassesInPackage(
        "com.tistory.monny",
        ClassFilter.of { c -> c.name.endsWith("Controller") && !c.isAnnotationPresent(Profile::class.java)}
    )

    assertEquals(0, controllerClass.size)
}

 

지금 당장 생각나는 용도가 위의 두 가지 뿐이지만 테스트 코드를 잘만 이용한다면 무궁무진하게 개발자의 실수를 줄여줄 수 있다고 생각합니다. 오늘도 읽어주셔서 감사합니다!

반응형