> 백엔드 개발 > Golang > Go 테스트 스위트에서 'os.Exit' 동작을 어떻게 테스트합니까?

Go 테스트 스위트에서 'os.Exit' 동작을 어떻게 테스트합니까?

Barbara Streisand
풀어 주다: 2024-11-11 17:35:03
원래의
955명이 탐색했습니다.

How Do You Test `os.Exit` Behavior in Go Test Suites?

Go에서 os.Exit 시나리오 테스트

os.Exit()를 호출하는 Go 함수를 테스트할 때 이를 방지하기 위한 고유한 접근 방식이 필요합니다. 이는 후속 테스트를 방해하지 않도록 합니다.

이 문제를 해결하려면 다음을 고려하세요. 코드:

func doomed() {
  os.Exit(1)
}
로그인 후 복사

Go 테스트를 사용하여 os.Exit 동작을 올바르게 테스트하는 방법

이 함수의 종료 동작을 테스트하려면 다음에 설명된 기술을 활용할 수 있습니다. Go 팀의 핵심 멤버인 Andrew Gerrand:

  1. 별도의 프로세스 생성 테스트용:
    exec.Command를 사용하여 별도의 프로세스에서 go test를 다시 호출합니다. os.Exit를 트리거하는 테스트로 실행을 제한합니다.
  2. 환경 변수 전달:
    하위 프로세스에서 환경 변수(예: BE_CRASHER=1)를 설정합니다. 테스트된 함수는 이 변수를 확인하고 설정된 경우에만 os.Exit를 호출할 수 있습니다.
  3. 종료 코드 유효성 검사:
    하위 프로세스가 종료되면 원래 테스트에서 종료 코드의 유효성을 검사합니다. 프로세스. 예상값(예: 1)과 일치하면 테스트가 성공한 것입니다.

테스트 코드 예시:

package main

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

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

func TestCrasher(t *testing.T) {
    if os.Getenv("BE_CRASHER") == "1" {
        Crasher()
        return
    }
    cmd := exec.Command(os.Args[0], "-test.run=TestCrasher")
    cmd.Env = append(os.Environ(), "BE_CRASHER=1")
    err := cmd.Run()
    if e, ok := err.(*exec.ExitError); ok && !e.Success() {
        return
    }
    t.Fatalf("process ran with err %v, want exit status 1", err)
}
로그인 후 복사

테스트 프로세스와 테스트 프로세스를 분리하여 환경 변수를 사용하여 실행을 제어하면 다른 테스트에 영향을 주지 않고 Go 테스트 모음에서 os.Exit 시나리오를 효과적으로 테스트할 수 있습니다.

위 내용은 Go 테스트 스위트에서 'os.Exit' 동작을 어떻게 테스트합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