42-Golang中的单元测试

2023-11-05

需求

在工作中,我们会遇到这样的情况,就是去确认一个函数,或者一个模块的结果是否正确

传统方法

在main函数中,调用addUpper函数,看看实际输出的记过是否和预期的结果一直,如果一直,则说明函数正确否则函数有错误,然后修改错误

缺点:

  • 1.不方便,我们需要在main函数中区调用,这样就需要去修改main函数,如果现在项目在运行,就可能去停止项目
  • 2.不利于管理,因为我们测试多个函数或者多个模块时,都需要写在main函数,不利于我们管理和清晰思路
  • 3.引出单元测试---->testing测试框架,可以很好解决问题

基本介绍

Go语言中自带有一个轻量级的测试框架testing和自带的 go test命令来实现单元测试和性能测试,testing框架和其他语言中的测试框架类似,可以基于这个框架写针对相应函数的测试用例(test case),也可以基于该框架写相应的压力测试用例。通过单元测试,可以解决如下问题:

  • 1.确保每个函数是可运行并且运行结果是正确的
  • 2.确保写出来的代码性能是好的
  • 3.当官测试能及时的发现程序设计或实现的逻辑错误,是问题及早暴露,便于问题的定位解决,而性能测试的重点在于发现程序设计色很的一些问题,让程序能够在高并发的情况下还能保持稳定
cla.gopackage main

//一个测试函数
func addUpper(n int) int {
	res := 0
	for i := 0; i <= n; i++ {
		res += i
	}
	return res

}
cal_test.gopackage main

import "testing" //引入go的testing框架包

//编写一个测试用例,去测试addUpper是否正确
func TestAddUpper(t *testing.T) {
	//调用
	res := addUpper(10)
	if res != 55 {
		t.Fatalf("AddUpper(10)执行错误,期望值=%v 实际值=%v", 55, res)
	}
	//如果正确,输出日志
	t.Logf("AddUpper(10)执行正确")
}
/*
=== RUN   TestAddUpper
    cal_test.go:13: AddUpper(10)执行正确
--- PASS: TestAddUpper (0.00s)
PASS
*/

在这里插入图片描述

单元测试快速入门总结

  • 1.测试用例文件名必须以_test.go结尾。比如cal_test.go,cal不是固定的
  • 2.测试用例函数必须以Test开头,一般来说就是Test+被测试的函数名,比如TestAddUpper
  • 3.TestAddUpper(t *testing.T)的形参类型必须是 *testing.T
  • 4.一个测试用例文件中,可以有多个测试用例函数,比如TestAddUpper, TestSub
  • 5.运行测试用例指令
    • cmd>go test[如果运行正确,无日志,错误时,会输出日志]
    • cmd>go test -v [运行正确或者是错误,都输出日志]
  • 6.当出现错误时候,可以使用t.Fatalf来格式化输出错误信息,并退出程序
  • 7.t.Logf方法可以输出相应的日志
  • 8.测试用例函数,并没有放在main函数中,也执行了,这就是测试用例的方便之处
  • 9.PASS表示测试用例运行成功,FALL表示测试用例运行失败
  • 10.测试单个文件一定要带上被测试的原文件 go test -v cal_test.go cal.go
  • 11.测试单个方法 go test -v -test.run TestAddUpper

综合案例

  • 1.编写一个Monster结构体,字段Name,Age,Skill
  • 2.给MOnster绑定方法Store,可以将一个Monster变量(对象),序列化后保存到文件中
  • 3.给Monster绑定方法ReStore,可以将一个序列化的Monster,从文件中读取,并反序列化为Monster对象,检测反序列化,名字是否正确
  • 4.编程测试用例文件store_test.go,编写测试用例函数TestStore和TestRestore进行测试
//monster.go
package monster

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
)

type Monster struct {
	Name  string
	Age   int
	Skill string
}

//给monster绑定方法store,可以将一个monster变量(对象),序列化后保存到文件中
func (this *Monster) Store() bool {
	//先序列化
	data, err := json.Marshal(this)
	if err != nil {
		fmt.Println("marshal err=", err)
		return false
	}
	//保存到文件
	filePath := "d:/monster.ser"
	err = ioutil.WriteFile(filePath, data, 0666)
	if err != nil {
		fmt.Println("write file err=", err)
		return false
	}
	return true
}

//给Monster绑定方法ReStore,可以将一个序列化的Monster,
//从文件中读取,并反序列化为Monster对象,检测反序列化,名字是否正确
func (this *Monster) ReStore() bool {
	//先从文件中,读取序列化的字符串
	filePath := "d:/monster.ser"
	data, err := ioutil.ReadFile(filePath)
	if err != nil {
		fmt.Println("ReadFile err =", err)
		return false
	}

	//使用读取到data []byte,对反序列化
	err = json.Unmarshal(data, this)
	if err != nil {
		fmt.Println("unmarshal err=", err)
		return false
	}
	return true
}



