【问题标题】:Testing lists in GOGO 中的测试列表
【发布时间】:2015-01-26 20:08:49
【问题描述】:

我正在尝试在 GO 中实施测试。但我在结构内的列表语法上苦苦挣扎。

package primeFactor

import "testing"

var testCases = []struct {
    p        int
    expected []int
}{
    {15, [3,5]},
    {26, [2,13]},
    {37, [37]},
    {42, [2,3,7]},
}

func TestPrimeFactor(t *testing.T) {
    for _, test := range testCases {
        observed := PrimeFactor(test.p)
        if observed != test.expected {
            t.Error("For p = %d, expected %t. Got %t.",
                test.p, test.expected, observed)
        }
    }
}

我的输出错误是:

expected ']', found ','
: expected operand, found '{'
: expected ';', found 'for'

感谢您的帮助。谢谢。

【问题讨论】:

    标签: arrays unit-testing testing go


    【解决方案1】:

    托尼的回答解决了您的具体问题,但要解决比较切片的其他问题,您需要使用reflect.DeepEqual

    看看这个例子:

    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func main() {
        observed := []int{1, 2}
        expected := []int{1, 3}
    
        if reflect.DeepEqual(observed, expected) {
            fmt.Println("Slices are the same")
        } else {
            fmt.Println("Slices are different")
        }
    }
    

    https://play.golang.org/p/_JRQ5bqmJf

    【讨论】:

    • 注意:反射可以慢 2 倍到数量级。如果您关心性能,您可能需要一个简单的 for 循环。
    【解决方案2】:

    你当初为什么要写这个?那不是 Go 语法。来自the spec

    切片文字描述了整个底层数组文字。因此,切片文字的长度和容量是最大元素索引加一。切片文字的形式为

    []T{x1, x2, … xn}
    

    所以,在你的情况下:

    var testCases = []struct {
        p        int
        expected []int
    }{
        {15, []int{3, 5}},
        {26, []int{2, 13}},
        {37, []int{37}},
        {42, []int{2, 3, 7}},
    }
    

    该规范非常易读,并没有人们想象的那么可怕。您可能想全面了解它并保持其关闭以供参考。

    【讨论】:

    • 注明。谢谢你。但似乎我需要一次比较一个元素。 "slice con 只能与 nill 进行比较"
    【解决方案3】:

    ...为了完整起见,这里只是一个编写您自己的函数的简单示例,您的测试可以调用该函数来比较切片:

    func slicesMatch(a, b []int) bool {
        la := len(a)
        lb := len(b)
    
        if la != lb {
            return false
        }
    
        for i := 0; i < la; i++ {
            if a[i] != b[i] {
                return false
            }
        }
    
        return true
    }
    

    View it on the Playground

    【讨论】:

    • +1。几个月来,我一直在尝试学习 Go,并且对社区认为“惯用的”特别感兴趣。对于这个简单的用例,是否通常避免使用 reflect 包?还是如您所说,您的帖子只是“为了完整性”?
    • 虽然在示例中reflect.DeepEqual 可以工作(并且对小切片会很快工作),但切片越大,它就会越慢。它跳过各种循环来返回结果,因为它试图确定切片中使用的类型以及如何比较它们。然而,您已经知道切片的类型 (int),因此您可以针对您的用例微调您自己的版本。有些人认为这是个人喜好.. 但我想你会发现很多 Gophers 更喜欢速度。
    • ...如果您担心它的“自定义编写”方面,请不要担心 - 这样的实用功能会随着时间的推移而增长。只需将它们放在自己的包中并在将来再次引用它们,这个问题就会消失:)
    猜你喜欢
    • 2022-10-14
    • 2016-04-25
    • 2020-09-16
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 2012-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多