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中文網其他相關文章!