为什么在运行`go test`时这个函数是不确定的?

时间:2016-04-28 09:53:29

标签: go

这是代码

a.go

package main

import "fmt"

func Haha() {
    fmt.Println("in Haha")
}

func main() {
}

a_test.go

package main_test

import "testing"

func TestA(t *testing.T) {
    Haha()
}

go build有效。但是当我跑~/gopath/src/zjk/misc$ go test -v时。这是我得到的

# zjk/misc_test
./a_test.go:6: undefined: Haha
FAIL    zjk/misc [build failed]

3 个答案:

答案 0 :(得分:3)

因为你有不同的包

应该是:

a.go

package main

import "fmt"

func Haha() {
    fmt.Println("in Haha")
}

func main() {
}

a_test.go

package main

import "testing"

func TestA(t *testing.T) {
    Haha()
}

输出:

# zjk/misc_test
in Haha
PASS
ok      github.com/qwertmax/so  0.009s

答案 1 :(得分:2)

您的测试位于名为main的程序包中,该函数位于名为main的程序包中。您没有导入main,因此无法解决此问题。

如果您的测试不在包// Open an InputStream to read from the file File file = new File("hl7_messages.txt"); InputStream is = new FileInputStream(file); // It's generally a good idea to buffer file IO is = new BufferedInputStream(is); // The following class is a HAPI utility that will iterate over // the messages which appear over an InputStream Hl7InputStreamMessageIterator iter = new Hl7InputStreamMessageIterator(is); while (iter.hasNext()) { Message next = iter.next(); // Do something with the message } 中,请将该功能移至第三个包。

答案 2 :(得分:1)

您需要import "main"main_test包中的main.Haha()称之为main

为了详细说明为什么人们可能会在不同的软件包下进行测试,我应该说有两类测试:

  • 首先,那些监督包的内部实施的测试,以确保它的完整性,资源使用情况和性能基准等。这些测试应该与包代码本身一起存在。
  • 其次是测试包的功能和用法的那些。在这些测试中,我们希望确保软件包能够满足它对其提供的服务的要求。这些测试的一个重要方面是它们确保我们不会暴露任何不必要的细节;确保私有部分保持私密性,公共API非常清晰。这就是为什么这些测试应该以不同的名称存在于另一个软件包中,以便在测试中充当软件包的消费者。

一个例外是包main_test,它不能在其他包中使用,所以我们只是在包本身内编写所有测试(如@kostya所评论)。