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版本.内核.当前时间 运 ...
随机推荐
- games101 作业1及作业2分析及解决
games101 作业1及作业2分析及解决 去年的时候把games101的课程以及作业完成,但是整个过程比较粗略,也借助了不少外界的力量(doge),于是最近准备抽几天集中再把作业(1-7)过一遍,常 ...
- 【牛客刷题】HJ5 进制转换
题目链接 基本上能用最简单代码实现的,就不要考虑的太复杂: package main import "fmt" func main() { a := 0 fmt.Scanf(&qu ...
- 树莓派CM4(三): 定制自己的树莓派镜像
1. 镜像下载 使用树莓派最新的镜像Raspberry Pi OS Lite,内核版本6.6 下载链接 https://downloads.raspberrypi.com/raspios_lite_a ...
- React 高德地图 进京证 (二)
上回书说到,躲开摄像头的基本功能实现了,但有三个核心问题: (1)速度慢 (2)距离远易失败 (3)地图限制 第一个问题:较为简单,把几千个摄像头按行政区划分好带上编号,在路线分段避让时按片儿计算,综 ...
- SpringBoot启动项目报错:java.lang.UnsatisfiedLinkError: D:\files\software\jdk-15.0.1\jdk-17.0.3.1\bin\tcnative-1.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
目录 问题描述 解决方法: 问题描述 在运行向的时候出现报错: java.lang.UnsatisfiedLinkError: D:\files\software\jdk-15.0.1\jdk-17. ...
- Transformer应用于时序任务:综述《Transformers in Time Series: A Survey》
2022年9月13日 21:28 摸鱼了一天,看看综述. 论文:Transformers in Time Series: A Survey GitHub: 阿里达摩院 2022的论文. 摘要 从两个角 ...
- CSS – Font Family
前言 font-family 虽然只是一个 CSS 属性, 但是牵连许多东西, 所以独立一篇来讲. 网站一般上会使用 Google Fonts 作为 font-family, 下面会以一个 Googl ...
- CSS & JS Effect – Show More
效果 show more 是很常被使用的效果, 因为空间总是不够的丫. 比起 scroll, show more 的体验通常会好一些, 尤其在手机, 它有更好的引导. 实现思路 1. 卡片需要一个 ...
- Asp.net core 学习笔记之异常处理
自己写代码自己维护, 你爱怎样写都可以, 确保一致性就可以了. 不要自己写,自己看不懂 /.\ 但是如果有一天你要别人也看得懂...那就不单单是一致性的问题了,最好是用大众的 style. refer ...
- SQL注入演示
SQL注入演示 创建一个简易的登录系统/** tb_user 用户表 * 用户登录系统(需在数据库中创建tb_user表 ) */ @Test public void testUserLogin() ...