Golang笔记之testing

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=.
  • 传参要保证函数稳态
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 当我体重马上100斤以内了,我才发现我需要的并不是体重减轻,而是增加运动量,我可以学拉丁舞,只要柔和一点的就好。练...
    以斯帖小甜妞阅读 1,702评论 0 0
  • 第一次自己忽然想这样子画 没有特定的主题 原本只是画了外框 然后看到外框就有想法了 然后一步一步遵从自己内心 最后...
    九妃阅读 1,400评论 0 2
  • 导读:福慧禅医谈肩颈。《黄帝内经》不仅是我国第一部中医理论经典,还是我国第一部养生宝典和第一部关于生命的百科全书。...
    福v慧阅读 7,106评论 0 0
  • 这是一本好书,在第二次读它的时候我决定做点什么,之所以选择这种摘录的方式是因为本人的文学功底实在不怎么样,却又不甘...
    Entropy_易阅读 4,535评论 0 0

友情链接更多精彩内容