前言
TDD(Test Driven Development),那么我们如何做到可反复、无遗漏、高效地测试我们自己写的的代码?实现敏捷开发呢?
这就需要我们自己给自己写的代码写测试用例!
本文主要介绍下在Go语言中如何做单元测试、基准测试、非功能测试。
go test介绍
go test
go build不会把这些测试文件
ps:
我们执行go test_test.go结尾的测试
其过程为生成1个临时的main包用于调用相应的测试函数,然后构建并运行测试文件中的函数、报告测试结果,最后清理测试中生成的临时文件。
_test.go结尾的测试
类型 | 格式 | 作用 |
---|---|---|
测试函数 | 函数名前缀为Test | 测试程序的一些逻辑行为是否正确 |
基准函数 | 函数名前缀为Benchmark | 测试函数的性能(执行时间、内存申请情况) |
示例函数 | 函数名前缀为Example | 为文档提供示例文档 |
单元测试函数(unit testing):是指对软件中的最小可测试单元进行检查和验证。对于单元测试中单元的含义,一般来说,要根据实际情况去判定其具体含义,如C语言中单元指一个函数,Java里单元指一个类,图形化的软件中可以指一个窗口或一个菜单等。总的来说,单元就是人为规定的最小的被测功能模块。
基准测试函数:测试程序执行时间复杂度、空间复杂度
示例函数:为调用该功能代码的人提供演示
以上了解到为了可以使用golang内置的 go test命令实现自动化测试 需要做以下步骤:
1.在需要测试代码的同一目录下,准备一些以x_test.go结尾的测试文件。
2.执行go test自动发现x_test.go结尾的测试文件并执行其内部符合go test 格式的函数 。
有go test这个测试工具之后,对于1个golang程序员来说,主要学习如何准备测试文件、测试文件中的测试函数需要遵循哪些格式规范,go test才会帮我去自动调用、执行我写的测试用例!
单元测试函数
单元测试函数就是1个针对源码中1个单元(func/class)进行功能测试的函数。
单元测试函数格式
1.每个函数必须导入testing包
2.测试函数格式
Test
t
testing.T参数
3.验证测试驱动开发理念
假设现在开发了1个单元(函数), 该单元的功能是对string类型的变量进行split。
split.go (源代码)
split_test.go(单元测试代码)
It's the truth that the test driven the developmen.
我在原来测试用例的基础上增加了1个测试用例3
执行go test测试出bug无法 使用多个字符分割字符串
驱动我继续开发源码
测试组
以上的测试模式中我们每写个测试用例就需要再写1个函数,可以继续优化测试代码!
利用结构体组织测试数据把多个测试用例合到一起,在1个函数内对1组测试用例进行统一测试。
测试代码
源码
测试驱动开发!源码又发现了新的bug!
测试结果
子测试
基于测试组对测试代码再次进行优化,利用使用t *testing.T参数的run方法去执行测试用例。
这种方法可以针对测试组里的1个测试用例进行单独测试,所以也叫子测试。
测试代码
测试结果
测试覆盖率
测试覆盖率是你的代码被测试套件覆盖的百分比。
通常我们使用的都是语句的覆盖率,也就是在测试中至少被运行一次的代码占总代码的比例。
Go提供内置功能来检查你的代码覆盖率。我们可以使用
go test -cover
查看测试覆盖率。
go test -cover -coverprofile=测试报告文件
把测试覆盖率的详细信息输出到文件
go tool cover -html=测试报告文件
把测试报告输出到文件,就是为了分析测试结果,go内置的工具支持以HTML的方式打开测试报告文件!
上图中每个用绿色标记的语句块表示被覆盖了,而红色的表示没有被覆盖。