Go dispose de tests de fuzzing en version bêta

Par:
fredericmazue

ven, 25/06/2021 - 11:22

Le fuzzing (ou test à données aléatoire) est une technique pour tester des logiciels. L'idée est d'injecter des données aléatoires dans les entrées d'un programme. Si le programme échoue (par exemple en plantant ou en générant une erreur), alors il y a des défauts à corriger. L'équipe du projet du langage Go vient d'annoncer la disponibilité de ce type de test pour ce langage. Le fuzzing pour Go est en version bêta pour le moment.

Pour utiliser le fuzzing vous devez d'abord créer la chaîne d'outils Go à partir de la branche de développement dev.fuzz

$ go get golang.org/dl/gotip
$ gotip download dev.fuzz

Ceci ne sera plus nécessaire une fois que le code sera fusionné dans la branche principale.

Une fois la chaîne construite, il est possible d'exécuter des commandes comme

$ gotip test -fuzz=FuzzFoo

gotip remplaçant go

Une cible fuzz doit se trouver dans un fichier *_test.go en tant que fonction sous la forme FuzzXxx. Cette fonction doit recevoir un argument *testing.F, un peu comme un argument *testing.T est passé à une fonction TestXxx .

Voici un exemple de cible fuzz qui teste le comportement du package net/url.

// +build gofuzzbeta

package fuzz

import (
    "net/url"
    "reflect"
    "testing"
)

func FuzzParseQuery(f *testing.F) {
    f.Add("x=1&y=2")
    f.Fuzz(func(t *testing.T, queryStr string) {
        query, err := url.ParseQuery(queryStr)
        if err != nil {
            t.Skip()
        }
        queryStr2 := query.Encode()
        query2, err := url.ParseQuery(queryStr2)
        if err != nil {
            t.Fatalf("ParseQuery failed to decode a valid encoded query %s: %v", queryStr2, err)
        }
        if !reflect.DeepEqual(query, query2) {
            t.Errorf("ParseQuery gave different query after being encoded\nbefore: %v\nafter: %v", query, query2)
        }
    })
}

Vous pouvez en savoir plus sur les API de fuzzing avec go doc

gotip doc testing
gotip doc testing.F
gotip doc testing.F.Add
gotip doc testing.F.Fuzz