go help testflag

Jmnote (토론 | 기여)님의 2023년 6월 6일 (화) 14:48 판

1 개요

go help testflag

'go test' 명령어는 'go test' 자체에 적용되는 플래그와 결과 테스트 바이너리에 적용되는 플래그를 모두 사용한다.

일부 플래그는 프로파일링을 제어하며 "go tool pprof"에 적합한 실행 프로파일을 작성한다. 자세한 내용은 "go tool pprof -h"를 실행하여 알아보자. pprof의 --alloc_space, --alloc_objects, --show_bytes 옵션은 정보 표시방법을 제어한다.

다음 플래그는 'go test' 명령어에서 인식되며 테스트 실행을 제어한다.

-bench regexp
  • 정규식(regexp)과 매칭되는 벤치마크만 실행한다.
  • 기본적으로 벤치마크는 실행되지 않는다.
  • 모든 벤치마크를 실행하려면 '-bench .' 또는 '-bench=.' 를 사용하자.
  • 정규표현식은 대괄호가 없는 슬래시(/) 문자에 의해 시퀀스로 분할되며, 벤치마크 식별자의 각 부분은 시퀀스 내의 해당 요소(있는 경우)와 매칭되어야 한다. 서브 벤치마크를 식별하기 위해 매칭 항목의 가능한 상위 항목을 b.N=1로 실행한다. 예를 들어, -bench=X/Y가 주어지면 X와 일치하는 최상위 벤치마크는 b.N=1로 실행되어 Y와 일치하는 서브 벤치마크를 찾은 다음 전체가 실행된다.
-benchtime t
  • time.Duration(예: -benchtime 1h30s)으로 지정된 t를 얻기 위해 각 벤치마크를 충분히 반복 실행한다.
  • 기본값은 1초(1s)이다.
  • 특수 구문 Nx는 벤치마크를 N번 실행한다는 의미이다(예: -benchtime 100x).
-count n
  • 각 테스트, 벤치마크, 퍼즈 시드를 n번 실행합니다(기본값 1).
  • -cpu가 설정된 경우 각 GOMAXPROCS 값에 대해 n번 실행합니다.
  • Example은 항상 한 번 실행됩니다. -count는 -fuzz에 매칭되는 fuzz 테스트에 적용되지 않는다.
-cover
  • 커버리지 분석을 활성화한다.
  • 커버리지는 컴파일 전에 소스 코드에 주석을 달아 작동하기 때문에, 커버리지가 활성화된 컴파일 및 테스트 실패는 원래 소스와 일치하지 않는 행 번호를 보고할 수 있다.
-covermode set,count,atomic
  • 테스트되는 패키지에 대한 커버리지 분석 모드를 설정한다.
  • -race가 활성화되지 않은 경우 기본값은 "set"이며, 활성화된 경우 "atomic"이다.
  • 값:
set: bool: 이 문장이 실행되는가?
cont: init: 이 문장이 몇 번 실행되는가?
atomic: init: count와 유사하나, 멀티스레드 테스트에서 정확하다, 훨씬 비싼 테스트
  • -cover도 설정되어야 한다.
-coverpkg pattern1,pattern2,pattern3
  • 패턴과 매칭되는 패키지에 각 테스트의 커버리지 분석을 적용한다.
  • 기본값은 각 테스트가 테스트되는 패키지만 분석하는 것이다.
  • 패키지 패턴에 대한 설명은 'go help packages'를 참조하자.
  • -cover도 설정되어야 한다.
-cpu 1,2,4
  • 테스트, 벤치마크, 퍼지 테스트를 실행해야 하는 GOMAXPROCS 값 목록을 지정한다. 기본값은 GOMAXPROCS의 현재 값다. -cpu는 -fuzz에 매칭되는 fuzz 테스트에 적용되지 않는다.
-failfast
  • 첫째 테스트 실패 후 새 테스트를 시작하지 않는다.
-fuzz regexp
  • 정규표현식과 매칭되는 퍼즈 테스트를 수행한다. 명령줄 인수는 메인 모듈 내에서 정확히 하나의 패키지와 매칭되어야 하며 regexp는 해당 패키지 내에서 정확히 하나의 fuzz 테스트와 매칭되어야 한다. 퍼징은 테스트, 벤치마크, 다른 퍼즈 테스트의 시드 코퍼스, Example이 완료된 후에 발생한다. 자세한 내용은 테스트 패키지 문서의 Fuzzing 섹션을 참조하자.
-fuzztime t
  • time.Duration으로 지정된 t를 가지고(예: -fuzztime 1h30s), 퍼징하는 동안 퍼즈 대상을 충분히 반복하여 실행한다.
  • 기본값은 무기한으로 실행하는 것이다.
  • 특수 구문 Nx는 fuzz 대상을 N번 실행한다는 의미이다(예: -fuzztime 1000x).
-fuzzminimizetime t
  • time.Duration으로 지정된 대로(예: -fuzzminimizetime 30s), 각 최소화 시도 동안 퍼즈 대상을 충분히 반복하여 실행한다.
  • 기본값은 60s이다.
  • 특수 구문 Nx는 fuzz 대상을 N번 실행한다는 의미이다(예: -fuzzminimizetime 100x).
