Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Mencapai Liputan Ujian 100% untuk Senario os.Exit() Go dengan Goveralls?

Bagaimanakah Saya Boleh Mencapai Liputan Ujian 100% untuk Senario os.Exit() Go dengan Goveralls?

Barbara Streisand
Barbara Streisandasal
2024-12-20 04:19:13138semak imbas

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

Menguji Go os.Exit Scenario dengan Maklumat Liputan (coveralls.io/Goveralls)

Keupayaan untuk menguji senario yang melibatkan os.Exit( ) adalah penting dalam pembangunan Go. Walau bagaimanapun, os.Exit() sukar untuk memintas secara langsung. Kaedah biasa melibatkan penggunaan semula binari dan menyemak status keluar.

Pendekatan ini menghadapi had, terutamanya kekurangan maklumat liputan dengan Goveralls dan potensi kerapuhan untuk menjalankan semula binari ujian.

Mencapai Liputan 100%

Untuk menangani cabaran ini, pertimbangkan pemfaktoran semula kod ujian:

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)
    }
}

Pendekatan ini memfaktorkan semula kod ujian ke dalam antara muka Penguji boleh guna semula, membenarkan untuk mengejek kedua-dua os.Exit() dan log.Fatalf(). Dengan memanggil Exit() atau Fatal() secara eksplisit dalam objek olok-olok dan mensimulasikan gelagat, anda boleh mencapai liputan 100% untuk senario ini.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Liputan Ujian 100% untuk Senario os.Exit() Go dengan Goveralls?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn