Testarea de Rezistență și Găsirea Automată a Cazurilor Limită cu Fuzz Testing în Go

Ghid complet de Fuzz Testing nativ în Go: generarea automată a milioanelor de intrări aleatorii ghidate de acoperirea codului (coverage-guided fuzzing) pentru depistarea erorilor de panică și a vulnerabilităților de securitate.

Sintaxă
func FuzzParse(f *testing.F) { ... } | go test -fuzz=Fuzz -fuzztime=30s

Testele unitare clasice acoperă doar cazurile anticipate de programator. Cu toate acestea, în producție, intrările primite de la utilizatori pot conține secvențe Unicode malformate, șiruri uriașe sau caractere speciale neașteptate care declanșează erori de panică (panic) sau coruperi de memorie. Fuzz Testing (introdus nativ în Go 1.18) generează automat milioane de intrări pseudo-aleatorii ghidate de acoperirea blocurilor de cod (Coverage-Guided Fuzzing) pentru a găsi breșe și cazuri limită (edge cases).

Scrierea unui test de fuzzing pentru o funcție de inversare de text
package utils

import (
    "testing"
    "unicode/utf8"
)

// Funcția de testat:
func InverseazaSir(s string) string {
    r := []rune(s)
    for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 {
        r[i], r[j] = r[j], r[i]
    }
    return string(r)
}

// Test de tip Fuzz (trebuie să înceapă cu prefixul 'Fuzz' și să primească *testing.F):
func FuzzInverseazaSir(f *testing.F) {
    // Adăugăm intrări de pornire (Corpus de bază):
    f.Add("salut")
    f.Add("Bună ziua!")
    f.Add("12345")

    f.Fuzz(func(t *testing.T, orig string) {
        inv := InverseazaSir(orig)
        dubluInv := InverseazaSir(inv)

        // 1. Inversarea dublă a unui șir trebuie să returneze exact șirul inițial:
        if orig != dubluInv {
            t.Errorf("Inversare dubla esuata: orig=%q, dublu=%q", orig, dubluInv)
        }

        // 2. Dacă originalul era UTF-8 valid, și rezultatul trebuie să fie UTF-8 valid:
        if utf8.ValidString(orig) && !utf8.ValidString(inv) {
            t.Errorf("Rezultat UTF-8 invalid: %q", inv)
        }
    })
}

Rularea testului de fuzzing din terminal

# Rulează fuzzing timp de 30 de secunde pe funcția dorită:
go test -fuzz=FuzzInverseazaSir -fuzztime=30s
Comunitate & Schimb de cunoștințe

Întrebări & Exemple de Cod: Testarea de Rezistență și Găsirea Automată a Cazurilor Limită cu Fuzz Testing

Ai o nelămurire despre utilizarea comenzii Testarea de Rezistență și Găsirea Automată a Cazurilor Limită cu Fuzz Testing sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!

💬

Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!

Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.