본문 바로가기
개인 프로젝트/coin

[Project Coin] 단위 테스트(1) _ Unit Test란? & Table Test

by _royJang 2022. 8. 10.

시작

나는 Unit Test를 내 프로젝트에 적용해본 경험은 없다. 하지만 인턴을 경험하며 이에 대한 필요성을 절실히 느낀 경험이 있다.

코드에 조금만 손을 데도 새로 배포하고 웹을 통해 데이터가 원하는 형태로 출력되는지 확인하고.. 아니면 다시 반복.....

만약 내가 Unit Test를 작성하기 위한 준비가 돼 있는 상태였다면 프로젝트의 완성도는 훨씬 높아졌을 것이라 확신한다.

앞으로 이런 아쉬움을 남기지 않기 위해 Unit Test에 대해 공부하고 전략들을 잊지않게 추가해 나가려 한다.

Unit Test란?

유닛 테스트(unit test)는 컴퓨터 프로그래밍에서 소스 코드의 특정 모듈이 의도된 대로 정확히 작동하는지 검증하는 절차다. 즉, 모든 함수와 메소드에 대한 테스트 케이스(Test case)를 작성하는 절차를 말한다. 이를 통해서 언제라도 코드 변경으로 인해 문제가 발생할 경우, 단시간 내에 이를 파악하고 바로 잡을 수 있도록 해준다. 이상적으로, 각 테스트 케이스는 서로 분리되어야 한다. 이를 위해 가짜 객체(Mock object)를 생성하는 것도 좋은 방법이다. 유닛 테스트는 (일반적인 테스트와 달리) 개발자(developer) 뿐만 아니라 보다 더 심도있는 테스트를 위해 테스터(tester)에 의해 수행되기도 한다.

(참조 https://ko.wikipedia.org/wiki/%EC%9C%A0%EB%8B%9B_%ED%85%8C%EC%8A%A4%ED%8A%B8)

Unit Test의 장점

  • 테스트를 실행하는데 비용이 적다.
  • 새로운 기능을 추가할 시에 빠르게 테스트 할 수 있다.
  • 리팩토링 시에 코드의 오류를 즉시 발견할 수 있다.
  • 코드에 대한 문서가 될 수 있다.

Unit Test의 단점

  • 진입장벽이 높다.(ㅠㅠ)
    ex) 다른 모듈과 의존성이 있는 경우 Test는 가짜 Object를 주입하여 Test를 진행해야 한다.

Table Test

func TestSplitter(t *testing.T) {
    type test struct {
        input  string
        sep    string
        index  int
        output string
    }
    tests := []test{
        {input: "0:6:0", sep: ":", index: 1, output: "6"},
        {input: "0:6:0", sep: ":", index: 10, output: ""},
        {input: "0:6:0", sep: "/", index: 0, output: "0:6:0"},
    }
    for _, tc := range tests {
        got := Splitter(tc.input, tc.sep, tc.index)
        if got != tc.output {
            t.Errorf("Expected %s and got %s", tc.output, got)
        }
    }
}

function에 테스트를 정의해 놓고 그 모든 테스트를 for loop로 빠르게 테스트하는 것.


coverage check tool

html 환경에서 코드의 covered 코드를 확인할 수 있음

go tool cover -html=cover.out

결과