Maison >développement back-end >Golang >Comment comparer les tranches Go et les éléments NaN dans les tests unitaires ?

Comment comparer les tranches Go et les éléments NaN dans les tests unitaires ?

WBOY
WBOYavant
2024-02-12 13:00:091005parcourir

如何在单元测试中比较 Go 切片和 NaN 元素?

éditeur php Baicao La comparaison des tranches Go et des éléments NaN est un problème courant dans les tests unitaires. Lorsqu'il s'agit de tranches, nous devons souvent comparer deux tranches pour vérifier leur égalité, mais la comparaison devient compliquée lorsqu'une tranche contient NaN éléments. NaN est un nombre à virgule flottante spécial, ce qui signifie qu'il ne s'agit pas d'une valeur numérique. Dans Go, utilisez la fonction IsNaN du package mathématique pour déterminer si un nombre à virgule flottante est NaN. Nous pouvons implémenter des opérations de comparaison de tranches en parcourant chaque élément de la tranche et en utilisant la fonction IsNaN pour déterminer s'il s'agit de NaN.

Contenu de la question

J'ai besoin de comparer 2 tranches dans un test unitaire, je pense que le package assert devrait résoudre ce problème, mais il ne fonctionne pas avec nan :

import (
    "github.com/stretchr/testify/assert"
)

func callme() []float64 {
    return []float64{math.nan()}
}

func testcallme(t *testing.t) {
    assert.equal(t, []float64{math.nan()}, callme())
}

Le résultat est :

Error:          Not equal: 
                            expected: []float64{NaN}
                            actual  : []float64{NaN}
                            
                            Diff:
            Test:           TestCallMe

Je sais qu'une des propriétés de nan n'est pas égale à elle-même, mais par contre je reçois le résultat attendu de la fonction.

Je veux savoir comment résoudre ce problème : obtenir des assertions de tests unitaires concises et un résultat clair ?

Comme alternative, je pourrais éviter d'utiliser assert 并在两个切片的每个元素上调用 math.isnan et appeler math.isnan sur chaque élément des deux tranches, mais cela semblerait extrêmement verbeux dans un test unitaire.

Workaround

github.com/google/go-cmp/cmp package pour des comparaisons plus complexes. cmpopts.equatenans peut être utilisé pour comparer facilement les structures de données pouvant contenir nan.

package calc_test

import (
    "math"
    "testing"

    "github.com/google/go-cmp/cmp"
    "github.com/google/go-cmp/cmp/cmpopts"
)

func calc(n float64) []float64 {
    return []float64{n, math.NaN()}
}

func TestCalc(t *testing.T) {
    want := []float64{1, math.NaN()}

    got := calc(1)  // PASS.
    if !cmp.Equal(got, want, cmpopts.EquateNaNs()) {
        t.Errorf("calc: got = %v; want = %v", got, want)
    }

    got = calc(2)   // FAIL with differences.
    if diff := cmp.Diff(want, got, cmpopts.EquateNaNs()); diff != "" {
        t.Errorf("calc: diff (-want +got) = \n%s", diff)
    }
}

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer
Article précédent:Passerelle CORS grpc GoLangArticle suivant:Passerelle CORS grpc GoLang