Go语言编写单元测试用例
Go单元测试示例
example/
|--division.go
|--division_test.go
为什么被测试文件和测试文件通常放到同一个文件夹下以及同一个声明包里
通常情况下,我们把被测试的文件与另外写的测试文件放到同一个声明包里面,称为包内测试;
当然也可以把测试函数的文件放到独立的一个包里面,称为包外测试。
不过,包外测试源码文件存在一个弊端,那就是在它们的测试函数中无法测试被测源码文件中的包级私有的程序实体,比如包级私有的变量、函数和结构体类型。这是因为这两者的所属代码包是不相同的。所以,一般很少会编写包外测试源码文件。
单元测试规则
- 测试文件名必须是_test.go结尾的,这样在执行go test的时候才会执行到相应的代码
- 你必须import testing这个包
- 所有的测试用例函数必须是Test开头
- 测试用例会按照源代码中写的顺序依次执行
- 测试函数TestXxx(t *testing.T)只有一个参数 t, 可以用 t 记录错误或者是测试状态
- 测试函数的格式:func TestXxx (t *testing.T),Xxx部分可以为任意的字母数字的组合,但是首字母不能是小写字母[a-z],例如Testintdiv是错误的函数名。
- 函数中通过调用testing.T的Error, Errorf, FailNow, Fatal, FatalIf方法,说明测试不通过,调用Log方法用来记录测试的信息。
单元测试写法
两种写法:自己手写、借助工具生成
方法1:自己手写
等待被测试的文件 division.go 如下,需要在同一个包里写一个测试文件命名为mydivision_test.go
1 package math
2
3 import (
4 "errors"
5 )
6
7 func Division(a, b float64) (float64, error) {
8 if b == 0 {
9 return 0, errors.New("除数不能为0")
10 }
11
12 return a / b, nil
13 }
直接自己撸测试函数,这样比较灵活想怎么测就怎么测
mydivision_test.go
1 package math
2
3 import (
4 "testing"
5 )
6
7 //用例1
8 func Test_Division_1(t *testing.T) {
9 if i, e := Division(6, 2); i != 3 || e != nil {
10 t.Error("除法函数测试没通过") // 如果不是如预期的那么就报错
11 } else {
12 t.Log("第一个测试通过了") //记录一些你期望记录的信息
13 }
14 }
15 //用例2
16 func Test_Division_2(t *testing.T) {
17 t.Error("执行t.Error分支就会提示测试失败")
18 }
运行命令go test -v .结果如下
$ go test -v .
=== RUN Test_Division_1
--- PASS: Test_Division_1 (0.00s)
mydivision_test.go:11: 第一个测试通过了
=== RUN Test_Division_2
--- FAIL: Test_Division_2 (0.00s)
mydivision_test.go:16: 执行t.Error分支就会提示测试失败
FAIL
exit status 1
FAIL mytest/goTest 0.001s
方法二:借助工具生成
步骤:
- 先安装gotests工具包:
go get -v github.com/cweill/gotests/... - 运行命令
gotests -all -w .为当前目录所有文件生成对应测试文件
结果为division.go生成了division_test.go文件如下,生成文件的默认前缀为对应的原文件名
division_test.go,然后留出一片“// TODO: Add test cases.”区域来填用例
1 package math
2
3 import "testing"
4
5 func TestDivision(t *testing.T) {
6 type args struct {
7 a float64
8 b float64
9 }
10 tests := []struct {
11 name string //用例名字
12 args args //传给被测函数的参数
13 want float64 //预期返回结果
14 wantErr bool //用bool方便判断是否返回error,如果类型改为error反而不好判断
15 }{
16 // TODO: Add test cases.
17 {"case 0", args{6, 2}, 3, false},
18 {"case 1", args{6, 0}, 0, true},//注意第二个用例是会返回error的,因为除数不能为0,所以此处wantErr为true
19 }
20 for _, tt := range tests {
21 t.Run(tt.name, func(t *testing.T) {
22 got, err := Division(tt.args.a, tt.args.b)
23 if (err != nil) != tt.wantErr {
24 t.Errorf("Division() error = %v, wantErr %v", err, tt.wantErr)
25 return
26 }
27 if got != tt.want {
28 t.Errorf("Division() = %v, want %v", got, tt.want)
29 }
30 })
31 }
32 }
运行结果
两个用例都通过了测试
$ go test -v .
=== RUN TestDivision
=== RUN TestDivision/case_0
=== RUN TestDivision/case_1
--- PASS: TestDivision (0.00s)
--- PASS: TestDivision/case_0 (0.00s)
--- PASS: TestDivision/case_1 (0.00s)
PASS
ok mytest/goTest 0.001s
Go语言编写单元测试用例的更多相关文章
- JUint4的下载、配置及对一个算法编写单元测试用例(测试多组数据每组多个参数)
一.JUnit4 jar包下载 链接:https://pan.baidu.com/s/1AdeVGGikcY5dfL151ZnWHA 提取码:h1am 下载完成后,解压一下即可. 二.导入JUnit4 ...
- 最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件
今天笔者就要归纳总结下一整套测试流程,从无到有,实现零突破,包括如何编写测试用例,定时执行测试用例,查找最新生成的测试报告文件,自动发送最新测试报告邮件,一整套完整的测试流程.以后各位只要着重如何编写 ...
- Selenium 2自动化测试实战29(组织单元测试用例和discover更多测试用例)
一.组织单元测试用例 看看unittest单元测试框架是如何扩展和组织新增的测试用例以之前的calculator.py文件为例,为其扩展sub()方法,用来计算两个数相减的结果. #coding:ut ...
- 基于php基础语言编写的小程序之计算器
基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...
- 如何用C语言编写病毒‘
怎样用C语言编写病毒在分析病毒机理的基础上,用C语言写了一个小病毒作为实例,用TURBOC2.0实现.[Abstract] This paper introduce the charateristic ...
- 【转】SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法
转自:http://www.coderli.com/junit-spring-test-applicationcontext JUnit单元测试用例中使用Spring框架,直接方式如下. @RunWi ...
- 选择使用c语言编写的phalcon框架
使用这个框架,我总结了如下几点考虑 1.这个框架速度快.纯c语言编写的框架,速度都比php框架快,省去了中间环节.当然,使用它不仅仅是性能考虑.因为如果为了解决php性能问题,完全可以有很多种方式,不 ...
- 教你快速写出多线程Junit单元测试用例 - GroboUtils
摘自: http://mushiqianmeng.blog.51cto.com/3970029/897786/ 本文出自One Coder博客,转载请务必注明出处: http://www.coderl ...
- [改善Java代码]易变业务使用脚本语言编写
建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...
- 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库
运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...
随机推荐
- Opentelemetry collector用法
Opentelemetry collector用法 目录 Opentelemetry collector用法 Service Extensions healthcheckextension Pipel ...
- 【主席树】P3919 【模板】可持久化线段树 1
P3919 [模板]可持久化线段树 1(可持久化数组) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <bits/stdc++.h> using na ...
- zynq QSPI flash分区设置&启动配置
需求: 一款基于zynq架构的产品,只有qspi flash,并没有其他的存储设备, 现在的要求固化某个应用程序app,设置开机启动, 但是根据厂家提供的sdk,编译出的镜像重启后,文件系统的内容都会 ...
- Camera | 3.瑞芯微平台MIPI摄像头常用调试命令
瑞芯微专栏 前面2篇我们讲解了camera的一些基础概念和知识. 本文主要讲述在瑞芯微平台上摄像头开发常用的调试命令. 0.环境 soc : rk3568 board: EVB1-DDR4-V10 软 ...
- LVM逻辑卷创建
创建步骤 1.创建分区 2.创建PV 3.创建VG 4.创建LV 5.格式化及挂载 创建分区 使用分区工具(如fdisk等)创建LVM分区. 创建PV $ pvcreate /dev/sdb5 #将每 ...
- VMware Workstation虚拟机 + 许可证密钥
VMware Workstation虚拟机 + 许可证密钥 VMware Workstation是什么? VMware简介 VMware 安装 VMware系统要求 VMware 版本下载地址 许可证 ...
- elementUI实现月、季度、年 时间选择框
elementUI实现月.季度.年 时间选择框 一.通过 el-date-picker 组件来实现月.年的选择 代码如下: <el-date-picker v-if="dateType ...
- Angular 18+ 高级教程 – Angular 的局限 の Query Elements
前言 熟悉 Angular 的朋友都知道,Angular 有非常多的局限,许多事情它都做不好,打开 Github 一堆 2016 - 2017 的 Issues,时至今日都没有解决. 原因也很简单 - ...
- C# and TypeScript – Enum Flags
前言 以前就有提过 Enum Flags,但平日不常用.最近翻 Angular 源码,发现它很多地方用到,而且没有封装语义代码.一堆符号真的看不惯啊... 于是又去复习了一遍,熟悉熟悉.顺便写一篇做记 ...
- DOM – ResizeObserver
介绍 想监听一个 element 的 size changes 就可以使用 ResizeObserver 了. 在看这一篇之前, 建议先看看 DOM & BOM – IntersectionO ...