文章转载地址:https://www.flysnow.org/2017/05/16/go-in-action-go-unit-test.html

什么是单元测试?

     单元测试一般用来测试我们的代码逻辑是否有问题,有没有按照我们的期望运行,以保证代码质量

大多数的单元测试都是针对某一个函数方法进行测试,以尽可能的保证没有问题或问题可以被我们预知

现在,我们在 package main 里定义一个函数,求两数之和的函数,然后我们使用单元测试进行求和逻辑

测试

main.go

package main

// 定一个求两数之和的函数
func Add(a,b int) int {
return a + b
}

  main_test.go

package main

import "testing"

// 使用单元测试进行 main.go 文件里面求和函数的逻辑测试
func TestAdd(t *testing.T) {
sum := Add(1,2) if sum == 3 {
t.Log("the result is ok")
}else {
t.Fatal("the result is wrong")
}
}

  然后我们在终端的项目目录下运行 go test -v 就可以看到测试结果:

=== RUN   TestAdd
--- PASS: TestAdd (0.00s)
main_test.go:10: the result is ok
PASS
ok _/E_/GoProject/development/src 0.689s

  有测试成功的标记 PASS

Go 语言为我们提供了测试框架,以方便我们更容易的进行单元测试,但是要使用这个框架,需要遵循以下几个准则:

1.含有单元测试代码的文件必须以 _test.go 结尾

2.单元测试文件名 _test.go 前面的部分最好是被测试方法所在 go 文件的文件名

3.单元测试的函数必须以 Test 开头

4.测试函数的签名必须接收一个指向 testing.T 类型的指针,并且不能返回任何值

5.函数名最好是 Test + 要测试的方法函数名

表组测试

      还有一种单元测试方法叫表组测试,这个和基本的单元测试非常相似,只不过它有好几个不同的输入以及输出组成的一组

单元测试

比如上面的例子中,我们测试了 1+ 2,如果我们再测试 3 + 4 ,9 +2 等,这就有了好几个输入,同时也对应好几个输出,这

种一次性测试很多个输入输出场景的测试,就是表组测试:

package main

import "testing"

// 使用单元测试进行 main.go 文件里面求和函数的逻辑测试
func TestAdd(t *testing.T) {
sum := Add(1,2) if sum == 3 {
t.Log("the result is ok")
}else {
t.Fatal("the result is wrong")
} sum = Add(3,4)
if sum == 7 {
t.Log("the result is ok")
}else {
t.Fatal("the result is wrong")
}
}

测试覆盖率

      我们尽可能多的模拟更多场景去测试我们的代码,但是有的时候也会忘记测试的代码,这时候我们就需要测试覆盖率作为参考了

由单元测试的代码,触发运行到被测试代码的行数占所有代码行数的比例,叫做测试覆盖率,代码覆盖率不一定精准,但是可以

作为参考,可以帮我们测量和我们预计的覆盖率之间的差距,如下示例:

main.go

package main

import "fmt"

func Tag(tag int)  {
switch tag {
case 1:
fmt.Println("Android")
case 2:
fmt.Println("Go")
case 3:
fmt.Println("Java")
default:
fmt.Println("PHP")
}
}

  main_test.go

package main

import "testing"

func TestTag(t *testing.T) {
Tag(1)
Tag(2)
}

  现在我们使用 go test 工具运行单元测试,和前面不一样的是我们需要测试覆盖率,所以多加一个参数 -converprofile,

完整的命令:go test -v -coverprofile=c.out 会生成一个覆盖率文件就是 c.out :

=== RUN   TestTag
Android
Go
--- PASS: TestTag (0.00s)
PASS
coverage: 60.0% of statements
ok _/E_/GoProject/development/src 0.503s

  我们可以看到输出结果中显示覆盖率 60% 不到 100%, 生成报告中有 go 为我们提供的工具,使用 go tool cover -html=c.out

-o=tag.html 可以生成一个 tag.html 文件,这个文件可以详细告诉我们哪一行代码被测试到了,哪一行代码没被测试到:

