기능 테스트 커버리지를 사각지대 없이 보여주기
문제:
컴파일된 Go 바이너리와 상호 작용하는 Go 이외의 언어로 작성된 기능 테스트에 대한 커버리지 프로필인 main_test.go 파일에는 종료 코드를 채널로 보내기 위해 main() 메서드를 수정하는 Test_main 함수가 포함되어 있습니다. 그러나 exit() 함수의 if flag.Lookup("test.coverprofile") != nil 조건은 적용 범위 프로필이 요청될 때 os.Exit(code)가 절대 실행되지 않을 수 있으므로 적용 범위 결과에 사각지대를 만듭니다. .
해결책:
사각지대 없이 커버리지 프로필을 작성하려면 main.go 파일을 테스트에서 제외하는 것이 좋습니다. 이는 main.go 파일 상단에 // build !test 줄을 추가하여 빌드 태그를 사용하여 수행할 수 있습니다. 이렇게 하면 Go 컴파일러가 테스트 빌드 중에 파일을 무시하도록 지시합니다.
다음은 이 접근 방식을 통합하는 예제 코드의 수정된 버전입니다.
<code class="go">// dofunc.go package main import ( "fmt" "math/rand" "time" ) var seed int64 = time.Now().UTC().UnixNano() func doFunc() int { rand.Seed(seed) var code int for { i := rand.Int() fmt.Println(i) if i%3 == 0 { code = 0 break } if i%2 == 0 { fmt.Println("status 1") code = 1 break } time.Sleep(time.Second) } return code } // main.go //+build !test package main import "os" func main() { os.Exit(doFunc()) } // dofunc_test.go package main import ( "testing" "flag" "os" ) var exitCode int func TestMain(m *testing.M) { flag.Parse() code := m.Run() os.Exit(code) } func TestDoFuncErrorCodeZero(t *testing.T) { seed = 2 if code := doFunc(); code != 0 { t.Fail() } } func TestDoFuncErrorCodeOne(t *testing.T) { seed = 3 if code := doFunc(); code != 1 { t.Fail() } }</code>
사용법:
main.go를 테스트에서 제외하면 종료() 함수는 더 이상 커버리지 분석의 일부가 아니며 커버리지 프로필은 메인.go의 동작을 정확하게 반영합니다. 기능 테스트.
위 내용은 컴파일된 Go 바이너리와 상호 작용하는 기능 테스트에 대해 사각지대 없이 포괄적인 적용 범위 프로필을 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!