Golang笔记之testing

Eternal丶星空 · · 764 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Go工具链

常用命令

  • build
build           compile packages and dependencies

最常用的go command之一,编译go文件
跨平台编译: env GOOS=linux GOARCH=amd64 go build
  • install
install             compile and install packages and dependencies

也是编译,与build最大的区别是编译后会将输出文件打包成库放在pkg下
常用于本地打包编译的命令: go install

  • get
get             download and install packages and dependencies

用于获取go的第三方包,通常会默认从git repo上pull最新的版本
常用命令如: go get -u github.com/go-sql-driver/mysql (从github上获取mysql的driver并安装到本地)
  • fmt
fmt             gofmt (reformat) package sources

类似于C中的lint, 统一代码风格和排版
常用命令如: go fmt

  • test
test            test packages

运行当前包目录下的tests
常用命令如: go test 或go test -v等

golang的test

main.go
main_test.go
  • Go的test一般以xxx_test.go为文件名
  • xxx的部分一般为xxx_test.go所要测试的代码文件名
  • Go并没有特别要求xxx的部分必须是要测试的文件名
  • go test -v
package main

import (
    "testing"
    "fmt"
)

func TestPrint(t *testing.T){
    res := Print1to20()
    fmt.Println("hey")
    if res != 210{
        t.Errorf("Wrong result of Print1to20")
    }
}

2-2 golang项目中test的写法

Test的写法

  • 每一个test文件必须import一个testing
  • test文件下的每一个test case必须均以Test开头并且符合TestXxxx形式,否则go test会直接跳过测试不执行
  • test case的入参为t *testing.T或者 b *testing.B
  • t.Errorf为打印错误信息,并且当前test case会被跳过
  • t.SkipNow()为跳过当前test,并且直接按PASS处理继续下一个test
  • t.SkipNow() 写在等一行

Test注意要点

  • Go的test不会保证多个TestXxx顺序执行,但是通常会按顺序执行
  • 使用t.Run来执行subtests可以做到控制test输出以及test的顺序
// 顺序执行
func TestPrintSub(t *testing.T){
    t.Run("a1",func(t *testing.T){fmt.Println("a1")})
    t.Run("a2",func(t *testing.T){fmt.Println("a2")})
    t.Run("a3",func(t *testing.T){fmt.Println("a3")})
}
  • 使用TestMain作为初始化test,并且使用m.Run()来调用其他tests可以完成一些需要初始化操作的testing,
  • 比如数据库连接,文件打开,Rest服务登录等
// TestMain
func TestMain(m *testing.M){
    fmt.Println("test main first")
    m.Run()
}
  • 如果没有在TestMain中调用m.Run()则除了TestMain以外的其他tests都不好被执行

2-3 golang项目中benchmark的写法

Test之benchmark

  • benchmark函数一般以Benchmark开头
  • benchmark的case一般会跑b.N次,而且每次执行都会如此
  • 在执行过程中会根据实际case的执行时间是否稳定会增加b.N的次数以达到稳态
// go test -bench=.
func BenchmarkAll(b *testing.B){
    for n := 0; n < b.N; n++{
        Print1to20()
    }
}
  • 执行命令 go test -bench=.
  • 传参要保证函数稳态

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:Eternal丶星空

查看原文:Golang笔记之testing

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

764 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传