概念

  • 回归测试:是指修改了旧代码之后,重新进行测试,以确保修改没有引入新的错误或导致其它代码产生错误;
  • 单元测试:是指对软件中的最小可测试单元(单个函数或类)进行检查和验证
  • 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 单元测试的更多相关文章

  1. 【MVC拾遗】MVC的单元测试简单学习总结

    关于测试的必要性什么的已经在 重构与测试 里扯过了.倒也没必要说,写的代码多了自然就明白这个东西重要性. 当时说了坐等被推动去学习单元测试来着,然而等着被人推动的结果就是根本就没人来推你.o(∩_∩) ...

  2. 基于gin的golang web开发:Gin技术拾遗

    本文是对前几篇文章的一些补充,主要包含两部分:单元测试和实际项目中使用路由的小问题. 拾遗1:单元测试 Golang单元测试要求代码文件以_test结尾,单元测试方法以Test开头,参数为*testi ...

  3. Intellij idea添加单元测试工具

    1.idea 版本是14.0.0 ,默认带有Junit,但是不能自动生成单元测试,需要下载JunitGererator2.0插件 2.Settings -Plugins,下载 JunitGenerat ...

  4. Python的单元测试(二)

    title: Python的单元测试(二) date: 2015-03-04 19:08:20 categories: Python tags: [Python,单元测试] --- 在Python的单 ...

  5. Python的单元测试(一)

    title: Python的单元测试(一) author: 青南 date: 2015-02-27 22:50:47 categories: Python tags: [Python,单元测试] -- ...

  6. javascript单元测试框架mochajs详解

    关于单元测试的想法 对于一些比较重要的项目,每次更新代码之后总是要自己测好久,担心一旦上线出了问题影响的服务太多,此时就希望能有一个比较规范的测试流程.在github上看到牛逼的javascript开 ...

  7. 使用NUnit为游戏项目编写高质量单元测试的思考

    0x00 单元测试Pro & Con 最近尝试在我参与的游戏项目中引入TDD(测试驱动开发)的开发模式,因此单元测试便变得十分必要.这篇博客就来聊一聊这段时间的感悟和想法.由于游戏开发和传统软 ...

  8. 我这么玩Web Api(二):数据验证,全局数据验证与单元测试

    目录 一.模型状态 - ModelState 二.数据注解 - Data Annotations 三.自定义数据注解 四.全局数据验证 五.单元测试   一.模型状态 - ModelState 我理解 ...

  9. ABAP单元测试最佳实践

    本文包含了我在开发项目中经历过的实用的ABAP单元测试指导方针.我把它们安排成为问答的风格,欢迎任何人添加更多的Q&A's,以完成这个列表. 在我的项目中,只使用传统的ABAP report. ...

随机推荐

  1. spring mvc 程序

    首先我们的界面在返回的时候回根据我们的配置信息进行路径的查找  然后会识别我们的控制器返回的字符串(其实就是界面的名字)而找到界面的信息,eg:如果我们返回的是success那么就会去找我们的WEB- ...

  2. 单机zookeeper部署伪集群

    1.zookeeper介绍 ZooKeeper 是一个为分布式应用所设计的分布的.开源的协调服务.分布式的应用可以建立在同步.配置管理.分组和命名等服务的更高级别的实现的基础之上. ZooKeeper ...

  3. Django框架(十五)—— forms组件、局部钩子、全局钩子

    目录 forms组件.局部钩子.全局钩子 一.什么是forms组件 二.forms组件的使用 1.使用语法 2.组件的参数 3.注意点 三.渲染模板 四.渲染错误信息 五.局部钩子 1.什么是局部钩子 ...

  4. Spring Cloud Eureka自我保护机制

    自我保护背景 首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZK中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行. 默认情况下,如果Eureka Serve ...

  5. 微信公众号开发笔记-验证token

    开发 话不多说我们直接进入主题 我们先去微信公众号申请一个公众号: 申请完成之后我们找到开发下的基本配置 然后找到进行基本配置,我们需要一个url地址来验证,这里的地址必需要是外网,Token是我们任 ...

  6. spark复习总结03

    1.DataFrame的创建方式 1.1 通过加载外部文件创建 //通过sqlContext读取json文件创建DataFrame DataFrame dataFrame=sqlContext.rea ...

  7. Python之字典推导式

    推导式是个绝妙的东西,列表推导式一出,map.filter等函数黯然失色,自 Python2.7以后的版本,此特性扩展到了字典和集合身上,构建字典对象无需调用 dict 方法. bad numbers ...

  8. servlet的ServletContext接口

    ServletContext Servlet 上下文 每个web工程都只有一个ServletContext对象,也就是不管在哪个servlet里面,获取到的这个ServletContext对象都是同一 ...

  9. display: flex属性介绍

    参考文章: 阮大神的:Flexbox 布局的最简单表单(主要讲解项目item上的属性) 另一位大神的:布局神器display:flex(整体讲解的非常详细) 之前没有仔细看flex布局(弹性布局),设 ...

  10. Ubuntu 14.04 Sublime Text3 Java编译运行(最简单的方法)

    Sublime,结果发现只能编译,无法直接运行,于是就在网上搜解决方法,发现大部分方法都是告诉你要进入Java.sublime-packag这个文件,然后再修改JavaC.sublime-build, ...