【go语言开发】编写单元测试

本文主要介绍使用go语言编写单元测试用例,首先介绍如何编写单元测试,然后介绍基本命令的使用,最后给出demo示例

文章目录

前言

在go语言中编写单元测试时,使用说明

  1. 测试文件命名:在 Go 语言中,测试文件的命名应与被测试的源代码文件相同,但以 “_test” 结尾。例如,如果你的源代码文件名为 example.go,则测试文件名应为 example_test.go。

  2. 导入 testing 包:在测试文件的开头,导入 testing 包,这是 Go 语言内置的用于编写单元测试的包。

  3. 编写测试函数:测试函数的命名应以 “Test” 开头,后面跟着被测试的函数名,并接收一个参数 t *testing.T。例如,如果要测试名为 Add 的函数,测试函数名应为 TestAdd(t *testing.T)。

  4. 使用 t.Error 或 t.Errorf 进行断言:在测试函数中,你可以使用 t.Error 或 t.Errorf 方法来判断测试是否通过。如果断言条件为假,则测试失败。例如,t.Error(“错误信息”) 表示测试失败并输出错误信息,而 t.Errorf(“格式化错误信息”, 参数列表…) 允许你使用类似 fmt.Printf 的格式化字符串。

  5. 运行测试命令:在项目的根目录下,使用 go test 命令来执行单元测试。Go 语言会自动找到并运行所有的测试文件。你还可以使用 -v 参数来获取更详细的输出。

  6. 测试覆盖率报告:你可以使用 -cover 参数来生成测试覆盖率报告。例如,go test -cover 将显示每个被测试的函数的覆盖率百分比。

  7. 子测试:你可以在单个测试函数中定义多个子测试,以便更好地组织和管理测试代码。使用 t.Run 方法来运行子测试。

命令

测试用例文件使用go test指令来执行,不需要 main() 作为函数入口

Go 语言的测试工具提供了许多命令和选项来帮助你编写和运行测试。以下是一些常见的 go test 命令和选项:

  • go test: 在项目的根目录下,使用此命令来运行所有的测试文件并输出测试结果。
  • go test : 运行特定包中的所有测试文件,并输出测试结果。例如,go test calc 将运行 calc 包中的所有测试文件。
  • go test -v: 输出更详细的测试结果信息,包括测试名称、测试运行时间、测试覆盖率等。
  • go test -run : 仅运行名称匹配给定模式的测试函数。例如,go test -run TestAdd 将仅运行名称为 TestAdd 的测试函数。
  • go test -cover: 生成测试覆盖率报告,显示每个被测试的函数的覆盖率百分比。
  • go test -coverprofile : 生成覆盖率文件,并将其写入指定文件。例如,go test -coverprofile cover.out 将生成一个名为 cover.out 的文件,其中包含测试覆盖率数据。
  • go tool cover -html : 使用 HTML 格式显示覆盖率报告。例如,go tool cover -html=cover.out 将使用浏览器显示 cover.out 文件的测试覆盖率报告。

示例

package test

import "testing"

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

func TestAdd(t *testing.T) {
	result := Add(4, 5)
	if result != 9 {
		t.Errorf("Add(4,5)=%d fail\n", result)
	}
}

点击红圈地方,可以直接运行单元测试用例
在这里插入图片描述
控制台输出结果:
在这里插入图片描述

命令行运行:

  • go test
    在这里插入图片描述
    go test -v
    在这里插入图片描述
  • 21
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Ginkgo 是一个 Go 语言的 BDD(行为驱动开发)测试框架,可以用来编写单元测试。下面是一些 Ginkgo 编写单元测试的规范和示例: 1. 每个测试套件应该只测试一个功能或行为。这样可以使测试更加清晰和易于维护。 ```go var _ = Describe("Calculator", func() { Context("when adding two numbers", func() { It("should return the sum", func() { calculator := NewCalculator() result := calculator.Add(2, 3) Expect(result).To(Equal(5)) }) }) }) ``` 2. 使用 Describe 和 Context 来描述测试场景和测试条件。这样可以让测试更加直观和易于理解。 ```go var _ = Describe("Calculator", func() { Context("when adding two numbers", func() { It("should return the sum", func() { // test code... }) }) Context("when subtracting two numbers", func() { It("should return the difference", func() { // test code... }) }) }) ``` 3. 使用 It 来描述测试用例,每个测试用例应该只测试一个方面。这样可以使测试更加精确和可靠。 ```go var _ = Describe("Calculator", func() { Context("when adding two numbers", func() { It("should return the sum", func() { calculator := NewCalculator() result := calculator.Add(2, 3) Expect(result).To(Equal(5)) }) It("should be commutative", func() { calculator := NewCalculator() result1 := calculator.Add(2, 3) result2 := calculator.Add(3, 2) Expect(result1).To(Equal(result2)) }) }) }) ``` 4. 使用 Expect 和 To 来断言测试结果。这样可以使测试更加直观和易于理解。 ```go var _ = Describe("Calculator", func() { Context("when adding two numbers", func() { It("should return the sum", func() { calculator := NewCalculator() result := calculator.Add(2, 3) Expect(result).To(Equal(5)) }) It("should be commutative", func() { calculator := NewCalculator() result1 := calculator.Add(2, 3) result2 := calculator.Add(3, 2) Expect(result1).To(Equal(result2)) }) }) }) ``` 5. 使用 BeforeEach 和 AfterEach 来进行测试前和测试后的准备和清理工作。这样可以使测试更加稳定和可靠。 ```go var _ = Describe("Calculator", func() { var calculator *Calculator BeforeEach(func() { calculator = NewCalculator() }) AfterEach(func() { calculator = nil }) Context("when adding two numbers", func() { It("should return the sum", func() { result := calculator.Add(2, 3) Expect(result).To(Equal(5)) }) It("should be commutative", func() { result1 := calculator.Add(2, 3) result2 := calculator.Add(3, 2) Expect(result1).To(Equal(result2)) }) }) }) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫哥说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值