开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:单元测试快速入门】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9742
单元测试快速入门
内容介绍
一,单元测试基本介绍
二,单元测试快速入门
三,单元测试快速入门总结
一,单元测试基本介绍
Go 语言中自带有一个轻量级的测试框架 testing 和自带的 go test 命 令来实现单元测试和性能测试(性能测试最主要的参考指标,时间,执行一个代码,花费多少时间,本身能把,函数测试时间返回则最方便), testing 框架 和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题:
1)确保每个函数是可运行,并且运行结果是正确的
2)确保写出来的代码性能是好的,
3)单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下还能保持稳定.
二,单元测试快速入门
使用 Go 的单元测试,对 addUpper 和 sub 函数进行测试。
特别说明:测试时,可能需要暂时退出360。(因为360 可能会认为生成的测试用例程序是木马),接下来演示如何进行单元测试:
package main
Import (
_"fmt"
)
//一个被测试函数
func addupper(n int) int {
res :=θ
for i :=1; i<= n - 1;1++ {
res += 1
}
return res
//传统的测试方法,就是在 main 函数中使用看看结果是否正确
// res := addUpper(10) // 1.+ 1θ = 55
//if res != 55 {
//fmt . Printf(" addUpper 错误 返回值=%v 期望值=%vn", res, 55)
//} else {
//fmt. Printf(" addUpper 正确 期望值=%vln", res, 55)package main
import(
"fmt"
"testing"
//引入 go 的 testing 框架包)
//编写要给测试用例,去测试 addUpper 是否正确func TestAddupper(t *testing.T) {
//调用res := addupper(1θ)
if res ! = 55 {
//fmt .Printf(" Addupper(1θ) 执行错误,期望值=%v实际值=%v\n", 55, res)t.Fatalf("Addupper(1θ) 执行错误,期望值=%v 实际值=%v\n", 55, res)
}
//如果正确,输出日志t.Logf("Addupper(1θ) 执行正确...")
Testing 提供对 Go 包的自动化测试的支持。通过go test 命令,能够自动执行如下形式的任何函数:func TestXxx(*testing.T)
其中 xxx 可以是任何字母数字字符串(但第一一个字母不能是[a-z]) ,用于识别测试例程。
在这些函数中,使用 Error, Fail 或相关方法来发出失败信号。
要编写一个新的测试套件,需要创建-一个名称以_ test.go 结尾的文件,该文件包含 'TestXxx 函数,如上所述。将该文件放在与被测试的包相同的包中。该文件将被排除在正常的程序包之外,但在运行“go test"命令时将被包含。有关详细信息,请运行"go help test"和"go help testtlag"了解。
如果有需要,可以调用*T和*B的Skip方法,跳过该测试或基准测试:func TestTimeConsuming(t *testing.T) {
if testing. Short() {
t. Skip("skipping test in short mode.")}
T是传递给测试函数的一种类型,它用于管理测试状态并支持格式化测试日志。测试日志会在执行测试的过程中不断累积,并在测试完成时转储至标准输出。
当一个测试的测试函数返回时,又或者当一个测试函数调用 FailINow、Fatal、 Fatalf、 SkipNow、 Skip 或者Skipf中的任意一个时 ,该测试即宣告结束。跟 Parallel方法样,以上提到的这些方法只能在运行测试函数的 goroutine 中调用。
至于其他报告方法,比如 Log 以及 Error 的变种,则可以在多个goroutine 中同时进行调用。
cal.go
函数1
函数2cal_test.go
对cal.go的函数进行测试 function TestAUpper(t*testing.T)
testing 框架
将 xxx_test.go 的文件引入 import…main(){
//调用 Testxxx()函数}
package main
import (
"fmt"
”testing" //引入go的 testing 框架包
)
//编写要给测试用例,去测试 addupper 是否正确func TestGetsub(t *testing.T) {
//调用res := getSub(1θ, 3)
if res != 7 {
//fmt. Printf(" Addupper(1θ) 执行错误,期望值=%v实际值=%v\n", 55, res)t.Fatalf("getSub(1θ, 3)执行锴误,期望值=%v实际值=%v\n", 7, res)
}
//如果正确,输出日志t.Logf("getSub(1θ, 3) 执行正确...")
package main
import (
"fmt"
”testing"
//引入go的 testing 框架包
)
//编写要给测试用例,去测试 addupper 是否正确func TestGetsub(t *testing.T) {
//调用res := getSub(1, 3)
if res != 55 {
//fmt. Printf(" Addupper(1θ)执行错误,期望值=%v实际值=%v\n", 55, res)t.Fatalf("getSub(1θ, 3)执行锴误,期望值=%v实际值=%v\n", 7, res)
}
//如果正确,输出日志t.Logf("getSub(1θ, 3) 执行正确...")
}
func TestHello(t *testing-T) a
fmt Println("TestHe11o..")
}
package main
import (
"fmt"
"testing"
//引入 go 的 testing 框架包
)
//编写要给测试用例,去测试 addupper 是否正确func TestGetsub(t *testing.T) {
//调用res ;= getsub(1θ,3)
if res != 7 {
//fmt . Printf("Addupper(1θ)执行错误,期望值=%v实际值=%v\n", 55, res)t.Fatalf("getSub(1θ, 3)执行错误,期望值=%v实际值=%v\n", 7, res)
}
//如果正确,输出日志t.Logf("getSub(1θ, 3)执行正确...")
package main
//一个被测试函数func addupper(n int) int {
res := θ
for i:= 1;1 <= n - 1; 1++ {
res += i
}
return res
}
//求两个数的查func getSub(n1 int, n2 int) int {
return n1- n2
}
package cal
import (
"fmt"
”testing"
//引入go的 testing 框架包
)
//编写要给测试用例,去测试 addupper 是否正确func TestGetsub(t *testing.T) {
//调用res := getsub(1θ, 3)
if res != 7 {
//fmt. Printf(" Addupper(1θ)执行错误,期望值=%v实际值=%v\n", 55, res)t.Fatalf("getSub(1θ, 3)执行锴误,期望值=%v实际值=%v\n", 7, res)
}
//如果正确,输出日志t.Logf("getSub(1θ, 3) 执行正确!!!!...")
package main
//一个被测试函数func addupper(n int) int {
res :=
for i:= 1;1 <= n; 1++ {
res += i
}
return res
}
//求两个数的查func getSub(n1 int, n2 int) int {
return n1- n2
三,单元测试快速入门总结
1. 测试用例文件名 必须以 test.go 结尾。比如 cal test.go,cal 不是固定的。
2. 测试用例函数必须以 Test 开头,一般来说就是 Test+被测试的函数名,比如esddpperor3) TestAddUpper(t *tesing.T)
的形参类型必须是*testing.T
3. 一个测试用例文件中, 可以有多个测试用例函数,比如TestAddUpper、 TestSub5)
运行测试用例指令
cmd>go test [如果运行正确,无日志,错误时,会输出日志]
cmd>go test -V [运 行正确或是错误,都输出日志]
4. 当出现错误时,可以使用 t.Fatalf 来格式化输出错误信息,并退出程序
t.Logf 方法可以输出相应的日志
5. 测试用例函数,并没有放在 main 函数中,也执行了,这就是测试用例的方便之处[原理图].
6. PASS 表示测试用 例运行成功,FAIL 表示测试用例运行失败
测试单个文件,一定要带上被测试的原文件go test-v cal test.go cal.go
7. 测试单个方法
go test -V -test.run TestAddUpper