go-单元测试
基本介绍
golang中自带有一个轻量级的测试架构testing
和自带的go test
命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对响应函数的测试用例,也可以基于该框架写想用的压力测试用例,可用于解决以下问题:
确保每个函数是可运行的,并且运行结果是正确的 确保写出来的代码性能是好的 单元测试能及时的发现程序设计或实现的逻辑错误,是问题尽早暴露,便于问题的丁文解决,而性能测试的重点在于发现程序设计上的一些问题,让程序能够在高并发的情况下保持稳定
package main
import (
"testing"
)
func TestAddUpper ( t * testing. T) {
res := addUpper ( 10 )
if res != 55 {
t. Fatalf ( "addUpper(10) error!" )
}
t. Logf ( "addUpper(10) ok" )
}
func TestSub ( t * testing. T) {
res := sub ( 10 , 3 )
if res != 5 {
t. Fatalf ( "sub(10,3) error!" )
}
t. Logf ( "sub(10,3) ok" )
}
package main
func addUpper ( n int ) int {
res := 0
for i := 0 ; i <= n; i++ {
res += i
}
return res
}
func sub ( a, b int ) int {
return a - b
}
注意
测试用例文件名以xxx_test.go
表示 测试用例函数必须是TestXxx(t *Testing.T)
TestXxx的形参必须是t *Testing.T
一个测试用例文件中,可以有多个测试用例函数 运行测试用例的指令:
go test
,若正确运行,无日志,错误时,会输出日志go test -v
,不管运行正确还是错误,都会输出日志 当出现错误时,可以使用t.Fatalf()
来格式化输出错误信息,并退出程序 t.Logf()
方法可以输出相应的日志测试用例函数,并没有放在main函数中,也会执行 PASS表示测试用例运行成功,FAIL表示测试用例运行失败 可以只测试单个文件 可以测试单个方法
案例
import (
"bufio"
"encoding/json"
"fmt"
"os"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Skill string `json:"skill"`
}
func ( monster * Monster) Store ( ) {
filePath := "src/go_code/Study_go/Study_go_fifteen/demo02/file/monster.txt"
file, err2 := os. OpenFile ( filePath, os. O_RDWR| os. O_CREATE, 0666 )
if err2 != nil {
fmt. Printf ( "err2: %v\n" , err2)
return
}
defer file. Close ( )
fmt. Printf ( "monster: %v\n" , monster)
strjson, err := json. Marshal ( monster)
if err != nil {
fmt. Printf ( "err: %v\n" , err)
return
}
writer := bufio. NewWriter ( file)
str := string ( strjson)
fmt. Printf ( "str: %v\n" , str)
_ , err3 := writer. WriteString ( str)
if err3 != nil {
fmt. Printf ( "err3: %v\n" , err3)
return
}
writer. Flush ( )
}
func ( monster * Monster) ReStore ( ) Monster {
filePath := "src/go_code/Study_go/Study_go_fifteen/demo02/file/monster.txt"
file, err := os. Open ( filePath)
if err != nil {
fmt. Printf ( "err: %v\n" , err)
}
defer file. Close ( )
reader := bufio. NewReader ( file)
strjson, err2 := reader. ReadString ( '\n' )
if err2 != nil {
fmt. Printf ( "err2: %v\n" , err2)
}
err3 := json. Unmarshal ( [ ] byte ( strjson) , & monster)
if err3 != nil {
fmt. Printf ( "err3: %v\n" , err3)
}
return * monster
}
import (
"fmt"
"testing"
)
func TestStore ( t * testing. T) {
var monster Monster = Monster{ "tom" , 222 , "xxxxxxx" }
monster. Store ( )
}
func TestReStore ( t * testing. T) {
var monster Monster
monster = monster. ReStore ( )
if monster. Name != "tom" {
t. Fatalf ( "error" )
}
t. Logf ( "success" )
fmt. Printf ( "monster: %v\n" , monster)
}
import (
"fmt"
"go_code/Study_go/Study_go_fifteen/demo02/monster"
)
func main ( ) {
var m monster. Monster = monster. Monster{
Name: "tom" ,
Age: 22 ,
Skill: "xxxxxxx" ,
}
fmt. Printf ( "m: %v\n" , m)
m. Store ( )
m. ReStore ( )
fmt. Printf ( "m: %v\n" , m)
}