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

方法二:借助工具生成

步骤:

  1. 先安装gotests工具包:  go get -v github.com/cweill/gotests/...
  2. 运行命令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语言编写单元测试用例的更多相关文章

  1. JUint4的下载、配置及对一个算法编写单元测试用例(测试多组数据每组多个参数)

    一.JUnit4 jar包下载 链接:https://pan.baidu.com/s/1AdeVGGikcY5dfL151ZnWHA 提取码:h1am 下载完成后,解压一下即可. 二.导入JUnit4 ...

  2. 最完整的自动化测试流程:Python编写执行测试用例及定时自动发送最新测试报告邮件

    今天笔者就要归纳总结下一整套测试流程,从无到有,实现零突破,包括如何编写测试用例,定时执行测试用例,查找最新生成的测试报告文件,自动发送最新测试报告邮件,一整套完整的测试流程.以后各位只要着重如何编写 ...

  3. Selenium 2自动化测试实战29(组织单元测试用例和discover更多测试用例)

    一.组织单元测试用例 看看unittest单元测试框架是如何扩展和组织新增的测试用例以之前的calculator.py文件为例,为其扩展sub()方法,用来计算两个数相减的结果. #coding:ut ...

  4. 基于php基础语言编写的小程序之计算器

    基于php基础语言编写的小程序之计算器 需求:在输入框中输入数字进行加.减.乘.除运算(html+php) 思路: 1首先要创建输入数字和运算符的输入框,数字用input的text属性,运算符用sel ...

  5. 如何用C语言编写病毒‘

    怎样用C语言编写病毒在分析病毒机理的基础上,用C语言写了一个小病毒作为实例,用TURBOC2.0实现.[Abstract] This paper introduce the charateristic ...

  6. 【转】SpringTest框架JUnit单元测试用例获取ApplicationContext实例的方法

    转自:http://www.coderli.com/junit-spring-test-applicationcontext JUnit单元测试用例中使用Spring框架,直接方式如下. @RunWi ...

  7. 选择使用c语言编写的phalcon框架

    使用这个框架,我总结了如下几点考虑 1.这个框架速度快.纯c语言编写的框架,速度都比php框架快,省去了中间环节.当然,使用它不仅仅是性能考虑.因为如果为了解决php性能问题,完全可以有很多种方式,不 ...

  8. 教你快速写出多线程Junit单元测试用例 - GroboUtils

    摘自: http://mushiqianmeng.blog.51cto.com/3970029/897786/ 本文出自One Coder博客,转载请务必注明出处: http://www.coderl ...

  9. [改善Java代码]易变业务使用脚本语言编写

    建议16: 易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP.Ruby.Groovy.JavaScript等,这些“入侵者”都有一个共同特征:全是同一类语言—脚本语言,它们 ...

  10. 运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程,把获取的信息存入数据库

    运用Python语言编写获取Linux基本系统信息(三):Python与数据库编程 有关前两篇的链接: 运用Python语言编写获取Linux基本系统信息(一):获得Linux版本.内核.当前时间 运 ...

随机推荐

  1. 2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛)

    2024 睿抗机器人开发者大赛CAIP-编程技能赛-本科组(国赛) 前言 补题只补了前四道,第五题打个暴力都有 \(24\) 分,我这死活只有 \(22\) 分 \(QAQ\) RC-u1 大家一起查 ...

  2. 第 358 场周赛 - 力扣(LeetCode)

    第 358 场周赛 - 力扣(LeetCode) 2815. 数组中的最大数对和 - 力扣(LeetCode) 双for遍历即可 class Solution { public: int maxSum ...

  3. TSP 的遗传算法

    省流:不如模拟退火 打 OI 的时候一直对乱搞很感兴趣,只是没时间学,现在算是弥补一下吧 旅行商问题(Traveling Salesman Problem, TSP):求无向图边权和最小的哈密顿回路 ...

  4. 【问答23】Linux移植:如何制作rootfs?

    粉丝问题 如何制作rootfs? 安排! 想直奔主题的,直接跳到第四章. 一.分析 1. 文件系统简介 理论上说一个嵌入式设备如果内核能够运行起来,且不需要运行用户进程的话,是不需要文件系统的,文件系 ...

  5. 廉价平替esphome水浸 雨水传感器diy

    2024年7月27日 改进了手头的所有8266 都加了红外和dht11 干了一件非常抽象的事情 调试的时候给dht11 插到5v了 单薄的它好像要融化了 binary_sensor: # 水浸 雨水 ...

  6. 异源数据同步 → DataX 为什么要支持 kafka?

    开心一刻 昨天发了一条朋友圈:酒吧有什么好去的,上个月在酒吧当服务员兼职,一位大姐看上了我,说一个月给我 10 万,要我陪她去上海,我没同意 朋友评论道:你没同意,为什么在上海? 我回复到:上个月没同 ...

  7. JS插入排序完全理解

    插入排序是JS中的一种常见数组排序算法,记录一下如何理解并实现插入排序的功能; 首先看一下最直观的动态图 图片来源:https://www.javascriptc.com/ 从图像可以很直观的看出,插 ...

  8. ASP.NET Core – CORS (Cross-Origin Resource Sharing)

    参考 Docs – Enable Cross-Origin Requests (CORS) in ASP.NET Core 介绍 CORS (Cross-Origin Resource Sharing ...

  9. C# 基础 – 装箱 / 拆箱, 堆 / 栈

    前言 有些概念可能你用不到, 但是懂也无妨. 装箱 / 拆箱 参考: C#装箱和拆箱(Boxing 和 UnBoxing) 通常讲到这些都跟性能有关. 把值类型变成引用类型就叫装箱. int numb ...

  10. HTML – 冷知识

    Void Elements 需要 end slash? 这些是 void elements, 它们没有 end tag, 也没有 content. 至于关闭时是 ends with > 还是 / ...