go 语言提供了强大的单元测试框架,可用于验证代码的正确性。设置单元测试时,需创建以 test 开头的单元测试函数,并使用断言函数(如 equal、true 等)来验证预期行为。通过创建 _test.go 文件并包含单元测试函数,可轻松实现单元测试。这些单元测试可用于测试简单函数、http 端点或数据库查询等复杂功能,以确保代码在各种输入下产生正确的输出。
使用 Go 的单元测试:实践案例
Go 语言提供了一个强大的单元测试框架,使开发人员能够轻松测试其代码的正确性。在本文中,我们将了解如何使用 Go 进行单元测试,并通过一个实际示例来说明其工作原理。
设置单元测试
要设置单元测试,请在你的项目中创建一个名为 _test.go 的新文件。这个文件将包含你的单元测试函数,它们应该以 Test 开头:
import "testing"
func TestSomething(t *testing.T) {
// 你的测试代码
}
断言
单元测试通过使用断言来验证代码的预期行为。Go 提供了多种断言函数:
- Equal(a, b):断言 a 和 b 相等
- NotEqual(a, b):断言 a 和 b 不相等
- True(x):断言 x 为真
- False(x):断言 x 为假
示例:计算函数
让我们创建一个简单的 Add 函数并为其编写单元测试:
func Add(a, b int) int {
return a + b
}
import "testing"
func TestAdd(t *testing.T) {
tests := []struct {
a int
b int
expected int
}{
{1, 2, 3},
{3, 4, 7},
{-1, 10, 9},
}
for _, tt := range tests {
result := Add(tt.a, tt.b)
if result != tt.expected {
t.Errorf("Add(%d, %d) = %d, expected %d", tt.a, tt.b, result, tt.expected)
}
}
}
实战案例
上述测试确保了 Add 函数在各种输入下产生正确的输出。单元测试还可以用于测试更复杂的功能,例如 HTTP 端点或数据库查询。
例如,我们可以为一个简单的 REST API 编写一个单元测试来验证其 GET 端点的响应:
import "testing"
import "net/http"
import "net/http/httptest"
import "encoding/json"
type Response struct {
Name string `json:"name"`
Address string `json:"address"`
}
func TestGetUser(t *testing.T) {
req, err := http.NewRequest("GET", "/user/1", nil)
if err != nil {
t.Fatal(err)
}
rr := httptest.NewRecorder()
handler := http.HandlerFunc(GetUser)
handler.ServeHTTP(rr, req)
var response Response
err = json.NewDecoder(rr.Body).Decode(&response)
if err != nil {
t.Fatal(err)
}
if response.Name != "John Doe" || response.Address != "123 Main St" {
t.Errorf("Unexpected response: %v", response)
}
}