Golang测试

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

如何编写好的单元测试

单元测试主要有两个方面:

  • 编写测试方法

  • 编写可测试代码

编写单元测试方法

单元测试特定案例的方法

编写更好的单元测试的技巧

编写单元测试不仅仅是“assert(func()==expected)”

编写可测试代码

如何编写易于测试的代码,测试驱动开发、正确使用设计模式等

编写可以很好地测试的代码编写好的单元测试一样重要

将现有代码重写为可测试代码虽然痛苦,但是是值得的

Go测试概述

测试一般使用标准库:testing

测试代码文件和正式代码文件应处于一个文件夹下,测试代码文件应以_test.go结尾

要注意测试文件名不能以_.开始,否者go test将不会包含这些文件

测试方法也有特殊的格式,应以Test开头,参数类型需为*testing.T

go test的测试完整指令

go test [build/test flags] [packages] [build/test flags & test binary flags]

常用的flag

  • -bench regexp:性能测试,支持表达式对测试函数进行筛选。-bench .则是对所有的benchmark函数测试

  • -benchmem:性能测试的时候显示测试函数的内存分配的统计信息

  • -count n:运行测试或基准测试多少次,默认一次

  • -run regexp:只运行特定的测试函数, 比如-run ABC只测试函数名中包含ABC的测试函数

  • -timeout t:测试时间如果超过t, panic,默认10分钟

  • -cover:统计测试覆盖率

  • -v:显示测试的详细信息,也会把LogLogf方法的日志显示出来

  • -failfast:测试将在第一个失败即结束

go test常用的指令

go test PACKAGE_NAME测试指定的package,文件的package必须为PACKAGE_NAME

go test .执行当前文件夹下所有文件的测试

go test ./...执行当前文件夹下所有文件及文件夹的测试

测试覆盖率

从 Go 1.2开始, Go就提供了一个生成代码覆盖率的工具cover

代码覆盖率描述了包中代码有多少语句被测试所覆盖。

指令:

go test -cover [package]

子测试(SubTest)

使用testing包下的func (t *T) Run(name string, f func(t *T)) bool方法进行子测试,在一个测试方法中进行多个用例的的测试。

使用指令:

go test -run=[TestMethod]/[SubTestName]

可以指定运行某个子测试

例如:

func TestAdd(t *testing.T) {
  a := 1

  t.Run(“+1”, func(t *testing.T) {
     if a + 1 != 2 { t.Fatal("fail!") }
  })
  t.Run(“+2”, func(t *testing.T) {
    if a + 2 != 3 { t.Fatal("fail!") }
  })
}

可以使用:

$ go test -run=TestAdd/+1

运行TestAdd测试方法下+1的子测试

标签(Tags)

用于为测试文件分类,通过指定标签,可以指定测试哪些测试文件

为测试文件打标签

// +build add

package person

import (
    "testing"
)

// Snipped...

在测试中使用标签

$ go test -tags=add -v

Short模式

使用-shortflag可以跳过测试代码中被指定为Short模式的测试代码

指定测试方法为short模式

func TestSkip(t *testing.T) {
    if testing.Short() {
        t.Skip("Skipping long-running test.")
    }
    //Snipped
}

使用

$go test ./... -short -v

跳过Short模式的测试

TDT

TDT也叫表格驱动方法,有时也被归为关键字驱动测试(keyword-driven testing),是针对自动化测试的软件测试方法,它将创建测试程序的步骤分为规划及实现二个阶段。


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

本文来自:简书

感谢作者:

查看原文:Golang测试

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

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