> 백엔드 개발 > Golang > Goveralls를 사용하여 Go의 os.Exit() 시나리오에 대한 100% 테스트 적용 범위를 어떻게 달성할 수 있나요?

Goveralls를 사용하여 Go의 os.Exit() 시나리오에 대한 100% 테스트 적용 범위를 어떻게 달성할 수 있나요?

Barbara Streisand
풀어 주다: 2024-12-20 04:19:13
원래의
137명이 탐색했습니다.

How Can I Achieve 100% Test Coverage for Go's os.Exit() Scenarios with Goveralls?

커버리지 정보를 사용하여 Go os.Exit 시나리오 테스트(coveralls.io/Goveralls)

os.Exit( )은 Go 개발에 매우 ​​중요합니다. 그러나 os.Exit()는 직접 가로채기가 어렵습니다. 일반적인 방법은 바이너리를 다시 호출하고 종료 상태를 확인하는 것입니다.

이 접근 방식은 주로 Goveralls에 대한 적용 범위 정보가 부족하고 테스트 바이너리를 다시 실행할 때 발생할 수 있는 취약성이라는 한계에 직면합니다.

100% 커버리지 달성

이러한 문제를 해결하려면 테스트 코드:

package foo

import (
    "fmt"
    "io"
    "log"
    "os"
    "testing"
)

var (
    osExit = os.Exit
    logFatalf = log.Fatalf
)

// Tester interface for mocking os.Exit() and log.Fatalf()
type Tester interface {
    Fatal(string, ...interface{})
    Exit(int)
}

type realTester struct{}

func (r realTester) Fatal(s string, v ...interface{}) {
    log.Fatalf(s, v...)
}

func (r realTester) Exit(code int) {
    os.Exit(code)
}

func Crasher() {
    fmt.Print("Going down in flames!")
    logFatalf("Exiting with code: %d", 1)
}

// TestCrasher simulates os.Exit() and log.Fatalf()
func TestCrasher(t *testing.T) {
    tests := []struct {
        name string
        f    func(t *testing.T, original Tester, tester *mockTester)
    }{
        {"Test os.Exit()", func(t *testing.T, orig, test *mockTester) {
            orig.Exit(1)
            if test.exitCode != 1 {
                t.Errorf("expected exit code 1, got %d", test.exitCode)
            }
        }},
        {"Test log.Fatalf()", func(t *testing.T, orig, test *mockTester) {
            orig.Fatalf("Exiting after a test failure")
            if test.format != "Exiting after a test failure" {
                t.Errorf("expected format \"Exiting after a test failure\", got %s", test.format)
            }
        }},
    }

    for _, test := range tests {
        t.Run(test.name, func(t *testing.T) {
            var orig Tester = realTester{}
            var mr mockTester

            test.f(t, orig, &mr)

            mr.Verify()
        })
    }
}

// Mock tester simulates os.Exit() and log.Fatalf()
type mockTester struct {
    format    string
    values    []interface{}
    exitCode  int
    exitCalls int
}

func (m *mockTester) Fatal(s string, v ...interface{}) {
    m.format = s
    m.values = v
    m.exit()
}

func (m *mockTester) Exit(code int) {
    m.exitCode = code
    m.exit()
}

func (m *mockTester) exit() {
    m.exitCalls++
}

// Verify checks that mockTester was called appropriately
func (m *mockTester) Verify() {
    if m.exitCalls != 1 {
        panic("expected 1 call to Exit() or Fatal(), got %d", m.exitCalls)
    }
}
로그인 후 복사

이 접근 방식은 테스트 코드를 재사용 가능한 Tester 인터페이스로 리팩터링하여 os.Exit() 및 log.Fatalf()를 모두 모의할 수 있도록 합니다. 모의 개체에서 Exit() 또는 Fatal()을 명시적으로 호출하고 동작을 시뮬레이션하면 이러한 시나리오를 100% 적용할 수 있습니다.

위 내용은 Goveralls를 사용하여 Go의 os.Exit() 시나리오에 대한 100% 테스트 적용 범위를 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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