Go testing 패키지

Jmnote (토론 | 기여)님의 2023년 6월 5일 (월) 23:07 판 (→‎벤치마크)

1 개요

Go testing 패키지
  • Go 표준 라이브러리의 하나
  • 자동 테스트를 지원하는 Go 패키지
  • 모든 기능 실행을 자동화하는 "go test" 명령과 함께 사용하기 위한 것이다.
func TestXxx(*testing.T)
  • 여기서 Xxx는 소문자로 시작하지 않는다. 함수 이름은 테스트 루틴을 식별하는 역할을 한다.
  • 이러한 함수 내에서 Error, Fail 또는 관련 메서드를 사용하여 오류를 알린다.
  • 새 테스트 도구 모음을 작성하려면 여기에 설명된 대로 TestXxx 함수가 포함된 파일을 만들고 해당 파일에 "_test.go"로 끝나는 이름을 지정한다. 일반 패키지 빌드에서는 제외되지만 "go test" 명령어가 실행될 때는 포함된다.
  • 테스트 파일은 테스트 중인 것과 동일한 패키지에 있거나 접미사가 "_test"인 해당 패키지에 있을 수 있다.
  • 테스트 파일이 동일한 패키지에 있는 경우 다음 예제와 같이 패키지 내에서 unexported 식별자를 참조할 수 있다.
package abs

import "testing"

func TestAbs(t *testing.T) {
    got := Abs(-1)
    if got != 1 {
        t.Errorf("Abs(-1) = %d; want 1", got)
    }
}
  • 파일이 별도의 "_test" 패키지에 있는 경우 테스트 중인 패키지를 명시적으로 가져와야 하며 exported 식별자만 사용할 수 있습니다. 이것은 "블랙박스" 테스트로 알려져 있다.
package abs_test

import (
	"testing"

	"path_to_pkg/abs"
)

func TestAbs(t *testing.T) {
    got := abs.Abs(-1)
    if got != 1 {
        t.Errorf("Abs(-1) = %d; want 1", got)
    }
}

2 벤치마크

func BenchmarkXxx(*testing.B)

위와 같은 형식은 벤치마크로 간주되며 -bench 플래그가 입력되면 "go test" 명령어에 의해 실행된다. 벤치마크는 순차적으로 실행된다.

테스트 플래그에 대한 설명은 https://golang.org/cmd/go/#hdr-Testing_flags 을 참조하자.

아래는 벤치마크 함수 예시이다.

func BenchmarkRandInt(b *testing.B) {
    for i := 0; i < b.N; i++ {
        rand.Int()
    }
}

벤치마크 함수는 대상 코드를 b.N 번 실행된다. 벤치마크 실행 중에 b.N은, 시간을 안정적으로 측정할 수 있을 만큼 벤치마크 함수가 충분히 오래 지속되도록 조정된다.

BenchmarkRandInt-8   	68453040	        17.8 ns/op

위 결과는 루프당 17.8ns의 속도로 68453040회 실행되었음을 의미한다.

벤치마크를 실행하기 전에 비용이 많이 드는 설정이 필요한 경우에는 타이머를 리셋할 수 있다.

func BenchmarkBigLen(b *testing.B) {
    big := NewBig()
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        big.Len()
    }
}

3 같이 보기

4 참고

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}