//monster_test.go
package monster

import "testing"

//测试用例,测试store方法
func TestStore(t *testing.T) {
	monster := &Monster{
		Name:  "kunkun",
		Age:   25,
		Skill: "rap",
	}
	res := monster.Store()
	if !res {
		t.Fatalf("monster.store() 错误,希望为=%v 实际为=%v", true, res)
	}
	t.Logf("monster.store()测试成功")

}

func TestMonster(t *testing.T) {
	//先创建一个monster实例,不需要指定字段的值
	var monster = &Monster{}
	res := monster.ReStore()
	if !res {
		t.Fatalf("monster.restore() 错误,希望为=%v 实际为=%v", true, res)
	}
	//进一步判断
	if monster.Name != "kunkun" {
		t.Fatalf("monster.restore() 错误,希望为=%v 实际为=%v", "kunkun", monster.Name)
	}
	t.Logf("monster.restore()测试成功")
}
/*
=== RUN   TestStore
    monster_test.go:16: monster.store()测试成功
--- PASS: TestStore (0.00s)
=== RUN   TestMonster
    monster_test.go:31: monster.restore()测试成功
--- PASS: TestMonster (0.00s)
PASS
*/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

42-Golang中的单元测试 的相关文章

  • 媒介盒子「AI一键生成文章」功能上线,连新闻稿都不用自己写了~

    媒介盒子 AI一键生成文章 功能上线 发软文再也不用担心没有软文稿了 媒介盒子 AI一键生成文章 功能专为有软文发稿需求 但没有软文稿件的用户量身定做 媒介盒子作为国内首屈一指的专业软文发稿平台 在以往合作的客户中 经常有人反馈 我们公司没
  • python--argparse之action用法

    argparse之action用法 action关键字默认状态有两种 store true和store false 若输入命令时 不指定其参数 则store true显示为False store false显示为True 下面举个例子来直观
  • C++加密库 Crypto++

    lcrypto algorithm type name authenticated encryption schemes GCM CCM EAX high speed stream ciphers Panama Sosemanuk Sals
  • python从Excel表格中读取数据

    使用python从Excel表格中读取数据 需要安装xlrd库 pip3 install xlrd 或者 pip install xlrd 之后就可以在 py文件中导入该模块了 import xlrd
  • 用ppt图表分析人口数据

    2022年7月11日是世界人口日 联合国经济和社会事务部 经社部 在这一天发布了 世界人口展望2022 联合国每两年或三年发布一次 世界人口展望 的版本 上一个版本是2019版 世界人口展望2022 预测2022年11月15日 世界人口将达
  • 爆料称字节跳动实习生删库

    本文转载自IT之家 6 月 24 日消息 脉脉用户 程序员 白胜 在社交媒体称 字节跳动一名实习生删除了公司所有 lite 模型 在脉脉上引发关注 这名用户随后在回复中称 实习生直接 delete 父目录 还加了 skip trash li

