Go的单元测试

开发项目过程中,少不了单元测试;下面我们认识下单元测试:

Go 语言测试框架可以让我们很容易地进行单元测试,但是需要遵循五点规则。

  • 含有单元测试代码的 go 文件必须以 _test.go 结尾,Go 语言测试工具只认符合这个规则的文件。
  • 单元测试文件名 _test.go 前面的部分最好是被测试的函数所在的 go 文件的文件名
  • 单元测试的函数名必须以 Test 开头,是可导出的、公开的函数。
  • 测试函数的签名必须接收一个指向 testing.T 类型的指针,并且不能返回任何值。
  • 函数名最好是 Test + 要测试的函数名,比如 TestFibonacci,表示测试的是 Fibonacci 这个函数。

单元测试方法示例

在 Go 中,编写单元测试使用 testing 包。以下是一个简单的 Go 单元测试的示例:

假设你有一个包含一些函数的文件 myfunctions.go:

复制代码
// myfunctions.go
package mypackage

func Add(a, b int) int {
	return a + b
}

func Subtract(a, b int) int {
	return a - b
}

然后,你可以创建一个对应的测试文件 myfunctions_test.go:

复制代码
// myfunctions_test.go
package mypackage

import "testing"

func TestAdd(t *testing.T) {
  result := Add(3, 5)
  expected := 8
  if result != expected {
  	t.Errorf("Add(3, 5) returned %d, expected %d", result, expected)
	}
}

func TestSubtract(t *testing.T) {
  result := Subtract(8, 5)
  expected := 3
  if result != expected {
  	t.Errorf("Subtract(8, 5) returned %d, expected %d", result, expected)
  }
}

在这个示例中:

TestAdd 函数测试 Add 函数的行为,确保它正确地将两个数字相加。

TestSubtract 函数测试 Subtract 函数的行为,确保它正确地将两个数字相减。

运行测试的命令是:

复制代码
go test

这将运行当前目录下的所有测试文件。你还可以使用 -v 参数来获得更详细的输出:

复制代码
go test -v

Go 的测试框架会自动识别以 _test.go 结尾的文件并运行其中的测试函数。在测试函数中,你可以使用 t.Errorf 来报告测试失败,或者 t.Logf 输出日志信息。

单元测试HTTP示例

在 Go 中,针对 HTTP 接口进行单元测试通常需要模拟 HTTP 请求和响应,以确保处理器(handler)的行为符合预期。Go 的 net/http/httptest 包提供了用于测试 HTTP 服务器和客户端的工具。

以下是一个简单的 HTTP 接口单元测试的示例,假设有一个处理器函数 HelloHandler 处理 /hello 路由:

复制代码
goCopy code
// main.go
package main

import (
	"fmt"
	"net/http"
)

func HelloHandler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprint(w, "Hello, World!")
}

func main() {
	http.HandleFunc("/hello", HelloHandler)
	http.ListenAndServe(":8080", nil)
}

现在,我们来编写一个单元测试文件 main_test.go

复制代码
goCopy code
// main_test.go
package main

import (
	"net/http"
	"net/http/httptest"
	"testing"
)

func TestHelloHandler(t *testing.T) {
	// 创建一个模拟的 HTTP 请求
	req, err := http.NewRequest("GET", "/hello", nil)
	if err != nil {
		t.Fatal(err)
	}

	// 创建一个 ResponseRecorder 以记录处理器的响应
	rr := httptest.NewRecorder()

	// 将请求传递给处理器
	HelloHandler(rr, req)

	// 检查响应码是否为 200
	if status := rr.Code; status != http.StatusOK {
		t.Errorf("handler returned wrong status code: got %v want %v", status, http.StatusOK)
	}

	// 检查响应内容是否正确
	expected := "Hello, World!"
	if rr.Body.String() != expected {
		t.Errorf("handler returned unexpected body: got %v want %v", rr.Body.String(), expected)
	}
}

在这个测试中:

  • 我们使用 http.NewRequest 创建一个模拟的 HTTP 请求。
  • 使用 httptest.NewRecorder 创建一个 ResponseRecorder,用于记录处理器的响应。
  • 调用 HelloHandler 处理器函数,将请求和响应传递给它。
  • 使用 t.Errorf 来报告测试失败,如果响应码或响应内容不符合预期。

运行测试:

复制代码
go test

使用 httptest 包,你可以方便地创建模拟的 HTTP 请求和响应,确保你的 HTTP 处理器能够按预期工作。

相关推荐
资深web全栈开发5 小时前
并查集(Union-Find)套路详解
leetcode·golang·并查集·unionfind
moxiaoran57537 小时前
Go语言的递归函数
开发语言·后端·golang
朝花不迟暮7 小时前
Go基础-闭包
android·开发语言·golang
西京刀客9 小时前
go语言-切片排序之sort.Slice 和 sort.SliceStable 的区别(数据库分页、内存分页场景注意点)
后端·golang·sort·数据库分页·内存分页
黄昏单车10 小时前
golang语言基础到进阶学习笔记
笔记·golang·go
moxiaoran575319 小时前
Go语言结构体
开发语言·后端·golang
Tony Bai1 天前
Cloudflare 2025 年度报告发布——Go 语言再次“屠榜”API 领域,AI 流量激增!
开发语言·人工智能·后端·golang
卓码软件测评1 天前
第三方APP软件测试机构:【Gatling如何测试移动应用后端API移动网络特性和用户行为模拟】
网络·测试工具·单元测试·测试用例
晚烛1 天前
Flutter + OpenHarmony 质量保障体系:从单元测试到真机巡检的全链路可靠性工程
flutter·单元测试
小徐Chao努力1 天前
Go语言核心知识点底层原理教程【变量、类型与常量】
开发语言·后端·golang