卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章64334本站已运行4115

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

如何在单元测试中比较 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<通常建议使用 /a> 包进行更复杂的比较。 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)
    }
}
卓越飞翔博客
上一篇: 正则表达式将单词与边界精确匹配
下一篇: 发送电子邮件时出现错误 wsarecv:现有连接被远程主机强行关闭
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