使用gocheck测试go(golang)代码,套件功能如何工作?

时间:2014-06-25 02:07:13

标签: unit-testing testing go

我试图使用gocheck来测试我的go代码。我用以下示例指导自己(类似于他们网站提供的示例):

package hello_test

import (
    "testing"

    gocheck "gopkg.in/check.v1"
)

// Hook up gocheck into the "go test" runner.
func Test(t *testing.T) {
    gocheck.TestingT(t)
}

type MySuite struct{} //<==== Does the struct have to be named that way, what if we have multiple of these and register them, is it a problem?

var _ = gocheck.Suite(&MySuite{}) // <==== What does this line do?

func (s *MySuite) TestHelloWorld(c *gocheck.C) {
    c.Assert(42, gocheck.Equals, "42")
    c.Check(42, gocheck.Equals, 42)
}

但是,即使阅读完文档后,我也不确定是否理解了一些内容。为什么行type MySuite struct{}需要,甚至更有趣的一行,为什么需要var _ = gocheck.Suite(&MySuite{})?第一个,它很容易推断出一个人可能必须首先声明该结构并创建将运行测试的函数,如果使用如图所示的签名实现的话。然而,第二行打败了我。我真的不知道为什么需要它。文档说:

  

Suite将给定值注册为要运行的测试套件。任何以给定值中的Test前缀开头的方法都将被视为测试方法。

但是,我不确定很多事情。例如,如果我在同一个文件中运行带有多个MySuite结构的函数,是否会出现问题?类型MySuite struct有什么特别之处吗?即使注册了一些不同的结构,gocheck测试套件也可以工作吗?基本上,我们可以在一个文件中注册一个结构多少次,它仍然可以工作吗?

1 个答案:

答案 0 :(得分:3)

gocheck.Suite函数具有使用gocheck包注册给定套件值的副作用。在内部,它只是将套件添加到一片注册的测试套件中。您可以通过以下方式获得相同的效果:

func init() {
    gocheck.Suite(&MySuite{})
}

任何一种形式都应该有效,所以这只是一种风格问题。

当您致电gocheck.TestingT时,会运行已注册测试套件中的测试。您在名为Test的测试中执行此操作,该测试将由Go的测试框架获取。这就是gocheck测试如何集成到测试框架中的方法。请注意,您只需要调用TestingT即可运行所有测试套件:不是每个测试套件都有一个。