-json
  • 상세 출력 및 테스트 결과를 JSON으로 기록한다. 이는 머신리더블 포맷으로 -v 플래그와 동일한 정보를 표시한다.
-list regexp
  • 정규식과 매칭되는 테스트, 벤치마크, 퍼즈 테스트, Example을 나열한다. 테스트, 벤치마크, 퍼즈 테스트, Example가 실행되지는 않는다.
  • 이것은 최상위 테스트만 나열한다. 서브테스트 또는 서브벤치마크는 표시되지 않는다.
-parallel n
  • 시드 코퍼스를 실행할 때 t.Parallel을 호출하는 테스트 함수 및 t.Parallel을 호출하는 fuzz 대상의 병렬 실행을 허용한다.
  • 이 플래그의 값은 동시에 실행할 최대 테스트 수이다.
  • 퍼징하는 동안 이 플래그의 값은 T.Parallel 호출 여부와 관계없이, 동시에 fuzz 함수를 호출할 수 있는 최대 하위 프로세스 수이다.
  • 기본적으로 -parallel은 GOMAXPROCS 값으로 설정된다.
  • -parallel을 GOMAXPROCS보다 높은 값으로 설정하면 특히 퍼징 시 CPU 경합으로 인해 성능이 저하될 수 있다.
  • -parallel은 단일 테스트 바이너리 내에서만 적용된다.
  • 'go test' 명령은 -p 플래그 설정에 따라 다른 패키지에 대한 테스트도 병렬로 실행할 수 있다('go help build' 참조).
-run regexp
  • 정규식과 매칭되는 Test, Example, Fuzz 테스트만 실행한다. Test의 경우 정규식은 대괄호가 없는 슬래시(/) 문자로 정규식 시퀀스로 분할되며 테스트 식별자의 각 부분은 시퀀스의 해당 요소(있는 경우)와 매칭되어야 한다. 매칭되는 상위 항목도 실행되므로 -run=X/Y는 X와 일치하는 모든 테스트의 결과를 일치하고 실행하고 보고한다. 심지어 Y와 일치하는 하위 테스트가 없는 테스트도 일단 해당되는 하위테스트를 있는지 알아보기 위해 실행해야 하기 때문이다.
  • -skip도 참고하자.
-short
  • 오래 수행되는 테스트에 수행시간을 단축하도록 설정하자.
  • 기본적으로 off이지만 all.bash 중에 설정되며, Go tree를 설치하면 온전성(sanity) 검사를 실행하면서도 세세한 테스트를 실행하는 데 시간을 쓰지 않아도 된다.
-shuffle off,on,N
  • 테스트/벤치마크의 실행 순서를 무작위로 지정한다.
  • 기본값은 off이다. -shuffle이 on으로 설정된 경우 시스템 시계를 사용하여 랜덤마이저를 시드한다. -shuffle이 정수 N으로 설정되면 N이 시드 값으로 사용된다. 두 경우 모두 시는 재현성을 위해 보고된다.
-skip regexp
  • 정규식과 매칭되지 않는 테스트, 예제, 퍼즈 테스트, 벤치마크만 실행한다. -run 및 -bench와 마찬가지로 테스트 및 벤치마크의 경우 정규식은 대괄호가 없는 슬래시(/) 문자로 정규식 시퀀스로 분할되며 테스트 식별자의 각 부분은 시퀀스의 해당 요소(있는 경우)와 매칭되어야 한다.
-timeout d
  • 테스트 바이너리가 기간 d보다 오래 실행되면 패닉 상태가 된다.
  • d가 0이면 타임아웃이 비활성화된다.
  • 기본값은 10분(10m)이다.
-v
  • 상세 출력: 수행되는 모든 테스트를 기록한다. 또한 테스트가 성공하더라도 Log 및 Logf 호출의 모든 텍스트를 프린트한다.
-vet list
  • 쉼표로 구분된 vet 검사 목록을 사용하려면 "go test" 중에 "go vet" 호출을 설정하자.
  • list가 비어 있는 경우, "go test"는 항상 처리할 필요가 있다고 생각되는 선별된 검사 목록만 가지고 "go vet"을 실행한다.
  • list가 "off"이면, "go test"는 "go vet"을 실행하지 않는다.

다음 플래그들도 'go test'에서 인식되며 실행 중에 테스트를 프로파일링하는 데 사용할 수 있다.

-benchmem
  • 벤치마크에 대한 메모리 할당 통계를 프린트한다.
-blockprofile block.out
  • 모든 테스트가 완료되면 지정된 파일에 고루틴 차단 프로필을 작성한다.
  • -c 처럼 테스트 바이너리를 작성한다.
-blockprofilerate n
  • n값으로 runtime.SetBlockProfileRate를 호출하여 고루틴 차단 프로필에 제공된 세부 정보를 제어한다.
  • 'go doc runtime.SetBlockProfileRate'를 참조하자.
  • 프로파일러는 평균적으로 프로그램이 차단된 n 나노초마다 하나의 차단 이벤트를 샘플링하는 것을 목표로 한다. 기본적으로 -test.blockprofile이 이 플래그 없이 설정되면 -test.blockprofilerate=1과 동일하게 모든 차단 이벤트가 기록된다.
