1

在创建我的一个源文件( 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 command-line-arguments [build failed]

在测试中更改为 util.GenerateUniqueID 可以解决问题,但是在使用Goconvey运行覆盖时会导致构建失败:

无法加载包:导入周期不允许包 rudygunawan.com/MyProject/HFLC-Go/util 导入 rudygunawan.com/MyProject/HFLC-Go/util

有什么想法可以解决这个问题吗?我很困惑。

Go 版本是 go1.7.1 windows/386

4

3 回答 3

1

当我尝试运行单个测试文件时,我遇到了类似的问题。

我想要那个,因为它是一种测试驱动的开发,我只想为我目前正在处理的代码运行测试,而不是所有的 x 分钟运行测试。

解决方案结果不是从文件运行测试,而是按名称运行特定测试(实际上是正则表达式)。所以在你的情况下,我想它会是:

go test ./util -run TestCommonUtil

另一种方法似乎是列出构建测试代码所需的所有文件:

go test util/commonutil_test.go util/commonutil.go
于 2021-04-12T09:01:47.270 回答
1

只是意识到这是一个愚蠢的错误。测试包应该是“util_test”。将测试放在单独的包中(但仍位于同一文件夹中)有助于解决导入周期问题,但仍允许解决未定义的错误。

于 2016-09-28T03:53:00.213 回答
1

我通常编写 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)
   }
}

我倾向于白盒测试(我可以通过小心地不访问包内部来进行“黑盒测试”)的原因之一是通常有一大堆非导出代码也确实应该进行测试。在这个具体的、小例子中,没有一个比另一个大的争论,因为所有可以测试的功能都已经导出。

于 2016-09-28T11:27:26.920 回答