不要运行名称为package_test.go的程序

shi*_*ams 4 unit-testing go

我在包pack1下有以下代码。文件名是pack1.go

package pack1

var Pack1Int int = 42
var pack1Float = 3.14

func ReturnStr() string {
    return "Hello world!"
}
Run Code Online (Sandbox Code Playgroud)

并在主程序中遵循以下代码。文件名是package_test.go

package main

import (
    "fmt"
    "./pack1"
)

func main() {
    var test1 string
    test1 = pack1.ReturnStr()
    fmt.Printf("Return string from pack1 : %s\n", test1)
    fmt.Printf("Integer from pack1 : %d\n", pack1.Pack1Int)
}
Run Code Online (Sandbox Code Playgroud)

当我尝试使用命令运行它时,出现go run package_test.go以下错误:

go run: cannot run *_test.go files (package_test.go)

但是,如果我将文件重命名为,abc.go那么我将获得正确的输出,即

Return string from pack1 : Hello world!
Integer from pack1 : 42
Run Code Online (Sandbox Code Playgroud)

我很好奇使用package_test.go文件名有什么问题。对于只有主软件包的代码,此名称可以正常工作。

这是Go中的错误,还是我做错了什么?

Cra*_*row 8

你不能命名你的程序文件,*_test.go因为这是集成 Go测试系统的一部分

要编写新的测试套件,请创建一个名称以 _test.go 结尾的文件,其中包含此处所述的 TestXxx 函数。将文件与正在测试的文件放在同一个包中。该文件将从常规包构建中排除,但会在运行“go test”命令时包含在内。有关更多详细信息,请运行“go help test”和“go help testflag”。

只需重命名package_test.gopackagetest.go


jfl*_*fly 5

不是错误,它是这样设计的。go run检测到_test文件并将其视为程序包的测试文件,测试文件将被编译为单独的程序包,然后与主测试二进制文件链接并运行。
我们建议把你的包文件GOPATH/src/PACK_NAME/,然后运行你的*_test.gogo test

  • 这似乎是一个愚蠢的语言功能,因为这意味着您无法将 _test.go 文件存储在与 go 包的其余部分相同的目录中。除非我误会了? (2认同)