본문 바로가기

dev-log

GO의 자동화 테스트 정리

GO의 테스트 환경은 go test 툴과, 테스트와 관련된 컨벤션으로 구성된다. GO에서 테스팅 할 수 있는 요소는 자동화 테스트, 벤치마킹, 예시(go doc에서 활용)가 있다. 이 글에서는 자동화 테스트에 포커스를 두고 기록해본다.

 

컨벤션

go test 툴은 테스트 드라이버로 컨벤션이 맞춰진 패키지를 테스트한다. 이 드라이버는 패키지 디렉토리에서 _go.test 로 이루어진 파일에 대해 테스트를 수행한다. 이 파일에서 자동화 테스트, 벤치마킹, 예시를 작성하는데 자동화 테스트는 TestName과 같이 Test이 접두인 함수에 해당한다. 테스트 함수의 컨벤션은 다음과 같다.

// 파라미터는 테스트에 대한 로깅, 리포트와 관련된 메소드를 제공한다.
func TestName(t *testing.T) { /* ... */ }

 

 

함수 내에 하나의 테스트 케이스만 작성할 수 있고 여러 개를 작성할 수도 있다. 여러개를 작성할 경우 표준적으로 따르는 컨벤션은 다음과 같은 형태를 가진다(대개 이런식으로 많이 짬)

func TestSomething(t *testing.T) {
  var tests = []struct {
      // The structure of test case
    input string
    want bool
  }{
      // actual case
      { "", true }
  }

  // Loop in cases
  for _, test := range tests {
      // the name got is the god
      if got := SomeThing(test.input); got != test.want {
        t.Errorf("Something(%q) = %v, want %v", test.input, got, want)
    }
  }
}

 

테스트가 깨질 때 Errorf를 호출하면 전체 Stack trace를 보고하지 않으며 panic도 일으키지도 않고 테스트 드라이버가 종료되지도 않음. Vitest의 동시 테스팅 느낌이 많이 든다. 그런데 Fatalf를 호출하면 panic을 일으킴.

GO에서는 리포트 포맷을 "f(x) = y, want z" 의 형태로 많이 사용한다고 한다.

 

 

많이 활용하는 패키지들

1. wailsmateryer/is 라는 패키지를 사용한다. assertion 문법과 리포트 메시지가 간단하다.

2. superbase는 github.com/stretchr/testify 라는 패키지를 사용한다. 이 패키지는 go test 툴 말고 되는 디 팩토 스탠다드라고 한다.

3. Docker(현 moby)는 gotest.tools/v3/assert 라는 패키지를 만들어서 사용한다. 

 

데이터베이스 스텁을 많이 만드는지?

반반인듯.

https://blog.boot.dev/clean-code/writing-good-unit-tests-dont-mock-database-connections/

https://www.reddit.com/r/golang/comments/qe4a1c/what_mocking_framework_do_you_prefer/?rdt=42618

 

'dev-log' 카테고리의 다른 글

[Granola] 프로젝트 1차 이터레이션 회고  (1) 2025.01.15
[Granola] 002  (0) 2025.01.07
Two Events  (0) 2025.01.06
[Granola] 001  (0) 2025.01.03
[Javascript] Promise.all  (1) 2024.12.09