为什么在运行“go test”时未定义此函数?

为什么在运行“go test”时未定义此函数?,go,Go,这是密码 a、 去 a_测试 package main_test import "testing" func TestA(t *testing.T) { Haha() } package main import "testing" func TestA(t *testing.T) { Haha() } 开始构建工作。但是当我运行~/gopath/src/zjk/misc$go test-v时。这是我得到的 # zjk/misc_test ./a_test.go:6:

这是密码

a、 去

a_测试

package main_test

import "testing"

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

import "testing"

func TestA(t *testing.T) {
    Haha()
}
开始构建
工作。但是当我运行
~/gopath/src/zjk/misc$go test-v
时。这是我得到的

# zjk/misc_test
./a_test.go:6: undefined: Haha
FAIL    zjk/misc [build failed]
您需要在
main\u test
package中导入“main”,并像
main.Haha()一样调用它

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

  • 首先是那些监督包(内部)实现的测试,以确保包的完整性、资源使用概况和性能基准等。这些测试应该与包代码本身一起驻留
  • 第二种是测试软件包的功能和使用情况。在这些测试中,我们希望确保一个包经得起它所提供服务的声明。这些测试的一个重要方面是确保我们不会暴露任何不必要的细节;确保私有部分保持私有,公共API非常清晰。这就是为什么这些测试应该以不同的名称驻留在另一个包中,作为测试包的使用者

一个例外是包
main
,它不打算从其他包内部使用,因此我们只在包本身内部编写所有测试(正如@kostya所评论的)。

您的测试在名为
main\u test
的包中,函数在名为
main
的包中。您没有导入
main
,因此无法解决此问题


如果您的测试不能在包
main
中,请将函数移到第三个包。

因为您有不同的包

应该是:

a、 去

a_测试

package main_test

import "testing"

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

import "testing"

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

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

我认为这不适用于
包main
。有时必须使用外部测试来避免循环导入。(在我看来,测试通常应该是外部的(有些人称之为黑盒测试,尽管这令人困惑,请参见)为了避免脆弱性。@AndrewW.Phillips你是对的——也许我应该花一些时间来改进这个答案。关于黑盒与白盒测试,我认为这与我们采取的方法是正交的。我倾向于选择一种确实有利于外部测试的由外而内的方法——并且在大多数情况下会导致白盒测试(就我个人而言,我更喜欢黑盒测试,尽管这并不意味着我会避免白盒测试)。