golang-写一个简单的单元测试

本文介绍了如何在Go语言中进行单元测试,包括编写待测试文件和测试文件,以及如何运行和查看测试覆盖率。通过示例展示了如何测试`square`和`addOne`函数,并解释了测试命令如`go test`和`go test -v -cover`的用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

golang中的单元测试主要使用golang的内建测试指令go test和testing包来实现。

待测试文件

先编写一个简单的待测试文件functions.go,主要包含两个待测试的功能函数square和addOne:

package unittest

func square(i int) int {
	return i * i
}

func addOne(i int) int {
	return i + 1
}

单测文件

首先单测文件的名字一般都是待测试文件名字后加“_test”,因此我们的单测名字就叫作functions_test.go;
单测文件中函数名称以Test开头,紧接着以大写字母开头的单词或短语(一般为待测试的函数名称);
测试函数的参数必须是参数必须是t *testing.T;
这里的单测文件编写如下:

package unittest

import (
	"testing"
)

func TestSquare(t *testing.T) {
	inputs := [...]int{1,2,3}
	expects := [...]int{1,4,9}
	for i:=0;i<len(inputs);i++ {
		res := square(inputs[i])
		if res != expects[i] {
			t.Errorf("input is %d, expected is %d, actual is %d", inputs[i], expects[i], res)
		}
	}
}

注:

  1. 代码中的t.Errorf()函数用于在测试时输出一些信息,类似的函数及用法:
    Fail,Error: 失败,该测试继续,其它测试继续
    FailNow,Fatal: 失败,该测试中止,其它测试继续
    Log: 打印信息
  2. 其它还有一些函数:
    SkipNow: 跳过当前测试
    Skiped: 检测是否跳过
  3. 这里只测试了两个待测函数中的一个;
  4. 这里用的是表格测试法;

进行测试

在单测文件所在目录下执行go test命令,输出:

PASS
ok      aboutGo/unitTest        0.005s

也可以使用go test -v,输出更详细的测试信息:

=== RUN   TestSquare
--- PASS: TestSquare (0.00s)
PASS
ok      aboutGo/unitTest        0.005s

还可以使用go test -v -cover查看覆盖率:

=== RUN   TestSquare
--- PASS: TestSquare (0.00s)
PASS
coverage: 50.0% of statements
ok      aboutGo/unitTest        0.005s

这里的覆盖率只有0.5,因为我们只测了一个函数,如果补齐另一个函数的测试:

package unittest

import (
	"testing"
)

func TestSquare(t *testing.T) {
	inputs := [...]int{1, 2, 3}
	expects := [...]int{1, 4, 9}
	for i := 0; i < len(inputs); i++ {
		res := square(inputs[i])
		if res != expects[i] {
			t.Errorf("input is %d, expected is %d, actual is %d", inputs[i], expects[i], res)
		}
	}
}

func TestAddOne(t *testing.T) {
	inputs := [...]int{1, 2, 3}
	expects := [...]int{2, 3, 4}
	for i := 0; i < len(inputs); i++ {
		res := addOne(inputs[i])
		if res != expects[i] {
			t.Errorf("input is %d, expected is %d, actual is %d", inputs[i], expects[i], res)
		}
	}
}

再执行 go test -v -cover命令:

=== RUN   TestSquare
--- PASS: TestSquare (0.00s)
=== RUN   TestAddOne
--- PASS: TestAddOne (0.00s)
PASS
coverage: 100.0% of statements
ok      aboutGo/unitTest        0.005s

另外注意这里的覆盖率是语句的覆盖率,而不是测试结果正确性的覆盖率。

还有一个命令,go test aboutGo/unitTest -run TestSquare,可以在任意其他目录执行该单测。命令中两个参数的前者是该单测文件在$GOPATH/src下的位置,后者也就是-run的参数是具体要执行的测试函数,当然也可以不指定,这样整个测试文件都会执行。

以上命令后都可以加参数 -timeout 30s,数字自定,设定时间内没有执行完毕会panic。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值