-coverprofile cover.out
  • 모든 테스트를 통과한 후 커버리지 프로파일을 파일에 쓴다.
  • -cover도 설정되어야 한다.
-cpuprofile cpu.out
  • 종료하기 전에 지정된 파일에 CPU 프로파일을 작성한다.
  • -c 처럼 테스트 바이너리를 작성한다.
-memprofile mem.out
  • 모든 테스트를 통과한 후 할당 프로파일을 파일에 쓴다.
  • -c 처럼 테스트 바이너리를 작성한다.
-memprofilerate n
  • runtime.MemProfileRate를 설정하여 보다 정확하고 비용이 많이 드는 메모리 할당 프로파일을 활성화한다. 'go doc runtime.MemProfileRate'를 참조하자.
  • 모든 메모리 할당을 프로파일링하려면 -test.memprofilerate=1을 사용하자.
-mutexprofile mutex.out
  • 모든 테스트가 완료되면 지정된 파일에 뮤텍스 경합 프로파일을 쓴다.
  • -c 처럼 테스트 바이너리를 작성한다.
-mutexprofilefraction n
  • 경쟁 뮤텍스를 붙잡고 있는 고루틴의 n 스택 트레이스에서 1을 샘플링한다.
-outputdir directory
  • 지정된 디렉토리(기본적으로 "go test"가 실행 중인 디렉터리)에 프로파일링의 출력 파일을 위치시킨다.
-trace trace.out
  • 종료하기 전에 지정된 파일에 실행 트레이스를 쓴다.

이러한 각 플래그는 -tesv.v 와 같이 선택적 'test.' 접두어로도 인식된다.

그러나 생성된 테스트 바이너리('go test -c'의 결과)를 직접 호출할 때는 접두어가 필수이다.

'go test' 명령어는, 테스트 바이너리를 호출하기 전에 선택적인 패키지 목록의 앞과 뒤에서, 인식된 플래그를 다시 쓰거나 제거한다.

예를 들어, 다음 명령어는...

go test -v -myflag testdata -cpuprofile=prof.out -x

테스트 바이너리를 컴파일한 후에 다음과 같이 실행한다.

pkg.test -test.v -myflag testdata -test.cpuprofile=prof.out

(-x 플래그는 테스트 자체가 아니라 go 명령어의 실행에만 적용되기 때문에 제거된다.)

프로파일을 생성하는 테스트 플래그(커버리지용은 제외)도 프로파일 분석에 사용할 수 있도록 테스트 바이너리를 pkg.test에 남겨둔다.

'go test'는 테스트 바이너리를 실행할 때 해당 패키지의 소스코드 디렉토리 내에서 실행한다. 테스트에 따라 생성된 테스트 바이너리를 직접 호출할 때 동일한 작업을 수행해야 할 수도 있다. 해당 디렉터리는 읽기전용일 수 있고 체크섬으로 확인되는 모듈 캐시 내에 있을 수 있기 때문에, 테스트는 사용자가 명시적으로 요청하지 않는 한(예: testdata/fuzz에 실패를 기록하는 -fuzz 플래그 사용) 모듈 내의 다른 디렉터리나 해당 디렉터리에 쓰지 않아야 한다.

명령줄 패키지 목록이 있는 경우 go test 명령어에 모르는 플래그들 앞에 와야 한다. 위의 예제에서 패키지 목록은 -myflag 앞에 와야 하지만 -v의 앞이나 뒤에 올 수 있다.

'go test'가 패키지 목록 모드에서 실행될 때 'go test'는 불필요한 테스트 반복 실행을 피하기 위해 성공적인 패키지 테스트 결과를 캐시한다. 테스트 캐싱을 비활성화하려면 캐시 가능한 플래그 이외의 테스트 플래그 또는 인수를 사용하자. 테스트 캐싱을 명시적으로 비활성화하는 일반적인 방법은 -count=1을 사용하는 것이다.

테스트 바이너리에 대한 인수가 알려진 플래그 또는 패키지 이름으로 해석되지 않도록 하려면 -args('go help test' 참조)를 사용하여 명령줄의 나머지 부분을 해석 및 변경되지 않은 테스트 바이너리로 전달한다.

예를 들어, 다음 명령어는...

go test -v -args -x -v

테스트 바이너리를 컴파일한 후에 다음과 같이 실행한다.

pkg.test -test.v -x -v

비슷하게, 다음 명령어는...

go test -args math

테스트 바이너리를 컴파일한 후에 다음과 같이 실행한다.

pkg.test math

첫 번째 예시에서, -x와 두 번째 -v는 변경되지 않고 테스트 바이너리로 전달되며 go 명령어 자체에는 영향을 주지 않는다.

두 번째 예시에서 인수 math는 패키지 목록으로 해석되는 대신 테스트 바이너리로 전달된다.

2 같이 보기

3 참고

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