GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test
持续更新 Go 语言学习进度中 ......
- GO语言学习笔记-类型篇 Study for Go! Chapter one - Type - slowlydance2me - 博客园 (cnblogs.com)
- GO语言学习笔记-表达式篇 Study for Go ! Chapter two - Expression - slowlydance2me - 博客园 (cnblogs.com)
- GO语言学习笔记-函数篇 Study for Go ! Chapter three - Function - slowlydance2me - 博客园 (cnblogs.com)
Study for Go ! Chapter ten- Test
1. 单元测试 ( unit test )
单元测试 ( unit test )除用来测试逻辑算法是否符合预期外,还承担着监控代码质量的责任。任何时候都可以用简单的命令来验证全部功能,找出未完成任务 ( 验收 ) 和任何因修改而造成的错误。它与性能测试、代码覆盖率等一起保证了代码总是在可控范围内,这远比形式化的人工检查要有用得多
单元测试并非要取代人工代码审查 ( code review ),实际上它也无法切入到代码实现层面。但可通过测试结果为审查提供筛选数据,避免因繁琐导致代码审查沦为形式主义。单元测试可自动化进行,能持之以恒。但测试毕竟只是手段,而非目的,所以如何合理安排测试就需要开发人员因地制宜
可以将测试、版本管理工具、以及自动发布 (nightly build)整合。编写脚本将测试失败结果与代码提交日志相匹配,最终生成报告发往指定邮箱
很多人认为单元测试代码不好写,不知道怎么测试。如果非技术原因,那么需要考虑结构设计是否合理,因为可测试性也是代码质量的一个体现
写单元测试本身就是对即将要实现的算法做复核预演。因为无论什么算法都需要给如条件,返回预期结果。这些加上平时写在 main 里面的临时代码,本就是一个完整的单元测试用例,无非换个地方存放而已
Testing
工具链和标准库自带单元测试框架,这让测试工作变得相对容易。关于测试,有以下规则:
测试代码须放在当前包以“ _test.go ” 结尾的文件中
测试函数以 Test 为名称前缀
测试命令 ( go test )忽略以 “ _ ” 或 “ . ” 开头的测试文件
正常编译操作 ( go build/install )会忽略测试文件
标准库 testing 提供了专用类型 T 来控制测试结果和行为
使用 Parallel 可有效利用多核并行优势,缩短测试时间
对于测试是否应该和目标放在同一目录,一直有不同的看法。某些人认为应该另建一个专门的包用来存放单元测试,且只测试目标公开接口。好处是,当目标内部发生变化时,无须同步维护测试代码。每个人对于测试都有不同的理解,就像覆盖率是否要做到 90% 以上,也是见仁见智
Table driven
单元测试代码一样要写的简介优雅,要做到这一点并不容易。好在多数时候,我们可以用一种类似数据表的模式来批量输入条件并依次比对结果
这种方式将测试数据和测试逻辑分离,更便于维护。另外,使用 Error 是为了让整个表全部完成测试,以便知道具体是哪组条件出了问题。
Test main
某些时候,须为测试用例提供初始化和清理操作,但 testing 并没有 setup / teardown 机制。解决办法是自定义一个名为 TestMain 的函数,go test 会改为执行该函数,而不再是具体的测试用例
M.Run 会调用具体的测试用例,但麻烦的是不能为每一个测试文件写一个 TestMain
要实现用例组合套件 ( suite ),需借助 MainStart 自行构建 M 对象。通过与命令行参数相配合,即可实现不同测试组合
Example
例代码最大的用途不是测试,而是导入到 GoDoc 等工具生成的帮助文档中。它通过比对输出 ( stdout )结果和内部 output 注释是否一致来判断是否成功
如果没有 output 注释,函数就不会被执行。另外,不能使用内置函数 print/println 因为它们输出到 stderr
2. 性能测试
性能测试函数以 Benchmark 为名称前缀,同样保存在 “ *_test.go ” 文件里
测试工具默认不会执行性能测试,须使用 bench 参数。它通过逐步调整 B.N 值反复执行测试函数,知道获得准确的测量结果
如果仅希望进行性能测试,可以用 run = NONE 忽略所有单元测试用例
某些耗时的目标,默认循环次数过少,取平均值不足以准确计量性能。可使用 benchtime 设定最小测试时间来增加循环次数,以便返回更准确的结果
Timer
如果在测试函数中要执行一些额外操作,那么应该临时阻止计时器工作
Memory
性能测试关心的不仅仅是执行时间,还包括在堆上的内存分配,因为内存分配和垃圾回收的相关操作也应该计入消耗成本
也可以将测试函数设置为总是输出内存分配信息,无论使用 benchmem 参数与否
3. 代码覆盖率
如果说单元测试和性能测试关注代码质量,那么代码覆盖率 ( code coverage)就是度量测试自身完整和有效性的一种手段
通过覆盖率值,我们可以分析出测试代码的编写质量。检测它是否提供了足够的测试条例,是否执行了足够的函数、语句、分支、和代码行等,依次来量化测试本身,让白盒测试真正起到应有的质量保障作用。
当然,这并不是说要追求形式上的数字百分比。关键还是为改进测试提供一个可发现缺陷的机会,毕竟只有测试本身的质量得到保障,才能让它免于成为形式主义摆设
代码覆盖率也常用来发现死代码 ( dead code )
为获取更详细的信息,可指定 covermode 和 coverprofile 参数
set :是否执行
count: 执行次数
atomic:执行次数 (支持并发模式)
还可以在浏览器中查看包括具体的执行次数等信息
4. 性能监控
引发性能问题的原因无外乎执行时间过长,内存占用过多,以及意外阻塞。通过捕获或监控相关执行状态数据,就可定位引发问题的原因,从而有针对性改进算法
有两种捕获方式:首先,在测试时输出并保存相关数据,进行初级评估。其次,在运行阶段通过 Web 接口获得实时数据,分析一段时间内的健康情况。除此之外,我们还可以用自定义计数器 ( expvar )提供更多与逻辑相关的参考数据
GO语言学习笔记-测试篇 Study for Go ! Chapter ten- Test的更多相关文章
- C语言学习笔记——特别篇(VScode安装使用)
B站有同步教学视频 参考博文: https://www.cnblogs.com/czlhxm/p/11794743.html 注意事项: 请在英文目录下运行!!! VScode下载链接: https: ...
- 大一C语言学习笔记(5)---函数篇-定义函数需要了解注意的地方;定义函数的易错点;详细说明函数的每个组合部分的功能及注意事项
博主学习C语言是通过B站上的<郝斌C语言自学教程>,对于C语言初学者来说,我认为郝斌真的是在全网C语言学习课程中讲的最全面,到位的一个,这个不是真不是博主我吹他哈,大家可以去B站去看看,C ...
- PHP学习笔记 - 进阶篇(7)
PHP学习笔记 - 进阶篇(7) 文件操作 读取文件内容 PHP具有丰富的文件操作函数,最简单的读取文件的函数为file_get_contents,可以将整个文件全部读取到一个字符串中. $conte ...
- PHP学习笔记 - 进阶篇(2)
PHP学习笔记 - 进阶篇(2) 函数 1.自定义函数 PHP内置了超过1000个函数,因此函数使得PHP成为一门非常强大的语言.大多数时候我们使用系统的内置函数就可以满足需求,但是自定义函数通过将一 ...
- PHP学习笔记 - 入门篇(5)
PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...
- PHP学习笔记--入门篇
PHP学习笔记--入门篇 一.Echo语句 1.格式 echo是PHP中的输出语句,可以把字符串输出(字符串用双引号括起来) 如下代码 <?php echo "Hello world! ...
- 2017-04-21周C语言学习笔记
C语言学习笔记:... --------------------------------- C语言学习笔记:学习程度的高低取决于.自学能力的高低.有的时候生活就是这样的.聪明的人有时候需要.用笨的方法 ...
- SystemTap 学习笔记 - 安装篇
https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux ...
- HTML语言学习笔记(会更新)
# HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...
- PHP学习笔记 - 进阶篇(11)
PHP学习笔记 - 进阶篇(11) 数据库操作 PHP支持哪些数据库 PHP通过安装相应的扩展来实现数据库操作,现代应用程序的设计离不开数据库的应用,当前主流的数据库有MsSQL,MySQL,Syba ...
随机推荐
- k8s排错(Unhealthy)
1,组件 Unhealthy 通过kubeadm安装好kubernetes v1.18.6 查看集群状态,发现组件controller-manager 和scheduler状态 Unhealthy
- 学习lua-04,json.util merge方法对集合处理的实际应用,及tostring方法
local jsonutil = require("json.util") local merge = require("json.util").merge l ...
- vxe-table 合并单元格
<vxe-table @cell-click="handleClickCell" :span-method="spanMethods" //自动合并单元格 ...
- 微服务注册到Nacos上的Ip错误,是内网ip不是公网ip
spring.cloud.nacos.discovery.ip = 本机公网IP spring.cloud.nacos.discovery.port = 服务端口
- 音速启动 Vstart 5.7 win10手动移除后台设置主页
Vstart 用了快12年了,用Wireshark跟踪确实会访问广告页面,也会去上传数据.还会悄悄设置主页 ,所以在Win10上老是被干掉 也想着换 CLaunch 确实不喜欢. Rolan 买了一年 ...
- 狂神day3
放个假,有几天没有学习了,也好久没有更新博客了 IDEA使用 在上一次的时候,我们直接建立一个工程写了一个"helloworld"的java文件,今天首先说的是先建立一个空的工程, ...
- uniapp+uView单选框多选框使用与模糊搜索
<template> <!-- 类别筛选组件 --> <view class="timeInput">{{filterArea}} <u- ...
- curl 查看响应时间
curl -o /dev/null -s -w "time_namelookup:%{time_namelookup}\ntime_connect: %{time_connect}\ntim ...
- 判断MP4 文件
public class CheckResult { public bool IsMp4 { get; set; } public bool SupportStrea ...
- Linux_Tomcat实战
Tomcat实战 tomcat简述 tomcat安装 部署jspgou项目 tomcat简述 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,Tomcat是Apache 软件基金会(A ...