Go에서 os.Exit 시나리오 테스트
os.Exit()를 사용하여 프로그램을 종료하는 함수 호출과 관련된 테스트를 작성할 때, 테스트 스위트의 나머지 부분에 미치는 영향을 격리하는 것이 필요해졌습니다. 이 문제를 해결하기 위해 Go 팀의 핵심 멤버인 Andrew Gerrand의 프레젠테이션에서 영감을 받은 다음 접근 방식을 활용할 수 있습니다.
os.Exit()를 통해 프로그램을 종료하는 함수가 제공되는 경우:
package main import ( "fmt" "os" ) func Crasher() { fmt.Println("Going down in flames!") os.Exit(1) }
해당 테스트 케이스 생성:
package main import ( "os" "os/exec" "testing" ) func TestCrasher(t *testing.T) { // Check if the BE_CRASHER environment variable is set to 1. if os.Getenv("BE_CRASHER") == "1" { Crasher() return } // Construct a command to re-run the test binary, limiting its execution to TestCrasher. cmd := exec.Command(os.Args[0], "-test.run=TestCrasher") // Set additional environment variables. cmd.Env = append(os.Environ(), "BE_CRASHER=1") // Execute the command. err := cmd.Run() // Verify the exit status of the command. if e, ok := err.(*exec.ExitError); ok && !e.Success() { return } // Report failure if the command ran with an unexpected exit code. t.Fatalf("process ran with err %v, want exit status 1", err) }
이 테스트 케이스는 별도의 프로세스에서 go 테스트를 다시 호출합니다. TestCrasher의 실행을 나머지 제품군과 분리합니다. 또한 호출된 프로세스가 확인하는 환경 변수(BE_CRASHER=1)를 설정하고, 있는 경우 테스트 중인 함수를 호출합니다. 따라서 무한 루프를 방지하고 올바른 종료 코드가 검증되었는지 확인합니다.
위 내용은 Go에서 os.Exit()를 호출하는 함수를 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!