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 语言通过
-
编译和链接:
- 在某些情况下,Go 语言本身可能会依赖系统的编译工具链(如
gcc)来处理底层的编译和链接工作,特别是在涉及到跨编译(编译到不同平台)或者与系统库交互时。
- 在某些情况下,Go 语言本身可能会依赖系统的编译工具链(如
-
错误与提示:
- 如果
gcc没有安装,运行cgo相关代码时会出现类似cgo: C compiler "gcc" not found的错误提示。这表明系统找不到gcc,无法进行编译。
- 如果
测试的独立性
测试函数TestPing中,使用的是 httptest.NewRecorder() 来模拟 HTTP 请求,并不会影响已经在运行的服务器。测试过程是完全独立的,在内存中进行,并不会与正在运行的实例产生交互。
友情赞助
大家有空闲,帮忙试用下,国货抖音出品的AI编程代码插件,看看和GitHub Copilot那个好**^-^**
(适用JetBrains全家桶系列、Visual Studio家族IDE工具安装等主流IDE工具,支持100+种编程语言)
帮忙去助力>>