Maison > développement back-end > Golang > Comment puis-je obtenir une couverture de test à 100 % pour les scénarios os.Exit() de Go avec Goveralls ?

Comment puis-je obtenir une couverture de test à 100 % pour les scénarios os.Exit() de Go avec Goveralls ?

Barbara Streisand
Libérer: 2024-12-20 04:19:13
original
220 Les gens l'ont consulté

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

Test des scénarios Go os.Exit avec informations de couverture (coveralls.io/Goveralls)

La possibilité de tester des scénarios impliquant os.Exit( ) est crucial dans le développement de Go. Cependant, os.Exit() est difficile à intercepter directement. Une méthode courante consiste à réinvoquer le binaire et à vérifier l'état de sortie.

Cette approche se heurte à des limites, principalement le manque d'informations de couverture avec Goveralls et la fragilité potentielle de la réexécution du binaire de test.

Atteindre une couverture de 100 %

Pour relever ces défis, envisagez une refactorisation des tests code :

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)
    }
}
Copier après la connexion

Cette approche refactorise le code de test dans une interface de testeur réutilisable, permettant de se moquer à la fois de os.Exit() et de log.Fatalf(). En appelant explicitement Exit() ou Fatal() dans l'objet fictif et en simulant le comportement, vous pouvez obtenir une couverture à 100 % pour ces scénarios.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal