Golang中如何从另一个测试文件调用函数
Golang中如何从另一个测试文件调用函数 你好,
我有两个测试文件,并且正在从一个测试文件中调用另一个测试文件中的函数。然而,在运行测试时,我遇到了 undefined 错误。我是不是漏掉了什么?
谢谢
单独运行这个文件是正常的
setUp
hello
test
tearDown
bye
# internal/lib/client_test.go
package client
import (
"fmt"
"testing"
)
var a string
func setUp() {
a = "hello"
fmt.Println("setUp")
}
func tearDown() {
a = "bye"
fmt.Println("tearDown")
}
func TestController_Create(t *testing.T) {
setUp()
fmt.Println(a)
fmt.Println("test")
tearDown()
fmt.Println(a)
}
这个无法工作
undefined: setUp
undefined: a
undefined: tearDown
undefined: a
# internal/lib/client_test.go
package client
import (
"fmt"
"testing"
)
func TestController_Create(t *testing.T) {
setUp()
fmt.Println(a)
fmt.Println("test")
tearDown()
fmt.Println(a)
}
# internal/lib/common_test.go
package client
import (
"fmt"
)
var a string
func setUp() {
a = "hello"
fmt.Println("setUp")
}
func tearDown() {
a = "bye"
fmt.Println("tearDown")
}
更多关于Golang中如何从另一个测试文件调用函数的实战教程也可以访问 https://www.itying.com/category-94-b0.html
看起来,只有当以下列方式调用时它才不工作,否则它是可以工作的。
go test ./internal/lib/client_test.go ./internal/lib/client.go
更多关于Golang中如何从另一个测试文件调用函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
在Go中,测试文件虽然可以包含相同包名的多个文件,但函数和变量的可见性规则仍然适用。你的问题是因为setUp、tearDown和变量a在common_test.go中是小写开头,这意味着它们只在common_test.go文件中可见(包级私有)。
要让这些函数和变量在同一个包的其他测试文件中可用,需要将它们导出(首字母大写)。以下是修改后的示例:
internal/lib/common_test.go
package client
import (
"fmt"
)
var A string // 改为大写导出
func SetUp() { // 改为大写导出
A = "hello"
fmt.Println("setUp")
}
func TearDown() { // 改为大写导出
A = "bye"
fmt.Println("tearDown")
}
internal/lib/client_test.go
package client
import (
"fmt"
"testing"
)
func TestController_Create(t *testing.T) {
SetUp() // 调用导出的函数
fmt.Println(A) // 访问导出的变量
fmt.Println("test")
TearDown() // 调用导出的函数
fmt.Println(A) // 访问导出的变量
}
另一种方法是使用测试的TestMain函数来设置全局的初始化和清理工作:
internal/lib/common_test.go
package client
import (
"fmt"
"os"
"testing"
)
var a string
func TestMain(m *testing.M) {
setUp()
code := m.Run()
tearDown()
os.Exit(code)
}
func setUp() {
a = "hello"
fmt.Println("setUp")
}
func tearDown() {
a = "bye"
fmt.Println("tearDown")
}
internal/lib/client_test.go
package client
import (
"fmt"
"testing"
)
func TestController_Create(t *testing.T) {
fmt.Println(a)
fmt.Println("test")
}
运行测试时,TestMain会在所有测试之前执行setUp(),在所有测试之后执行tearDown()。

