Go:表驱动单元测试

单元测试相当的重要,这几天实习由于单元测试没写好所以被骂了emmm

痛定思痛,立刻上网学习了一下,总算达到了预期的效果,所以写一篇文章记录一下

首先安装gotests

$go get -u github.com/cweill/gotests/...

然后记得添加到PATH里面

之后在goland里面可以直接自动生成表驱动的单元测试

生成代码大概是这个样子

package test

import (
"publish_server_receivehook/services"
"reflect"
"testing"
) func TestDealWithData(t *testing.T) {
type args struct {
data []byte
}
tests := []struct {
name string
args args
want map[string]interface{}
}{
// TODO: Add test cases.
//正常情况
{"1",args{data:[]byte(`{
"ref": "refs/heads/master",
"before": "fc5075afcb02fcf9d356d4b1a23348506a522947",
"after": "fc5075afcb02fcf9d356d4b1a23348506a522947",
"compare_url": "",
"commits": [
{
"id": "fc5075afcb02fcf9d356d4b1a23348506a522947",
"message": "123\n",
"url": "http://localhost:3000/ch/git_hook_test/commit/fc5075afcb02fcf9d356d4b1a23348506a522947",
"author": {
"name": "miracle",
"email": "asd471331055@vip.qq.com",
"username": "ch"
},
"committer": {
"name": "miracle",
"email": "asd471331055@vip.qq.com",
"username": "ch"
},
"added": [
"test.txt"
],
"removed": [],
"modified": [],
"timestamp": "0001-01-01T00:00:00Z"
}
],
"repository": {
"id": 1,
"owner": {
"id": 1,
"username": "ch",
"login": "ch",
"full_name": "",
"email": "asd471331055@vip.qq.com",
"avatar_url": "https://secure.gravatar.com/avatar/bdafa8c50b079c7bf7a647de881e3b0b?d=identicon"
},
"name": "git_hook_test",
"full_name": "ch/git_hook_test",
"description": "",
"private": false,
"fork": false,
"parent": null,
"empty": false,
"mirror": false,
"size": 12288,
"html_url": "http://localhost:3000/ch/git_hook_test",
"ssh_url": "miracle@localhost:ch/git_hook_test.git",
"clone_url": "http://localhost:3000/ch/git_hook_test.git",
"website": "",
"stars_count": 0,
"forks_count": 0,
"watchers_count": 1,
"open_issues_count": 0,
"default_branch": "master",
"created_at": "2019-02-17T16:52:44+08:00",
"updated_at": "2019-02-17T17:00:23+08:00"
},
"pusher": {
"id": 1,
"username": "ch",
"login": "ch",
"full_name": "",
"email": "asd471331055@vip.qq.com",
"avatar_url": "https://secure.gravatar.com/avatar/bdafa8c50b079c7bf7a647de881e3b0b?d=identicon"
},
"sender": {
"id": 1,
"username": "ch",
"login": "ch",
"full_name": "",
"email": "asd471331055@vip.qq.com",
"avatar_url": "https://secure.gravatar.com/avatar/bdafa8c50b079c7bf7a647de881e3b0b?d=identicon"
}
}`)}, map[string]interface{}{"repository_name":"ch/git_hook_test","pusher":"ch"}}, //异常情况
{"2",args{data:[]byte(`{"test":"test"}`)}, map[string]interface{}{"repository_name":nil,"pusher":nil}},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
if got := services.DealWithData(tt.args.data); !reflect.DeepEqual(got, tt.want) {
t.Errorf("DealWithData() = %v, want %v", got, tt.want)
}
})
}
}

  因为我的测试数据比较多,所以代码看来比较多.

其实都是自动生成的,自己在TODO下面添加测试用的数据就可以了。

另外测试数据一定要包含正确的数据以及错误的数据,这样的测试才有意义。

