首頁 >後端開發 >Golang >如何在單元測試中比較 Go 切片和 NaN 元素?

如何在單元測試中比較 Go 切片和 NaN 元素?

WBOY
WBOY轉載
2024-02-12 13:00:091010瀏覽

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

php小編百草在單元測試中比較 Go 切片和 NaN 元素是一個常見的問題。在處理切片時,我們經常需要比較兩個切片是否相等,但當切片包含 NaN 元素時,比較會變得複雜。 NaN 是一個特殊的浮點數,它代表不是一個數值。在 Go 中,使用 math套件中的 IsNaN 函數來判斷浮點數是否為 NaN。透過對切片中的每個元素進行遍歷,並使用 IsNaN 函數判斷是否為 NaN,我們可以實現切片的比較操作。

問題內容

我需要在單元測試中比較 2 個切片,我認為 assert 套件應該解決這個問題,但它不適用於 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())
}

輸出為:

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

我知道 nan 的一個屬性不等於其自身,但另一方面我從函數中收到了預期的結果。

我想知道如何解決這個問題 - 獲得簡潔的單元測試斷言和清晰的輸出?

作為替代方案,我可以避免使用assert 並在兩個切片的每個元素上呼叫math.isnan ,但這在單元測試中看起來會格外冗長。

解決方法

github.com/google/go-cmp/cmp 套件進行更複雜的比較。 cmpopts.equatenans 可以用來輕鬆比較可能包含 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)
    }
}

以上是如何在單元測試中比較 Go 切片和 NaN 元素?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除