我的一个源文件(commonutil.go)的问题创建单元测试
package util
import "github.com/nu7hatch/gouuid"
// GenerateUUID Returns generated UUID sequence
func GenerateUniqueID(hostname string) (string, error) {
var result, err = uuid.NewV4()
return hostname + ":" + result.String(), err
}
对于上述来源,我创建了测试文件“commonutil_test.go”(在同一包中)
package util
import "testing"
func TestCommonUtil(t *testing.T) {
t.Run("Test generate UUID", func(t *testing.T) {
var uuid, _ = GenerateUniqueID ("test")
//fmt.Printf("UUID isa %v \n", uuid)
if uuid == "" {
t.Errorf("UUID expected, but result is empty ")
}
})
然而,当尝试执行“go test util / commonutil_test.go”时,它显示:
util \ commonutil_test.go:8:undefined:GenerateUniqueID
FAIL命令行参数[build failed]
在测试中更改为util.GenerateUniqueID可以解决问题,但是使用 Goconvey 运行coverage时会导致构建失败:
无法加载包:不允许导入循环 包rudygunawan.com/MyProject/HFLC-Go/util 进口rudygunawan.com/MyProject/HFLC-Go/util
有什么想法解决这个问题吗?我很困惑。
Go版本是go1.7.1 windows / 386
答案 0 :(得分:0)
只是意识到这是一个愚蠢的错误。测试包应该是" util_test"。将测试放在单独的包中(但仍在同一文件夹中)有助于解决导入周期问题,但仍允许解决未定义的错误。
答案 1 :(得分:0)
我通常编写Go单元测试的方法是在与测试代码相同的包中有一个(或多个)..._test.go
文件,每个测试代码都有一个Test...
函数要做。
package util
import "testing
func TestGenerateUniqueID(t *testing.T) {
var uuid1, uuid2 string
uuid1, err = GenerateUniqueID("test")
if err != nil {
t.Errorf("Expected no error, got %s", err) // Maybe Fatalf?
}
if uuid1 == "" {
t.Errorf("Expected non-empty string, got empty string (uuid1)")
}
uuid2, err = GenerateUniqueID("test")
if err != nil {
t.Errorf("Expected no error, got %s", err) // Maybe Fatalf?
}
if uuid2 == "" {
t.Errorf("Expected non-empty string, got empty string (uuid2)")
}
if uuid1 == uuid2 {
t.Errorf("Expected uuid1 and uuid2 to be different, both are %s", uuid1)
}
}
我倾向于白盒测试的原因之一(我可以做的事情"黑盒测试"小心地不访问包内部)是因为通常有大量的非导出代码真的应该进行测试。在这个特定的小例子中,对于一个在另一个上没有大的争论,因为所有可以测试的功能都已经导出了。
答案 2 :(得分:0)
我在尝试运行单个测试文件时遇到了类似的问题。
我想要这样,因为这是一种测试驱动的开发方式,我只想为我目前正在处理的代码运行测试,而不是所有 x 分钟的运行测试。
结果证明解决方案不是从文件运行测试,而是按名称运行特定测试(实际上是正则表达式)。所以在你的情况下,我想它会是:
foreach (var item in groupedByList)
{
var val = item.Key.Item3;
}
另一种方法似乎是列出构建测试代码所需的所有文件:
go test ./util -run TestCommonUtil