>  기사  >  백엔드 개발  >  테스트 스위트를 중단하지 않고 Go에서 'os.Exit' 시나리오를 테스트하는 방법은 무엇입니까?

테스트 스위트를 중단하지 않고 Go에서 'os.Exit' 시나리오를 테스트하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-11-12 17:08:02694검색

How to Test `os.Exit` Scenarios in Go Without Disrupting the Test Suite?

Go의 단위 테스트 종료 시나리오

강력한 소프트웨어 개발을 위해서는 다양한 테스트 시나리오를 다루는 것이 중요합니다. Go에서는 os.Exit를 호출하는 함수를 테스트하는 것이 독특한 과제를 제시합니다. 전체 테스트 모음을 방해하지 않고 어떻게 종료 시나리오를 테스트할 수 있습니까?

다음 함수를 고려해보세요.

func doomed() {
  os.Exit(1)
}

이 함수를 호출하면 종료가 발생하는지 효과적으로 테스트하려면 os.Exit 호출을 테스트 내에서 제한하고 다른 테스트에 영향을 주지 않도록 하는 전략을 사용해야 합니다.

os.Exit 테스트

Go 팀의 핵심 멤버인 Andrew Gerrand는 그는 프레젠테이션에서 이 문제에 대한 독창적인 접근 방식을 제공합니다. 이 솔루션을 구현해 보겠습니다.

main.go(테스트할 기능이 있는 프로그램)

package main

import (
    "fmt"
    "os"
)

func Crasher() {
    fmt.Println("Going down in flames!")
    os.Exit(1)
}

main_test.go(Crasher 기능 테스트)

package main

import (
    "os"
    "os/exec"
    "testing"
)

func TestCrasher(t *testing.T) {
    // Check if "BE_CRASHER" environment variable is set.
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher()
        return
    }

    // Invoke the test again with "BE_CRASHER=1" to trigger the Crasher call.
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()

    // Validate exit code.
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}

실행:

이 솔루션은 다음과 같이 작동합니다.

  • exec를 통해 별도의 프로세스에서 go test를 다시 호출합니다. 실행을 TestCrasher 테스트로 제한하는 명령.
  • 환경 변수(BE_CRASHER=1)를 통해 플래그를 전달하여 두 번째 호출의 동작을 제어합니다.
  • 플래그 확인 및 설정된 경우 , Crasher를 호출하고 즉시 종료합니다.
  • 테스트가 예상대로 통과했는지 확인하기 위해 종료 코드를 검증합니다.

이 접근 방식을 사용하면 나머지 테스트 스위트.

위 내용은 테스트 스위트를 중단하지 않고 Go에서 'os.Exit' 시나리오를 테스트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.