소프트웨어 테스팅에서 코드 커버리지는 테스트 중에 실행되는 코드의 비율을 측정합니다. 그러나 특정 코드 경로가 적용되지 않아 적용 범위 보고서에 사각지대가 생길 수 있습니다. 기능 테스트를 위해 프로덕션 코드에서 컴파일된 바이너리를 사용할 때 이러한 시나리오 중 하나가 발생합니다.
다음 예를 고려하십시오.
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) func main() { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { os.Exit(0) } if i%2 == 0 { os.Exit(1) } time.Sleep(time.Second) } }</code>
문제:
exit() 함수는 커버리지 프로파일이 기록되는 것을 허용하지 않고 프로세스를 종료합니다. 결과적으로 os.Exit()가 포함된 줄은 커버리지 보고서에 포함되지 않아 사각지대가 발생합니다.
잠재적 해결책:
1. 테스트 코드에서 os.Exit() 사용을 피하세요:
종료 기능을 별도의 함수로 이동하고 해당 함수를 프로덕션 코드와 테스트 코드 모두에서 사용하세요. 이를 통해 종료하기 전에 커버리지 프로필을 캡처할 수 있습니다.
2. 종료하기 전에 time.Sleep()을 사용하세요.
os.Exit()를 호출하기 전에 time.Sleep() 지연을 삽입하여 표지 프로필이 기록되도록 허용하지만 이로 인해 제작 속도가 느려질 수 있습니다. 바이너리가 프로덕션과 테스트 모두에 사용되는 경우 코드.
3. 커버리지에서 메인 기능 제외:
메인 기능은 프로세스만 종료하므로 빌드 태그를 사용하여 커버리지 분석에서 제외할 수 있습니다. 이렇게 하면 사각지대가 해소됩니다.
리팩토링 예시:
<code class="go">package main import ( "fmt" "math/rand" "os" "time" ) //+build !test func main() { os.Exit(exitFunc()) } func exitFunc() int { rand.Seed(time.Now().UTC().UnixNano()) for { i := rand.Int() fmt.Println(i) if i%3 == 0 { return 0 // Exit with code 0 } if i%2 == 0 { fmt.Println("status 1") return 1 // Exit with code 1 } time.Sleep(time.Second) } }</code>
주요 기능을 Coverage에서 제외하여 사각지대 없이 100% Coverage를 달성합니다. .
참고:
복잡한 시나리오의 경우 숙련된 개발자와 상담하여 코드 기능이나 테스트 효율성을 저하시키지 않고 적용 범위 맹점을 제거하기 위한 최선의 접근 방식을 결정하는 것이 좋습니다.
위 내용은 ## os.Exit()를 사용할 때 맹점 없이 100% 코드 커버리지를 달성하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!