我在一个名为db
的包中有两个文件,其中一个包含一些未导出的变量。另一个是测试文件,需要使用这些变量:
(这是项目的结构)
$GOPATH/src/gitlab.com/myname/projectdir
├── main.go
└── db
├── add.go
└── add_test.go
(这是文件的简洁变体)
分贝/ add.go
package db
func Add(x, y int) int {
return x + y
}
// some other functions that use a and b from `add_test.go`
分贝/ add_test.go
package db
import (
"testing"
)
var (
a = 1
b = 2
)
// test function use variables from add.go
func testAdd(t *testing.T) {
result := add(a, b)
if result != 3 {
t.Error(err)
}
}
在go test
目录中运行db/
,但是一旦我运行go run main go
,就会产生以下错误:
db / add.go :: undefined:a db / add.go :: undefined:b
在构建过程中,add.go
似乎无法从a
找到b
和add_test.go
。
main.go
package main
import (
"fmt"
"gitlab.com/myname/projectdir/db"
)
func main() {
res := db.Add(1, 2)
fmt.Println(res)
}
这是因为在构建过程中未包含add_test.go
吗?
答案 0 :(得分:2)
这就是go工具的工作方式。
只有在您运行_test.go
时才会编译 go test
个文件。从另一个包导入包时,不会使用其_test.go
文件中的任何代码。
尝试从db包中运行go build
或go install
。它会失败。
答案 1 :(得分:1)
Go中的相对路径很敏感。首先,我认为你需要在import "./db"
前添加前缀。另一件事是你应该在你的$ GOPATH / src位置。
试试这个:
$GOPATH/src/project
和$GOPATH/src/project/db
目录。./db
作为数据包包的前缀。对于IDE,这完全取决于您使用的任何插件。尝试自己运行这些工具:golint
,go vet
,oracle
等,以查看实际的警告和错误。
答案 2 :(得分:0)
测试功能应从Test开始。这就是文档所说的内容。
func TestAdd(t *testing.T) {
result := Add(a, b)
if result != 3 {
t.Errorf("expected 3, got %d ", result)
}
}
干杯。