当前位置: 首页 > 面试题库 >

如何在Golang中测试地图的等效性?

邹修真
2023-03-14
问题内容

我有一个像这样的表驱动测试用例:

func CountWords(s string) map[string]int

func TestCountWords(t *testing.T) {
  var tests = []struct {
    input string
    want map[string]int
  }{
    {"foo", map[string]int{"foo":1}},
    {"foo bar foo", map[string]int{"foo":2,"bar":1}},
  }
  for i, c := range tests {
    got := CountWords(c.input)
    // TODO test whether c.want == got
  }
}

我可以检查长度是否相同,并编写一个循环来检查每个键值对是否相同。但是,当我想将其用于另一种类型的地图(例如map[string]string)时,必须再次编写此检查。

我最终要做的是,将地图转换为字符串并比较了字符串:

func checkAsStrings(a,b interface{}) bool {
  return fmt.Sprintf("%v", a) != fmt.Sprintf("%v", b) 
}

//...
if checkAsStrings(got, c.want) {
  t.Errorf("Case #%v: Wanted: %v, got: %v", i, c.want, got)
}

假定等效映射的字符串表示形式相同,在这种情况下,这似乎是正确的(如果键相同,则它们会散列为相同的值,因此它们的顺序将相同)。有一个更好的方法吗?在表驱动测试中比较两个映射的惯用方式是什么?


问题答案:

Go库已经覆盖了您。做这个:

import "reflect"
// m1 and m2 are the maps we want to compare
eq := reflect.DeepEqual(m1, m2)
if eq {
    fmt.Println("They're equal.")
} else {
    fmt.Println("They're unequal.")
}

如果你看一下源代码供reflect.DeepEqualMap情况下,你会发现,如果两个地图它首先检查是零,那么检查之前,他们具有相同的长度最后检查,看看他们是否有相同的一组(键,值)对。

由于reflect.DeepEqual采用接口类型,因此可以在任何有效的地图(map[string]bool, map[struct{}]interface{},等)上使用。请注意,它也适用于非地图值,因此请注意,传递给它的实际上是两个地图。如果您传递两个整数,它将很高兴地告诉您它们是否相等。



 类似资料:
  • 问题内容: 最近,我希望为golang编写单元测试。功能如下。 那么,如何测试“ func Display”的结果是“ hello world”呢? 问题答案: 您只需输入自己的值,然后测试写入其中的内容是否符合您的期望。这样做是一个不错的选择,因为它只是将输出存储在其缓冲区中。

  • 问题内容: 将参数传递给已编译的代码: 结果是: 显示已通过的用户名。 目的: 为了防止每次测试代码时都需要手动构建和运行代码,目的是编写一个能够测试参数传递的测试。 尝试 运行以下测试: 结果是: 问题 它看起来像那样不能够这个参数传递给函数的结果是不是 问题答案: 根据我的评论,第一个值是可执行文件本身的(路径),因此应解决您的问题。您可以从标准包中查看标志测试,他们正在做类似的事情。 另外,

  • 问题内容: 我已经写了某些没有主要方法的代码。但是我想知道代码是否有任何问题。基本上,我可以使用Eclipse中的JUnit测试用例来实现(我使用的是Linux)。但是我必须在目前没有Eclipse的Windows中进行测试。因此,我可以选择在cmd中进行操作(如果可能的话)。在cmd中等效的JUnit测试(Eclipse)是什么? 问题答案: 查看此页面:http : //junit.sourc

  • 我已经创建了一些mapstruct映射器,并用spring构造函数注入进行了注释。我知道在测试中,我可以用自动绘制映射器,但它看起来很重,加载速度很慢。我可以在不初始化spring上下文的情况下获取映射器吗?这是好的做法吗?

  • 问题内容: 我已经在“ Go编程语言”中读到“无论哈希表有多大,平均都可以使用恒定数量的键比较来检索给定的键”。我不确定这在内部实现方面意味着什么。这是否意味着它会搜索每个键,直到找到匹配项,或者内部使用某种类型的二进制(或其他)搜索算法? 例如,如果我有一个具有2,000个键的地图,那么它“平均”是否需要查看1,000才能找到匹配项?或者它只像二进制搜索那样只查看11(log2 n)? 谢谢,本

  • 问题内容: 假设我有一个单元测试,想要比较两个复数对象是否相等。这些对象包含许多其他深层嵌套的对象。所有对象的类都有正确定义的方法。 这并不困难: 麻烦的是,如果对象不相等,那么您得到的只是一个失败,没有迹象表明对象图的哪一部分不匹配。调试它可能会很痛苦且令人沮丧。 我当前的方法是确保一切都实现了,然后像这样比较相等性: 由于像Eclipse这样的IDE具有一个特殊的可视化比较器,用于显示失败测试