Go:表驱动单元测试的更多相关文章

  1. [lua]原来这才是表驱动的正确表达方式

    曾经写了个很煞笔的脚本模拟switch..case语法形式.[lua]尝试一种Case语法糖 而今实际项目应用中突发,原来这才是正确的表驱动方式表达.如下所贴: function event_do( ...

  2. 查询优化--小表驱动大表(In,Exists区别)

    Mysql 系列文章主页 =============== 本文将以真实例子来讲解小表驱动大表(In,Exists区别) 1 准备数据 1.1 创建表.函数.存储过程 参照  这篇(调用函数和存储过程批 ...

  3. Tomcat内核之ASCII解码的表驱动模式

    我们知道Tomcat通信是建立在Socket的基础上,而套接字在服务器端和客户端传递的报文都是未经过编码的字节流,每8位组成1个字节,计算机以二进制为基础,这是由于使用晶体管的开合状态表示1和0,这样 ...

  4. 6.2 小表驱动大表(exists的应用)

    1. 优化原则:小表驱动大表,即小数据集驱动大数据集. select * from A where id in (select id from B) 等价于: for select id from B ...

  5. MySQL高级知识(十六)——小表驱动大表

    前言:本来小表驱动大表的知识应该在前面就讲解的,但是由于之前并没有学习数据批量插入,因此将其放在这里.在查询的优化中永远小表驱动大表. 1.为什么要小表驱动大表呢 类似循环嵌套 for(int i=5 ...

  6. 表驱动方法(Table-Driven Methods)

    表驱动方法(Table-Driven Methods) - winner_0715 - 博客园 https://www.cnblogs.com/winner-0715/p/9382048.html W ...

  7. 了解MySQL联表查询中的驱动表,优化查询,以小表驱动大表

    一.为什么要用小表驱动大表 1.驱动表的定义 当进行多表连接查询时, [驱动表] 的定义为: 1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表] 2)未指定联接条件时,行数少的表为[驱动表 ...

  8. (原创)c++11改进我们的模式之改进表驱动模式

    所谓表驱动法(Table-Driven Approach),简单讲是指用查表的方法获取值.表驱动是将一些通过较为复杂逻辑语句来得到数据信息的方式,通过查询表的方式来实现,将数据信息存放在表里.对于消除 ...

  9. Table-Driven Design 表驱动设计

    注:本文所有代码来自 http://www.codeproject.com/Articles/42732/Table-driven-Approach 在许多程序中,经常需要处理那些拥有种种色色不同特性 ...

随机推荐

  1. Codeforces 577B Modulo Sum:数学 结论【选数之和为m的倍数】

    题目链接:http://codeforces.com/problemset/problem/448/C 题意: 给你n个数字,给定m. 问你是否能从中选出若干个数字,使得这些数字之和为m的倍数. 题解 ...

  2. php mysqli_get_server_version()函数

    php mysqli_get_server_version()函数以整数形式返回MySQL服务器版本. 本文章想大家介绍mysqli_get_server_version 函数的基本使用方法和实例,需 ...

  3. Android之setContentView和LayoutInflater

    setContentView: 1.常用的构造函数: 1)setContentView(int layoutResID) 2)setContentView(View view) 3)setConten ...

  4. cocos2d-x 之 CCParticleBatchNode CCParallaxNode

    //不使用 CCParticleBatchNode : 注意比较 左下角的显示信息 ; i<; ++i) { CCParticleSystem* particleSystem = CCParti ...

  5. ssh免密码登录配置方法,(图示加命令)

    首先,说明一下我们要做的是,serverA 服务器的 usera 用户免密码登录 serverB 服务器的 userb用户. 我们先使用usera 登录 serverA 服务器 [root@serve ...

  6. Java中String和byte[]间的 转换

    数据库的字段中使用了blob类型时,在entity中此字段可以对应为byte[] 类型,保存到数据库中时需要把传入的参数转为byte[]类型,读取的时候再通过将byte[]类型转换为String类型. ...

  7. Poj2656(水题)

    一.Description Jinjin is a junior school student. Besides the classes in school, Jinjin's mother also ...

  8. Python:Iterable和Iterator

    转于:https://blog.csdn.net/whgqgq/article/details/63685066 博主:gongqi1992 iterable和iterator最基本的区别: iter ...

  9. 【转】 Pro Android学习笔记(三二):Menu(3):Context菜单

    目录(?)[-] 什么是Context menu 注册View带有Context menu 填Context菜单内容 Context菜单点击触发 什么是Context menu 在桌面电脑,我们都很熟 ...

  10. JS---星星评分

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...