하위 디렉토리의 Golang 테스트


120

작업 영역을 깔끔하게 유지하기 위해 패키지에 대한 테스트 및 예제를 하위 디렉터리로 사용하여 Go에서 패키지를 만들고 싶습니다. 이것이 가능하고 가능하다면 어떻게합니까?

모든 문서는 항상 다른 코드와 같은 위치에 테스트 코드를 배치합니다. 어떤면에서 더 나은가요 아니면 그냥 관례일까요?


5
참고 : go test ./...현재 폴더 모든 하위 폴더에서 테스트를 실행합니다 . 보기 내 대답은 아래
VonC


나도 같은 생각을하고 있었다. 같은 수준의 디렉토리에 하위 디렉토리가 있기 때문에 테스트를 별도의 디렉토리에 두는 데 문제가 있습니다.
filthy_wizard

답변:


202

"재귀 적으로" 실행할 수 있습니다 . 테스트 할 모든 패키지go test나열 해야합니다 .

Go 프로젝트의 루트 폴더에있는 경우 다음을 입력합니다.

go test ./...

' ./...'표기법은 " 명령 " 의 " 패키지 목록 설명 "섹션에 설명되어 있습니다 .go

가져 오기 경로는 하나 이상의 " ..."와일드 카드를 포함하는 경우 패턴입니다 . 각 와일드 카드는 빈 문자열 및 슬래시를 포함하는 문자열을 포함하여 모든 문자열과 일치 할 수 있습니다.

이러한 패턴 GOPATH은 이름이 패턴과 일치하는 트리 에서 발견되는 모든 패키지 디렉토리로 확장됩니다 .

특별한 경우 로 의 하위 디렉토리 x/...와 일치 합니다. 예를 들어 는 하위 디렉토리로 확장 하고 패키지합니다.xx
net/...net


당신이 유지하는 경우 _test.go하위 폴더에있는 파일의 ' go test ./...'명령을 픽업 할 수있을 것입니다.
그러나:

  • 테스트 파일이 패키지 내 보낸 콘텐츠에 액세스 할 수 있도록 내 보낸 변수 및 함수 (테스트에 사용됨)에 패키지 이름을 접두사로 지정해야합니다.
  • 내 보내지 않은 콘텐츠에는 액세스 할 수 없습니다.

즉, 여전히 _test.go파일을 기본 소스 파일 바로 옆에 두는 것이 좋습니다 . 찾기가 더 쉽습니다.


4
어떤 사람들은 개인 정보에 대한 접근 권한이없는 것이 일반적인 블랙 박스 테스트이고 더 좋다고 주장 할 수 있습니다. 공용 기호를 한정해야하는 경우 항상 _ "..."를 가져올 수 있습니다.
ddevienne 2015 년

15

file_test.go"file"은 테스트 할 소스 코드 파일의 이름 인 파일 의 동일한 디렉토리에 코드와 함께 테스트를 배치합니다 . 이것은 관습이며 내 경험에서 최고라는 것을 알았습니다.

go test도구가 충분히 자동화되지 않은 경우 GoConvey 테스트 (동작을 기반으로하며보다 자체 문서화되는 GoConvey 테스트)는 물론 기존 Go 테스트를 자동으로 업데이트하고 실행하는 웹 UI가있는 GoConvey를 살펴볼 수 있습니다. 전통적인 Go 테스트보다).


2
GoConvey는 굉장합니다 (높은 기대로 새로운 UI를 기다리고 있습니다). 예를 들어 github.com/VonC/asciidocgo/blob/master/abstractNode_test.go 와 같이 현재 프로젝트에서 사용하고 있습니다. 그러나 go test하위 폴더에서도 작동 할 수 있습니다. 보기 내 대답은 아래
VonC

맞아요. 사실,이 질문에 대한 제 답변보다 더 관련성이있을 것입니다.
Matt

10

편집 됨

VonC의 답변을 바탕으로

이 답변은 go1.11. 상위 go버전에서는 아직 테스트되지 않았습니다 .

하위 폴더에 자신의 테스트를 유지하기 위해 좋아하는 분들을 위해, 말을 test한 후 실행,

go test ./...

테스트를 포함하지 않는 폴더를 포함 하여 모든 폴더 에서 테스트를 실행하려고 시도 하므로 테스트 ?가 아닌 폴더에 대한 후속 보고서에이 있습니다.

달리는

go test ./.../test

대신 test폴더 만 대상으로 하므로 테스트 폴더에만 초점을 맞춘 깨끗한 보고서가 있습니다.

주의

테스트 하위 폴더를 사용하면 커버리지 보고서 계산을 방지 할 수 있습니다. go의 철학은 패키지 폴더에 테스트 파일을 남겨 두는 것입니다.


1
내 5 년 된 답변 외에도 좋은 팁. Upvoted
VonC

애나에게, 작동하지 않는 것이 무엇인지 설명해주세요. Go의 버전은 무엇입니까? 당신은 무엇을하려고합니까? 나중에이 방법이 코드 커버리지를 계산할 수 없다는 것을 깨달았습니다. 이것이 네가 말하는 뜻 이니?
avi.elkharrat

1
go test ./.../test반환 go: warning: "./.../test" matched no packages// 테스트 폴더를 대상 않습니다뿐만 아닙니다. go version go1.13 darwin / amd64
anna

1
@Madeo, golang은 테스트와 코드의 분리를 권장하지 않기 때문에 감각을 만들 것입니다. 예외는 이전 버전에서 허용하는 것입니다.
avi.elkharrat

1
@ avi.elkharrat 및 실제로 테스트를 별도의 패키지 / 폴더에 보관하는 것을 좋아했지만 더 이상이 접근 방식을 사용하지 않기로 결정했습니다 = (
Madeo

-4

나는 일반적으로 테스트하지 않지만 파일을 디렉토리로 그룹화하고 다음과 같은 가져 오기를 사용할 수 있습니다.

import "./models"한 레벨 아웃
import "../models이면 한 레벨 아웃이고 한 레벨 인 경우

예를 들면 다음과 같습니다.
./models/todo.go
./test/todo_test.go

시험 todo.go에서 todo_test.go의 귀하의 수입이 todo_test.go될 것입니다

import "../models"


이 코드 가져 오기 방법은 노출 된 함수에 대해서만 작동합니다. 동일한 패키지에 명시 적으로 넣었다고 생각하더라도 동일한 패키지에있는 것처럼 작동하지 않는 것 같습니다. 따라서이 솔루션은 단위 테스트 문제를 실제로 해결하지 못합니다.
우아한 펭귄
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.