go语言开发中,对测试文件和测试函数有特殊的约定:
测试文件必须以_test.go结尾
测试文件内的测试函数,必须用Test开头
这样使用go test 命令时,系统自动检测当前目录和子目录下以 _test.go
结尾的文件,并查找其中以 Test
开头的函数。
go test
测试过程是完全独立的,在内存中进行,并不会与正在运行的实例产生交互,也不需要启动实例。
如果你的测试文件不在当前目录,或者没有遵循命名规范,Go 将提示错误:
github.com/cloudreve/Cloudreve/v3 [no test files]
TestMain函数
运行测试go test时,TestMain
函数会首先执行初始化操作,然后依次运行检测到的测试函数。
#看到详细的测试输出 go test -v # 运行指定的测试函数,例如:/routers/router_test.go中函数 func TestPing(t *testing.T) { asserts := assert.New(t) router := InitMasterRouter() w := httptest.NewRecorder() req, _ := http.NewRequest("GET", "/api/v3/site/ping", nil) router.ServeHTTP(w, req) assert.Equal(t, 200, w.Code) asserts.Contains(w.Body.String(), "Pong") } # 运行指定的测试函数,`^TestPing$` 是一个正则表达式,精确匹配 `TestPing` 函数的名称 go test -run ^TestPing$ 或者,看到详细的测试输出 go test -v -run ^TestPing$ # 把所有输出保存到 `test.log` 文件中 go test -v -run ^TestPing$ 2>&1 | tee test.log
GCC
go test
在编译和运行测试时,通常需要使用 C 编译器(如 gcc
),特别是在涉及到 Cgo 或一些依赖项时。
gcc
通常指的是 GNU Compiler Collection,它是一个广泛使用的编译器,支持多种编程语言,包括 C、C++、Go 等。
安装 gcc
编译器: 在终端中执行以下命令:
sudo dnf install gcc
gcc
在 Go 语言中的作用
Cgo 支持:
Go 语言通过
cgo
工具与 C 语言代码进行互操作,允许 Go 代码调用 C 函数或者链接 C 库。要使用cgo
,系统中需要安装 C 编译器(如gcc
),因为cgo
需要将 C 代码编译成可执行的机器码。例如,如果你在 Go 项目中使用了
cgo
,编译和运行时gcc
会被用来编译嵌入的 C 代码。编译和链接:
在某些情况下,Go 语言本身可能会依赖系统的编译工具链(如
gcc
)来处理底层的编译和链接工作,特别是在涉及到跨编译(编译到不同平台)或者与系统库交互时。错误与提示:
如果
gcc
没有安装,运行cgo
相关代码时会出现类似cgo: C compiler "gcc" not found
的错误提示。这表明系统找不到gcc
,无法进行编译。
测试的独立性
测试函数TestPing中,使用的是 httptest.NewRecorder()
来模拟 HTTP 请求,并不会影响已经在运行的服务器。测试过程是完全独立的,在内存中进行,并不会与正在运行的实例产生交互。