커버리지 정보를 사용하여 Go에서 os.Exit 시나리오 테스트(coveralls.io/Goveralls)
이 질문은 os와 관련된 테스트 시나리오와 관련이 있습니다. Go의 Exit(), 특히 이러한 시나리오에 대한 적용 범위 정보를 캡처하는 방법. 제공된 샘플 코드는 재실행 방법을 보여 주지만, 커버리지 도구 및 취약성으로 인한 한계를 안고 있습니다.
커버리지 문제
한 가지 어려움은 다음과 같은 커버리지 프레임워크입니다. Coveralls.io는 os.Exit()를 불러오는 테스트의 적용 범위를 기록하지 않을 수 있습니다. 이는 테스트 바이너리가 재실행될 때 Coverage Instrumentation이 적용되지 않기 때문입니다.
수정된 재실행 방법
이 문제를 해결하기 위해 수정된 재실행 exec 메소드를 사용할 수 있습니다. 원래 코드는 os.Exit를 osExit라는 변수로 추출하도록 리팩터링되었습니다. 그런 다음 테스트 코드는 osExit를 종료 코드를 기록하는 모의 함수로 대체합니다. 이를 통해 osExit 호출에 대한 커버리지 정보를 캡처할 수 있습니다.
외부 호출 커버리지
log.Fatalf()와 같은 함수에 대한 커버 호출에도 동일한 기술을 적용할 수 있습니다. os.Exit를 간접적으로 호출합니다. logFatalf 함수는 전달된 메시지 형식과 인수를 기록하는 모의 함수로 대체됩니다. 이를 통해 외부 함수에서 os.Exit가 호출되는 시나리오를 보장합니다.
예
수정된 코드와 테스트는 다음과 같습니다.
// bar.go package foo import ( "fmt" "os" ) var osExit = os.Exit func Crasher() { fmt.Println("Going down in flames!") osExit(1) }
// bar_test.go package foo import ( "reflect" "testing" ) var logFatalf = log.Fatalf func TestCrasher(t *testing.T) { // Save original functions and restore at the end oldOsExit := osExit oldLogFatalf := logFatalf defer func() { osExit = oldOsExit logFatalf = oldLogFatalf }() // Mock osExit var got int myExit := func(code int) { got = code } osExit = myExit // Mock logFatalf var gotFormat string var gotV []interface{} myFatalf := func(format string, v ...interface{}) { gotFormat, gotV = format, v } logFatalf = myFatalf // Run test Crasher() // Check results exp := 1 if got != exp { t.Errorf("Expected exit code: %d, got: %d", exp, got) } expFormat, expV := "Exiting with code: %d", []interface{}{1} if gotFormat != expFormat || !reflect.DeepEqual(gotV, expV) { t.Error("Something went wrong") } }
exit 관련 기능을 분리하고 모의 함수를 사용하여 os.Exit 및 외부 함수 호출 모두를 트리거합니다. os.Exit는 Go 테스트에서 다룰 수 있습니다. 이 접근 방식은 프로세스 종료와 관련된 시나리오에 대한 정확한 적용 범위 보고를 보장합니다.
위 내용은 `os.Exit()`를 사용하여 Go 코드에 대한 정확한 테스트 적용 범위를 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!