上图中被标记为绿色的代码已经被测试到了,红色的还没有被测试到,现在我们来进一步完善:

func TestTag(t *testing.T) {
Tag(1)
Tag(2)
Tag(3)
Tag(6)
}

  

我们可以看到覆盖率已经 100%

Go-单元测试的更多相关文章

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

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

  2. Python的单元测试(二)

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

  3. Python的单元测试(一)

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

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

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

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

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

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

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

  7. ABAP单元测试最佳实践

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

  8. python_单元测试unittest

    Python自带一个单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 步骤1:首先引入unittest模块--import un ...

  9. .Net中的AOP系列之《单元测试切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 使用NUnit编写测试 编写和运行NUnit测试 切面的测试策略 Castle DynamicProxy测试 测试一个拦截器 注入依赖 ...

  10. React单元测试——十八般兵器齐上阵,环境构建篇

    一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套完整的单元测试能在在后续迭代更新中回归错误时候给与警 ...

随机推荐

  1. es6下 vue实例属性template不能使用

    esm模式下 不能使用template,需要引入非esm的vue.js,查看vue源码的包的dist目录下 文件标有esm是支持ems,没有标记,就是不支持(这个知识,怎么说了,应该属于webpack ...

  2. 使用charles模拟慢速网络

    1.设置慢速网络 点击导航栏的proxy---throttle setting来设置想要的网络情况, 其中有两种方法: (1)勾选Enable Throttling,在Throttle presett ...

  3. selenium的

    1.简介 selenium可以认为是反反爬虫的最佳利器,它基本可以等同于真实的浏览器访问,用它可以加载到动态数据,也省去了cookie的操作,但是用这个有一个重大的效率问题.所以selenium可以用 ...

  4. html5+css基础

    最近在学习html+css3基础教程,整理了一些基础知识点.在此与大家分享. 1.盒模型 定义:css处理网页时,它认为每个元素都包含在一个不可见的盒子里,即我们所熟知的盒模型.其中它的主要属性有:h ...

  5. 2018-2019 20175232 实验二《Java面向对象程序设计》实验报告

    一.实验内容及步骤 1熟练掌握Junit和TDD: TDD(Test Driven Devlopment, 测试驱动开发)我们是该“先写产品代码,然后再写测试代码,通过测试发现了一些Bugs,修改代码 ...

  6. Apache2 httpd.conf配置文件中文版详解

    Apache2 httpd.conf配置文件中文版详解## 基于 NCSA 服务的配置文件.##这是Apache服务器主要配置文件.#它包含服务器的影响服务器运行的配置指令.#参见以取得关于这些指令的 ...

  7. MATLAB GUI设计(线性卷积和循环卷积的比较--笔记)

    原创循环卷积代码,转载需注明出处 线性卷积与循环卷积的比较 实验目的和要求 掌握循环卷积和线性卷积的原理,与理论分析结果比较,加深理解循环卷积与线性卷积之间的关系. 实验内容和步骤 1) 已知两序列X ...

  8. python数据类型之集合类型

    一.集合的作用 知识点回顾:可变类型是不可hash类型,不可变类型是可hash类型 作用:去重,关系运算 定义:可以包含多个元素,用逗号分割,集合的元素遵循三个原则: 1.每个元素必须是不可变类型(可 ...

  9. 统计Oracle一个表空间中各个segment占用的空间大小

    SQL语句参考以下: select owner,segment_name,segment_type,tablespace_name,sum(bytes)/1024/1024/1024 from dba ...

  10. 如何正确对用户密码进行加密?转自https://blog.csdn.net/zhouyan8603/article/details/80473083

    本文介绍了对密码哈希加密的基础知识,以及什么是正确的加密方式.还介绍了常见的密码破解方法,给出了如何避免密码被破解的思路.相信读者阅读本文后,就会对密码的加密有一个正确的认识,并对密码正确进行加密措施 ...