如何编写好的单元测试
单元测试主要有两个方面:
-
编写测试方法
-
编写可测试代码
编写单元测试方法
单元测试特定案例的方法
编写更好的单元测试的技巧
编写单元测试不仅仅是“assert(func()==expected)”
编写可测试代码
如何编写易于测试的代码,测试驱动开发、正确使用设计模式等
编写可以很好地测试的代码和编写好的单元测试一样重要
将现有代码重写为可测试代码虽然痛苦,但是是值得的
Go测试概述
测试一般使用标准库:testing
测试代码文件和正式代码文件应处于一个文件夹下,测试代码文件应以_test.go
结尾
要注意测试文件名不能以_
或.
开始,否者go test
将不会包含这些文件
测试方法也有特殊的格式,应以Test
开头,参数类型需为*testing.T
go test
的测试完整指令:
go test [build/test flags] [packages] [build/test flags & test binary flags]
常用的flag
-
-bench regexp
:性能测试,支持表达式对测试函数进行筛选。-bench .
则是对所有的benchmark函数测试 -
-benchmem
:性能测试的时候显示测试函数的内存分配的统计信息 -
-count n
:运行测试或基准测试多少次,默认一次 -
-run regexp
:只运行特定的测试函数, 比如-run ABC
只测试函数名中包含ABC的测试函数 -
-timeout t
:测试时间如果超过t, panic,默认10分钟 -
-cover
:统计测试覆盖率 -
-v
:显示测试的详细信息,也会把Log
、Logf
方法的日志显示出来 -
-failfast
:测试将在第一个失败即结束
go test
常用的指令:
go test PACKAGE_NAME
测试指定的package,文件的package必须为PACKAGE_NAME
go test .
执行当前文件夹下所有文件的测试
go test ./...
执行当前文件夹下所有文件及文件夹的测试
测试覆盖率
从 Go 1.2开始, Go就提供了一个生成代码覆盖率的工具cover
。
代码覆盖率描述了包中代码有多少语句被测试所覆盖。
指令:
go test -cover [package]
子测试(SubTest)
使用testing包下的func (t *T) Run(name string, f func(t *T)) bool
方法进行子测试,在一个测试方法中进行多个用例的的测试。
使用指令:
go test -run=[TestMethod]/[SubTestName]
可以指定运行某个子测试
例如:
func TestAdd(t *testing.T) {
a := 1
t.Run(“+1”, func(t *testing.T) {
if a + 1 != 2 { t.Fatal("fail!") }
})
t.Run(“+2”, func(t *testing.T) {
if a + 2 != 3 { t.Fatal("fail!") }
})
}
可以使用:
$ go test -run=TestAdd/+1
运行TestAdd测试方法下+1的子测试
标签(Tags)
用于为测试文件分类,通过指定标签,可以指定测试哪些测试文件
为测试文件打标签
// +build add
package person
import (
"testing"
)
// Snipped...
在测试中使用标签
$ go test -tags=add -v
Short模式
使用-short
flag可以跳过测试代码中被指定为Short模式的测试代码
指定测试方法为short模式
func TestSkip(t *testing.T) {
if testing.Short() {
t.Skip("Skipping long-running test.")
}
//Snipped
}
使用
$go test ./... -short -v
跳过Short模式的测试
TDT
TDT也叫表格驱动方法,有时也被归为关键字驱动测试(keyword-driven testing),是针对自动化测试的软件测试方法,它将创建测试程序的步骤分为规划及实现二个阶段。
网友评论