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

2 回复

看起来,只有当以下列方式调用时它才不工作,否则它是可以工作的。

go test ./internal/lib/client_test.go ./internal/lib/client.go

更多关于Golang中如何从另一个测试文件调用函数的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Go中,测试文件虽然可以包含相同包名的多个文件,但函数和变量的可见性规则仍然适用。你的问题是因为setUptearDown和变量acommon_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()

回到顶部