comnic's Dev&Life

[Golang] 8. 테스트(Testing, Coverage) 본문

Golang

[Golang] 8. 테스트(Testing, Coverage)

comnic 2023. 12. 31. 10:25
반응형

8. 테스트(Testing, Coverage)

 

8.1 단위 테스트(Unit Testing)

단위 테스트:

  • 소프트웨어의 최소 단위(함수, 메소드, 모듈 등)에 대한 테스트를 수행하는 것입니다.
  • Go 언어에서는 testing 패키지를 사용하여 단위 테스트를 작성합니다.

 

간단한 함수와 테스트코드를 작성하고 실행해 보겠습니다.

// calculator.go

package calculator

func Add(a, b int) int {
    return a + b
}

위와 같이 덧셈을 하는 함수 하나를 구현한 후, 이를 테스트하기 위한 코드를 아래와 같이 작성합니다.

// calculator_test.go

package calculator

import "testing"

func TestAdd(t *testing.T) {
    result := Add(2, 3)
    expected := 5

    if result != expected {
        t.Errorf("Add(2, 3) returned %d, expected %d", result, expected)
    }
}
  • 테스트를 위해서는 동일한 폴더에 xxxx_test.go라는 이름으로 파일을 작성합니다.
  • 테스트 함수의 이름은 TestXxxx(t *testing.T)로 작성합니다.

테스트 실행

$ go test

PASS
ok      calculator      0.516s

위 소스에서 expected를 6으로 바꾸어 잘 못된 경우를 가정하고 실행해보면 아래와 같이 출력됩니다.

--- FAIL: TestAdd (0.00s)
    calculator_test.go:12: Add(2, 3) returned 5, expected 6
FAIL
exit status 1
FAIL    calculator      0.243s

 

테스트 함수는 testing.T 포인트를 인자로 받아서 처리하는데, 좀 더 자세히 알아보겠습니다.

 

8.2 testing.T 타입

*testing.T는 Go 언어에서 테스트를 작성하고 실행할 때 사용되는 테스트 핸들러(테스트 객체)를 나타냅니다. 이 핸들러를 통해 테스트 함수에서 여러 테스트 도구 및 동작을 사용할 수 있습니다.

주요 메서드들

- Errorf(format string, args ...interface{})

  • 테스트가 실패한 경우 에러를 기록하고 테스트를 중단합니다.
  • 포맷 문자열과 포맷 문자열에 대응하는 인자를 받아 에러를 기록합니다.

- Fail() / FailNow()

  • Fail: 테스트를 실패 상태로 표시하고 계속 진행합니다.
  • FailNow: 테스트를 실패 상태로 표시하고 즉시 중단합니다.

- Log(args ...interface{}) / Logf(format string, args ...interface{})

  • Log: 메시지를 로그에 기록합니다.
  • Logf: 포맷 문자열과 포맷 문자열에 대응하는 인자를 받아 메시지를 로그에 기록합니다.

- Skip(args ...interface{}) / Skipf(format string, args ...interface{})

  • Skip: 테스트를 스킵하고 해당 테스트는 무시됩니다.
  • Skipf: 포맷 문자열과 포맷 문자열에 대응하는 인자를 받아 테스트를 스킵하고 해당 테스트는 무시됩니다.

- Helper()

  • 현재 테스트가 Helper 함수에서 호출된 경우를 확인할 때 사용됩니다.
  • Helper 함수에서 호출된 경우, 해당 함수는 테스트 결과에 표시되지 않습니다.

- Name() string

  • 현재 테스트 함수의 이름을 반환합니다.
  • 테스트 함수의 이름을 획득하여 특정 로직을 수행하고자 할 때 사용됩니다.

- *Run(subTestName string, subTest func(t testing.T))

  • 서브 테스트를 실행합니다. 서브 테스트가 실패하면 부모 테스트도 실패로 표시됩니다.
  • 서브 테스트는 부모 테스트의 독립적인 테스트로 간주됩니다.

*testing.T를 이용하여 테스트 함수에서 다양한 동작을 수행하고 테스트 결과를 확인할 수 있습니다. 이를 통해 테스트 코드를 작성하면 소프트웨어의 품질을 향상시키고 유지보수를 용이하게 할 수 있습니다.

 

8.3 테스트 커버리지(Test Coverage)

  • 소스 코드에서 얼마나 많은 부분이 테스트되었는지를 나타내는 지표입니다.
  • go test 명령을 실행할 때 -cover 플래그를 사용하여 테스트 커버리지를 확인할 수 있습니다.

테스트 커버리지 확인:

go test -cover

위 예제를 그대로 실행해 보면 아래와 같이 출력됩니다.

PASS
coverage: 100.0% of statements
ok      calculator      0.252s

모든 부분을 테스트 했기에 coverage가 100%로 나왔습니다.

여기서 위 소스 calculator.go에 아래와 같이 Sub 함수를 추가 해 보겠습니다.

// calculator.go

package calculator

func Add(a, b int) int {
    return a + b
}

func Sub(a, b int) int {
	return a - b
}

이대로 다시 coverage를 확인해 보면 아래와 같이 출력됩니다.

PASS
coverage: 50.0% of statements
ok      calculator      0.492s

coverage가 50%가 나왔습니다. 이렇게 현재 프로젝트의 코드 중 몇 %가 테스트를 커버하는지 알 수 있습니다.

 

테스트 패키지를 사용하여 소프트웨어의 각 부분이 예상대로 동작하는지 확인하고, 테스트 커버리지를 통해 어느 정도의 코드가 테스트되었는지 확인할 수 있습니다. 이를 통해 코드의 신뢰성을 높일 수 있습니다.

반응형
Comments