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 处理器能够按预期工作。

相关推荐

  1. GO——单元测试(test)

    2024-01-27 14:38:02       56 阅读
  2. Go单元测试

    2024-01-27 14:38:02       27 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-27 14:38:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-27 14:38:02       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-27 14:38:02       82 阅读
  4. Python语言-面向对象

    2024-01-27 14:38:02       91 阅读

热门阅读

  1. STL标准库(三)序列容器之list

    2024-01-27 14:38:02       58 阅读
  2. PMM深入研究:如何自定义配置和集成到外部grafana

    2024-01-27 14:38:02       53 阅读
  3. Unity 中的接口和继承

    2024-01-27 14:38:02       44 阅读
  4. Spring中的以Aware结尾的接口是做什么的?

    2024-01-27 14:38:02       49 阅读
  5. 数据结构与算法面试系列-01

    2024-01-27 14:38:02       50 阅读
  6. ASP.NET Core Web在CentOS中结合Nginx托管的部署

    2024-01-27 14:38:02       57 阅读
  7. CF1547F Array Stabilization (GCD version) 二分+ST表

    2024-01-27 14:38:02       60 阅读
  8. 【Linux】linux命令 参数 英文全称 方便记忆

    2024-01-27 14:38:02       51 阅读
  9. Base64加解密C语言版

    2024-01-27 14:38:02       35 阅读
  10. C语言中常见的控制流结构

    2024-01-27 14:38:02       60 阅读
  11. SpringTask定时任务

    2024-01-27 14:38:02       59 阅读
  12. springbootv 2.4.0跨域

    2024-01-27 14:38:02       55 阅读