go语言快速入门:自动化测试(17)
2017-02-08 08:02
671 查看
在这篇文章中将会学习一下如何在go语言中使用testing包进行功能测试和性能测试。
可以看出作为一门有后发优势的年轻语言,go在设计的时候标准库中含括一些已经得到证实的最佳实践。
自动化测试
正如Martin Fowler所说的”在你不知道如何测试代码之前,就不该编写程序。而一旦你完成了程序,测试代码也应该完成。除非测试成功,你不能认为你编写出了可以工作的程序”。测试在软件开发中起到了非常关键的作用,而Martin Fowler所倡导的测试代码和程序同时完成的方式在大型项目中也正在应用,随着质量意识的提高以及DevOps的推行,自动化测试在变得越来越重要。自动化测试框架
各种语言都有不同的测试框架,而测试因其种类不同,框架也有所不同,而且同等类似功能的框架也有很多,简单列举一部分与go语言的标准库testing作比较如下语言 | 框架 | 提供者 |
---|---|---|
C | Cunit | 第三方 |
C++ | Cppunit | 第三方 |
Java | Junit | 第三方 |
Python | PyUnit | 第三方->标准库 |
go | testing | go语言标准库 |
go程序测试
通过testing包,go语言编写的程序可以进行功能测试和压力测试(BMT: Benchmark Testing)。如下是在编写测试用例时候需要注意的事项项目 | 说明 |
---|---|
依赖 | import testing |
命令 | go test |
测试文件名 | 必须以_test.go结尾 |
功能测试用例函数 | 必须以Test开头,其后的函数名不能以小写字母开头,比如Testadd是一个错误的命名 |
压力测试用例函数 | 必须以Benchmark开头,其后的函数名不能以小写字母开头 |
功能测试参数 | testing.T |
压力测试参数 | testing.B |
记录测试信息 | .Log方法, 缺省不会显示,仅在go test -v时会显示 |
测试控制 | 通过Error/Errorf/FailNow/Fatal/FatalIf等进行测试是否失败或者在何种条件下失败的控制 |
压力测试 | go test缺省不会进行压力测试的执行,需要执行压力测试的时候要加上参数-test.bench |
压力测试循环体 | 压力测试循环体中会使用test.B.N |
测试对象准备
为了学习go语言中如何使用testing标准库,事前准备前面讲解流程控制时使用到的switch-case的例子,以及一个计算加法的函数项目 | 详细 | 说明 |
---|---|---|
文件名 | basicfunc.go | 测试对象文件 |
package名 | basicfunc | 测试对象Package |
测试对象函数 | GetGrade | 输入分数返回A-D的等级 |
测试对象函数 | Add | 输入两个数字,返回其相加之和 |
例子代码
[root@liumiaocn test]# cat basicfunc.go package basicfunc func GetGrade(score int) string { switch { case score < 60: return "D" case score <= 70: return "C" case score <= 80: return "B" case score <= 90: return "A" default: return "Undefined" } } func Add(num1 int, num2 int) int { return num1 + num2 } [root@liumiaocn test]#
功能测试用例
[root@liumiaocn test]# cat func_test.go package basicfunc import "testing" func TestBasic(test *testing.T) { grade := GetGrade(40) if grade != "D" { test.Error("Test Case failed.") } } func TestAddfunc(test *testing.T) { sum := Add(1, 1) if sum == 2 { test.Log("Passed: 1 + 1 == 2 ") } else { test.Log("Failed: 1 + 1 == 2 ") } } [root@liumiaocn test]#
执行测试
[root@liumiaocn test]# go test PASS ok _/tmp/goprj/test 0.002s [root@liumiaocn test]#
显示执行详细信息
[root@liumiaocn test]# go test -v === RUN TestBasic --- PASS: TestBasic (0.00s) === RUN TestAddfunc --- PASS: TestAddfunc (0.00s) func_test.go:16: Passed: 1 + 1 == 2 PASS ok _/tmp/goprj/test 0.002s [root@liumiaocn test]#
压力测试用例
增加压力测试用例后代码如下[root@liumiaocn test]# cat func_test.go package basicfunc import "testing" func TestBasic(test *testing.T) { grade := GetGrade(40) if grade != "D" { test.Error("Test Case failed.") } } func TestAddfunc(test *testing.T) { sum := Add(1, 1) if sum == 2 { test.Log("Passed: 1 + 1 == 2 ") } else { test.Log("Failed: 1 + 1 == 2 ") } } func BenchmarkAddfunc(bmtest *testing.B) { for cnt := 0; cnt < bmtest.N; cnt++ { Add(1, 1) } } [root@liumiaocn test]#
执行测试
通过压力测试可以看到,Add函数执行了2000000000次,平均执行时间0.33纳秒。[root@liumiaocn test]# go test -bench=. BenchmarkAddfunc 2000000000 0.33 ns/op PASS ok _/tmp/goprj/test 0.691s [root@liumiaocn test]#
详细信息
[root@liumiaocn test]# go test -bench=. -v === RUN TestBasic --- PASS: TestBasic (0.00s) === RUN TestAddfunc --- PASS: TestAddfunc (0.00s) func_test.go:16: Passed: 1 + 1 == 2 BenchmarkAddfunc 2000000000 0.35 ns/op PASS ok _/tmp/goprj/test 0.747s [root@liumiaocn test]#
总结
go语言标准包的testing提供了功能性测试和压力测试常用的方法的框架,可以非常方便地利用其进行自动化测试。相关文章推荐
- go语言快速入门:词法基础(3)
- go语言快速入门:IPC之管道通信(8)
- go语言快速入门:go的反射机制(22)
- Go语言语法快速入门(1)
- go语言快速入门:数据类型使用例(4)
- go语言快速入门:BootStrap应用(16)
- go语言快速入门:简单工厂模式的实现(23)
- go语言快速入门:文档查询(19)
- go语言快速入门:内建函数(6)
- go语言快速入门:模板应用(14)
- go语言快速入门:Web开发框架(10)
- go语言快速入门:JSON处理(24)
- go语言快速入门:简介(1)
- go语言快速入门:流程控制(7)
- go语言快速入门:template模板(12)
- go语言快速入门:模板应用(13)
- go语言快速入门:IPC之Socket(9)
- Go语言快速入门
- go语言快速入门:项目构建实践(21)
- go语言快速入门:测试覆盖率(18)