一文详解Go语言单元测试的原理与使用
作者:山与路 发布时间:2024-05-09 10:08:03
前言
为什么要引用单元测试类
传统方法的缺点分析
不方便,我们需要在main函数中去调用,这样就需要去修改main函数,如果现在项目正在运行,就可能去停止项目
不利于管理,因为当我们测试多个函数或者多个模块时,都需要写在main函数,不利于我们管理和清晰我们的思路
单元测试基本介绍
Go语言中自带有一个轻量级的测试框架testing和自带的go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例,也可以基于该框架写相应的压力测试用例
优点
确保每个函数是可运行,并且运行结果是正确的
确保写出来的代码性能是好的
单元测试能及时的发现程序设计或实现的逻辑错误,使问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计的一些问题,让程序能够在高并发的情况下还能保持稳定
Testing规范
1.测试用例文件名必须以 _test.go结尾
2.测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名
3.测试用例函数的形参类型必须是*testing.T
4.一个测试用例文件中,可以由多个测试用例函数
5.当出现错误使,可以使用t.Fatalf来格式化输出错误信息,并退出程序
6.t.Logf方法可以输出相应的日志
7.测试用例函数,并没有放在main函数中,但是却执行了main函数
8.pass表示测试用例运行成功,Fail表示测试用例运行失败
9.测试单个文件,一个要带上被测试的源文件
go test -v cal_test.go cal.go
10.测试单个方法
go test -v -test.run 函数名
基本使用
cal.go
package main
func add(n int)(int){
var sum int
for i:=1;i<=n ;i++ {
sum+=i
}
return sum
}
cal_test.go
package main
import "testing"
//函数名规范 Test+要测试的函数名(t *testing)
func TestAdd(t *testing.T){
res:=add(9)
if(res!=55){
t.Fatalf("add(10)执行错误,期望值=%v 实际值=%v\n",55,res)
}
t.Logf("执行正确!!")
}
Golang运行
命令行
案例
monster.go
package monster
import (
"encoding/json"
"fmt"
"io/ioutil"
)
type Monster struct {
Name string
Age int
Skill string
}
func (this *Monster) Store() bool {
data,err:=json.Marshal(this)
if err!=nil{
fmt.Println("err=",err)
return false
}
filename:="f:/test.ser"
err2:=ioutil.WriteFile(filename,data,0666)
if err2 !=nil{
fmt.Println("err=",err2)
return false
}
return true
}
func (this *Monster) ReStore() bool {
filename:="f:/test.ser"
reader,err2:=ioutil.ReadFile(filename)
if err2 !=nil{
fmt.Println("err=",err2)
return false
}
err:=json.Unmarshal(reader,this)
if err!=nil{
fmt.Println("err=",err)
return false
}
return true
}
monster_test.go
package monster
import (
"fmt"
"testing"
)
func TestStore(t *testing.T) {
monster:=&Monster{
Name: "张三",
Age: 18,
Skill: "打游戏",
}
flag:=monster.Store()
if !flag{
t.Fatalf("monster.Store() 错误,期望为%v,实际为%v",true,flag)
}
t.Logf("monster.Store()测试成功")
}
func TestRestore(t *testing.T) {
var monster=&Monster{}
flag:=monster.ReStore()
if !flag{
t.Fatalf("monster.ReStore() 错误,期望为%v,实际为%v",true,flag)
}
t.Logf("monster.Store()测试成功")
fmt.Println(monster) //&{张三 18 打游戏}
}
来源:https://juejin.cn/post/7146112523429740575


猜你喜欢
- 如果你听说过“测试驱动开发”(TDD:Test-Driven Development),单元测试就不陌生。单元测试是用来对一个模块、一个函数
- 1. mysql_where子句_聚合函数# ### part 单表查询""" select ... from
- 数据采集XPath,XML路径语言的简称。XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某
- mysql分组统计并求出百分比1、mysql 分组统计并列出百分比SELECT point_id,&nb
- 一、背景近期项目即将开展,计划第一步就是实现数据的可视化,所以先学习一下数据展示相关Demo。选用Python2.7与Matplotlib来
- MySQL内建复制功能来优化可用性,在Soundbreak我们每天24小时不间断地播放实况音频和视频,所以对于MySQL的新增的复制特性,我
- 1. 英雄的简单动画实现需求:在游戏初始化定义一个pygame.Rect的变量记录英雄的初始位置在游戏循环中每次让英雄的y-1--向上移动(
- 引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:<!DOCTYPE HTML>&l
- 在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器。mysqld_safe增加了一些安全特性,例如当出现错误
- 引言本人因为种种原因(说来听听),放弃大学学的java,走上了golang这条路,本着干一行爱一行的情怀,做开发嘛,不能只会使用这门语言,所
- python实战,用户答题分享给大家。主要包含内容,文件的读取,更改,保存。不同文件夹引入模块。输入,输出操作。随机获取数据操作随机生成算数
- 我就废话不多说了,大家还是直接看代码吧~# 两个依赖包: sasl&thriftThe easier way I find to i
- 几乎是一夜之间,微信小游戏《羊了个羊》火了。?这个依靠寻找相同元素消除方块的小游戏,凭借其“变态级别&rdquo
- 我们先来看下秒杀活动页面代码<!DOCTYPE HTML><html> <head> <
- 查看python搜索包的路径的实现方法:python搜索包的路径存储在sys.path下查看方法:import syssys.path临时添
- 今天我们学习如何配置url、如何传参、如何命名、以及渲染的方式,内容大致有以下几个方面。创建视图函数并访问创建appdjango中url规则
- 什么是异常?异常是一个事件,其中一个程序,破坏程序的指令的正常流的执行过程中而发生的。一般情况下,当一个Python脚本遇到一些情况不能处理
- 也许你听说过Hibernate的大名,但可能一直不了解它,也许你一直渴望使用它进行开发,那么本文正是你所需要的!在本文中,我向大家重点介绍H
- 使用python进行图片处理,现在需要读出图片的任意一块区域,并将其转化为一维数组,方便后续卷积操作的使用。 下面使用两种方法进行处理:co
- 华丽的文本框演示首先看看演示结果:实现代码import matplotlib.pyplot as pltplt.text(0.8, 0.5,