Maison > développement back-end > Golang > le corps du texte

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

WBOY
Libérer: 2024-02-12 13:00:09
avant
962 Les gens l'ont consulté

如何在单元测试中比较 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())
}
Copier après la connexion

Le résultat est :

Error:          Not equal: 
                            expected: []float64{NaN}
                            actual  : []float64{NaN}
                            
                            Diff:
            Test:           TestCallMe
Copier après la connexion

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<通常建议使用 /a> 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)
    }
}
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!