随机推荐

  • 算法题记录【华为od】查找单入口空闲区域

    题目描述 思路分析 来源 华为OD真题学习 查找单入口空闲区域 100 大为童鞋的博客 CSDN博客 总体思路是遍历数组 查找符合要求的点即可 注意点一 单入口区域只能存在一个入口 用count判断是否只存在一个入口 注意点二 目标点上下左
  • 【云原生学习】PromQL学习以及Node Exporter常用查询语句

    文章目录 PromQL学习以及Node Exporter常用查询语句 一 PromQL学习 1 1 表达式数据类型 1 1 1 Instant vector selectors 1 1 2 区间vector selectors 1 2 符合
  • pythonpandas数据输出_[Python]pandas用法-数据系列,pythonpandas,使用,Series

    pandas数据Series 目录 默认数字索引 import pandas as pd import numpy as np from pandas import Series from pandas import DataFrame o
  • 软件工程知识-软件测试

    1 软件测试是发现软件错误 缺陷 的主要手段 从是否关系软件内部结构和具体实现的角度对软件测试进行分类 2 静态测试 以检查为主 桌前检查 代码走查 代码审查 动态测试 实际运行程序 分白盒测试 黑盒测试 灰盒测试 白盒测试 结构测试 用于
  • AI加速(八)

    大家好啊 我是董董灿 前文回顾 AI加速 一 GPU为什么这么牛 AI加速 二 计算机存储和计算的分离 AI加速 三 每条指令都是流水线的工人 AI加速 四 衣柜般的分层存储设计 AI加速 五 一个例子看懂流水 从指令到算法 AI加速 六
  • 18769 不完整的排序

    时间限制 1000MS 代码长度限制 10KB 提交次数 0 通过次数 0 题型 编程题 语言 不限定 Description 一个数组只包含正负整数 请使用一个O n 级别的算法对其进行排序 只需将负数全部放前面 正数全部放后面即可 无需
  • 机器学习中特征的处理及选择

    基础概念 特征工程是通过对原始数据的处理和加工 将原始数据属性通过处理转换为数据特征的过程 属性是数据本身具有的维度 特征是数据中所呈现出来的某一种重要的特性 通常是通过属性的计算 组合或转换得到的 比如主成分分析就是将大量的数据属性转换为
  • 做接口测试如何上次文件

    在日常工作中 经常有上传文件功能的测试场景 因此 本文介绍两种主流编写上传文件接口测试脚本的方法 首先 要知道文件上传的一般原理 客户端根据文件路径读取文件内容 将文件内容转换成二进制文件流的格式传输给服务端 而服务端接受客户端传过来的二进
  • 构建ubuntu根文件系统

    构建ubuntu根文件系统 象棋小子 1048272975 Ubuntu是一个广泛应用于个人电脑 云计算 以及智能物联网设备的开源操作系统 针对智能物联网 Ubuntu提供了一套更加安全 轻量级 专为智能物联网订制的开源操作系统Ubuntu
  • 前后端交互的api

    api是application interface应用接口 通过原生ajax或者jQuery或者axios 发送请求 连接后端的核心纽带 可以说也是一种革命 因为之前都是混编 html代码与后端语言杂合在一起 原码即是运行的代码 不加以修饰
  • 类加载器 & 打破双亲委派机制(个人总结)

    声明 1 本文为我的个人复习总结 并非那种从零基础开始普及知识 内容详细全面 言辞官方的文章 2 由于是个人总结 所以用最精简的话语来写文章 3 若有错误不当之处 请指出 类加载器 启动类加载器 加载JAVA HOME lib下的核心类 扩
  • HJ68 成绩排序【python3】

    题目描述 给定一些同学的信息 名字 成绩 序列 请你将他们的信息按照成绩从高到低或从低到高的排列 相同成绩 都按先录入排列在前的规则处理 例示 jack 70 peter 96 Tom 70 smith 67 从高到低 成绩 peter 9
  • Linux下,qt5中使用Qt Multimedia编译时遇到报错

    遇到defaultServiceProvider requestService no service found for org qt project qt mediaplayer 错误 解决方法 在Linux中 sudo apt get
  • 商城前台项目:商品三级分类功能实现

    项目效果 实现代码 components Category index vue div h2 class all 全部商品分类 h2 div
  • Mac笔记本Xcode打开不了文件和打开文件看不到新添加的文件的解决办法

    第一次使用xcode碰见了以下问题 创建完项目之后 在文件外面将自己想要的文件复制进去文件后 重新打开xcode发现并不显示文件 xcode不能打开非Xcode创建的文件夹 解决办法 用xcode创建项目后 需要在左下角添加文件进来才能看到
  • ssh框架hibernate 查询方式和查询功能优化

    Hibernate框架的查询方式 1 唯一标识OID的检索方式 session get 对象 class OID 2 对象的导航的方式 3 HQL的检索方式 Hibernate Query Language Hibernate的查询语言 4
  • JavaEE——SmartTomcat的使用教程与常见错误

    SmartTomcat 上一篇博客讲到 使用tomcat创建servlet项目有以下几个步骤 创建maven项目 引入servlet依赖 创建目录 编写代码 打包成war包 拷贝到webapps目录下 运行tomcat 验证程序 可以看到步
  • 设计模式(4)-原型模式(Prototype Pattern)

    所谓原型模式就是从原型实例去复制克隆出新的实例 而绝不是去从类去实例化 就好比打飞机的游戏 我们操作的主角飞机只有一架 可以用单例模式去实现 而敌机好多都是一样的 如果每出一个敌机我们就去new一个敌机的对象 一下来个三十个 就去new三十
  • 【傅里叶级数与傅里叶变换】数学推导——1、基础知识点回顾及[Part1:三角函数的正交性]介绍

    文章内容来自DR CAN关于傅里叶变换的视频 本篇文章提供了一些基础知识点 比如三角函数常用的导数 三角函数换算公式等 文章全部链接 基础知识点 Part1 三角函数系的正交性 Part2 T 2 的周期函数的傅里叶级数展开 Part3 周
  • 42-Golang中的单元测试

    Golang中的单元测试 需求 传统方法 基本介绍 单元测试快速入门总结 综合案例 需求 在工作中 我们会遇到这样的情况 就是去确认一个函数 或者一个模块的结果是否正确 传统方法 在main函数中 调用addUpper函数 看看实际输出的记