拾遗:Go 单元测试
概念
- 回归测试:是指修改了旧代码之后,重新进行测试,以确保修改没有引入新的错误或导致其它代码产生错误;
- 单元测试:是指对软件中的最小可测试单元(单个函数或类)进行检查和验证
- Test-Driven Development(TDD):测试驱动开发,提倡先编写测试代码,再进行开发
- 先编写产品函数的框架,然后编写测试函数,针对产品函数的功能编写测试用例,然后编写产品函数的代码,每写一个功能点都运行测试,随时补充测试用例。所谓先编写产品函数的框架,是指先编写函数空的实现,有返回值的直接返回一个合适值,编译通过后再编写测试代码,这时,函数名、参数表、返回类型都应该确定下来了,所编写的测试代码以后需修改的可能性较小
- ExtremeProgramming(XP):极限编程,提倡TDD
- Test Case:测试用例/实例
概要
- 在包目录内,所有以_test.go为后缀名的源文件并不是go build构建包的一部分,它们是go test测试的一部分
- 在*_test.go文件中,有三种类型的函数:测试函数、基准测试函数、示例函数
- 一个测试函数是以Test为函数名前缀的函数,用于测试程序的一些逻辑行为是否正确;go test命令会调用这些测试函数并报告测试结果是PASS或FAIL
- 基准测试函数是以Benchmark为函数名前缀的函数,它们用于衡量一些函数的性能;go test命令会多次运行基准函数以计算一个平均的执行时间
- 示例函数是以Example为函数名前缀的函数,提供一个由编译器保证正确性的示例文档
- Go 语言采用内置的测试框架进行单元测试,测试文件内均须 import "testing"
基础测试
- 测试单个文件
# -v 显示详细信息,-cover 显示测试覆盖率
go test -v -cover=true $GOPATH/src/examples/example_test.go $GOPATH/src/examples/example.go- 测试整个包
go test -v -cover=true $GOPATH/src/examples/...
- 执行单个测试用例(-run 选项后跟正则表达式,执行名称匹配的测试函数)
go test -v -cover=true $GOPATH/src/examples -run 'TestSucc|XxYyZz'
表格驱动测试:TableDrivenTests (https://github.com/cweill/gotests)
- 使用 gotests
go get -u github.com/cweill/gotests/...
- 语法
gotests [options] PATH ...
-all generate go tests for all functions and methods
-excl regexp. generate go tests for functions and methods that don't match. Takes precedence over(优先于) -only, and -all
-only regexp. generate go tests for functions and methods that match only. Takes precedence over -all
-w write output to (test) files instead of stdout
-nosubtests disable subtest generation. Only available for Go 1.7+- 示例
# 在当前目录下生成测试代码,使用 -w 选项会自动生成 example_test.go 文件,在其中的 TO DO 位置添加测试输入条目即可
gotests -all example.go > example_test.go- 之后执行基础测试部分的操作获取测试报告
Mock (https://github.com/golang/mock)
以可控的模拟对象替换真实对象,以获取测试结果
- 使用场景
- 依赖的服务返回不确定的结果,如获取当前时间
- 依赖的服务返回状态难以复现,如网络错误
- 依赖的服务环境搭建费时费力,如复杂的 web 服务器环境等
- 依赖的服务行为多变
- go 语言实现 mock 的方式
- 注入依赖对象
- 实现对应的接口
- 安装工具:gomock/mockgen
go get github.com/golang/mock/gomock
go get github.com/golang/mock/mockgen
#go doc code.google.com/p/gomock/gomock- 生成测试文件
mockgen -source {SourceFile}.go > {DestFile}.go- ...
Go monkeypatching (https://github.com/bouk/monkey)
- https://segmentfault.com/a/1190000007733142
- https://github.com/bouk/monkey
参考资料:
- http://gopl-zh.b0.upaiyun.com/ch11/ch11-02.html
- http://mp.weixin.qq.com/s/dnQ-Fp2K1HffxkPwF903eA?utm_source=tuicool&utm_medium=referral
拾遗:Go 单元测试的更多相关文章
- 【MVC拾遗】MVC的单元测试简单学习总结
关于测试的必要性什么的已经在 重构与测试 里扯过了.倒也没必要说,写的代码多了自然就明白这个东西重要性. 当时说了坐等被推动去学习单元测试来着,然而等着被人推动的结果就是根本就没人来推你.o(∩_∩) ...
- 基于gin的golang web开发:Gin技术拾遗
本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testi ...
- Intellij idea添加单元测试工具
1.idea 版本是14.0.0 ,默认带有Junit,但是不能自动生成单元测试,需要下载JunitGererator2.0插件 2.Settings -Plugins,下载 JunitGenerat ...
- Python的单元测试(二)
title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...
- Python的单元测试(一)
title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...
- javascript单元测试框架mochajs详解
关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...
- 使用NUnit为游戏项目编写高质量单元测试的思考
0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...
- 我这么玩Web Api(二):数据验证,全局数据验证与单元测试
目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试 一.模型状态 - ModelState 我理解 ...
- ABAP单元测试最佳实践
本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...
随机推荐
- POJ 2001 Shortest Prefixes (Trie)
题目链接:POJ 2001 Description A prefix of a string is a substring starting at the beginning of the given ...
- HDU6655 Just Repeat(2019杭电多校J题)
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6655 简单博弈问题,A,B手里各有n,m张牌,牌有颜色,两人轮流出牌(A先出),一个人只能打出对放未打 ...
- Java类成员访问级别
类可以是public或default(或包级别).在本教程中主要介绍 public,private,protected 这几个访问级别修辞符的使用.类成员的访问级别确定程序的哪个区域可以访问它. 以下 ...
- 在mac版virtual box中安装ubuntu虚拟机的NAT/Host-Only网络配置踩坑记录
之前用惯了vmware和parallels desktop,网络配置十分智能,基本不用自己配置.由于版权原因,工作电脑上换了免费的virtual box用,四五年都完全在虚拟机里干活的本菜鸡居然在虚拟 ...
- Python之元组、列表and 字典
序列: 元组和字符串都是不可变的哦 你看,数据空间不一样了 元组的话,你可以联想到C里面的结构体变量啊,为了包容不同的数据类型: 也可以这样取值哦: 列表:列表是可修改的哦~ 不然数据大了再另外开辟空 ...
- Android开发——回调(Callback)
1. 回调函数的定义: 在A类中定义了一个方法,这个方法中用到了一个接口和该接口中的抽象方法,但是抽象方法没有具体的实现,需要B类去实现,B类实现该方法后,它本身不会去调用该方法,而是传递给A类,供A ...
- 2018-8-10-win10-uwp-ApplicationView
title author date CreateTime categories win10 uwp ApplicationView lindexi 2018-08-10 19:16:53 +0800 ...
- 神奇的Android Studio Template(转)
转自:http://blog.csdn.net/lmj623565791/article/details/51592043 本文已授权微信公众号:鸿洋(hongyangAndroid)在微信公众号平台 ...
- 【LeetCode】排序
[349] Intersection of Two Arrays [Easy] 两个无序可重复数组找交集, 交集要求元素唯一. Given nums1 = [1, 2, 2, 1], nums2 = ...
- js中如何避免动态引入重复资源
创建存储数据的数组或者对象: 每次调用方法的时候,往里面添加资源对象,包括路径: 每次调用的时候遍历此路劲是否存在,如存在,就调用此资源对象的promise进行操作. 可避免资源未加载完成就执行的情况 ...