当前位置: 首页 > news >正文

42-Golang中的单元测试

Golang中的单元测试

    • 需求
      • 传统方法
    • 基本介绍
      • 单元测试快速入门总结
    • 综合案例

需求

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

传统方法

在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 := 0for i := 0; i <= n; i++ {res += i}return res}
cal_test.gopackage mainimport "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   TestAddUppercal_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 monsterimport ("encoding/json""fmt""io/ioutil"
)type Monster struct {Name  stringAge   intSkill 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 monsterimport "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   TestStoremonster_test.go:16: monster.store()测试成功
--- PASS: TestStore (0.00s)
=== RUN   TestMonstermonster_test.go:31: monster.restore()测试成功
--- PASS: TestMonster (0.00s)
PASS
*/

相关文章:

42-Golang中的单元测试

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

python实现k_means聚类

K-Means算法是将一组N个样本的特征矩阵X划分为K个无交集的簇&#xff0c;直观上来看是簇是一组一组聚集在一起的数据&#xff0c;在一个簇中的数据就认为是同一类。簇就是聚类的结果表现。簇中所有数据的均值通常被称为这个簇的“质心”(Centroids)。在一个二维平面中&#xff…...

【批处理脚本】-3.3-exit命令详解

"><--点击返回「批处理BAT从入门到精通」总目录--> 共3页精讲(列举了所有exit的用法,图文并茂,通俗易懂) 在从事“嵌入式软件开发”和“Autosar工具开发软件”过程中,经常会在其集成开发环境IDE(CodeWarrior,S32K DS,Davinci,EB Tresos,ETAS…)中,…...

如果读了我2011年求职前端开发的酸爽经历,希望你可以鼓起勇气继续向前

今年是2023年&#xff0c;如果你觉得今年找工作很难&#xff0c;狗哥回忆了一下2011年求职前端开发工作的酸爽经历&#xff0c;希望你读了以后可以鼓起勇气&#xff0c;不要迷茫&#xff0c;简历投出去石沉大海的&#xff0c;需要改简历的就赶紧改&#xff0c;刷题不到位的就赶…...

PTA:L1-016 查验身份证、L1-017 到底有多二、L1-018 大笨钟(C++)

目录 PTA&#xff1a;L1-016 查验身份证 问题描述&#xff1a; 实现代码&#xff1a; L1-017 到底有多二 问题描述&#xff1a; 实现代码&#xff1a; L1-018 大笨钟 问题描述&#xff1a; 实现代码&#xff1a; 都是简单模拟题&#xff0c;不再写题解。 PTA&#xf…...

springboot工厂模式解决if_else流程和问题点解决

一、主要问题点 spring中的Bean由IOC容器进行管理&#xff0c;和普通工厂的区别就是springboot中的类不能通过自己New出来使用&#xff0c;如果通过new写入到工厂&#xff0c;涉及到相关实现类调用其他Service&#xff08;该service在正确情况下正常注入&#xff09;&#xff…...

如何避免缓存击穿?使用GO语言实现sliglefight

前言 在缓存系统中&#xff0c;如果发生了缓存未命中&#xff0c;通常会向数据库或者其他的缓存系统来请求数据。 想象这样一种情况&#xff0c;缓存系统中某个热点值被删除了&#xff0c;随后一大批请求到来&#xff0c;造成大量的cache miss&#xff0c;如果这些请求全部都…...

【浅学Java】MySQL索引七连炮

MySQL索引面试七连炮0. 谈一下你对索引的理解1. MySQL索引原理和数据结构能介绍一下吗2. B树和B树的区别3. MySQL聚簇索引和非聚簇索引的区别4. 使用MySQL索引都有什么原则4.1 回表4.2 索引覆盖4.3 最左匹配4.4 索引下推5. 不同的存储引擎是如何进行数据的存储的6. MySQL组合索…...

扬帆优配|昔日白马股濒临退市,却6天5涨停!ST股突然集体爆发

尽管再度重申“公司股票将被停止上市”&#xff0c;但3月8日早间&#xff0c;*ST辅仁股价仍是在开盘后快速封住涨停板。这已是该公司近6个买卖日来&#xff0c;第5次呈现涨停。 无独有偶&#xff0c;8日早间ST东瀛也在此前多次涨停后&#xff0c;再度呈现近4%的涨幅。而就在7日…...

Git 基础(一)—— Git 的安装及其配置

目录 一、Git 的下载与安装 1、Linux 环境 2、Windows 环境 (1) 下载 Git 安装包 (2) 安装 Git 二、Git 配置 1、配置用户信息 2、查看配置信息 3、Windows 环境下配置文件的位置 一、Git 的下载与安装 1、Linux 环境 在保证网络环境畅通的情况下&#xff0c;直接输…...

什么是信息安全风险评估?企业如何做?

什么是信息安全风险评估&#xff1f; 信息安全风险评估是参照风险评估标准和管理规范&#xff0c;对信息系统的资产价值、潜在威胁、薄弱环节、已采取的防护措施等进行分析&#xff0c;判断安全事件发生的概率以及可能造成的损失&#xff0c;提出风险管理措施的过程。当风险评…...

HBase---idea操作Hbase数据库并且映射到Hive

idea操作Hbase数据库并且映射到Hive 文章目录idea操作Hbase数据库并且映射到Hiveidea操作Hbase数据库环境准备启动服务创建Maven工程在测试类中编写初始化方法在测试类中编写关闭方法在测试类中编写创建命名空间方法在测试类中编写创建表方法在测试类中编写查看表结构方法在测试…...

剑指 Offer 61 扑克牌中的顺子

摘要 扑克牌中的顺子 一、集合 Set 遍历 根据题意&#xff0c;此5张牌是顺子的 充分条件 如下&#xff1a; 除大小王外&#xff0c;所有牌 无重复 &#xff1b;设此5张牌中最大的牌为max&#xff0c;最小的牌为min&#xff08;大小王除外&#xff09;&#xff0c;则需满足…...

Spring 响应式编程-读书笔记

序言 大家好&#xff0c;我是比特桃。本文为《Spring 响应式编程》的读书笔记&#xff0c;响应式技术栈可以创建极其高效、易于获取且具有回弹性的端点&#xff0c;同时响应式可以容忍网络延迟&#xff0c;并以影响较小的方式处理故障。响应式微服务还可以隔离慢速事务并加速速…...

CI流水线的理解

一、概念 单元测试&#xff1a;针对软件的基本单元&#xff08;如&#xff1a;类、函数&#xff09;所做的测试。 集成测试&#xff1a;将软件代码单元集成起来后&#xff0c;以组件、模块和子系统为单位进行的测试&#xff0c;主要测试接口间的交互关系。也称组件测试&#xf…...

OpenStack手动分布式部署Nova【Queens版】

目录 Nove简介&#xff1a; 1、登录数据库配置&#xff08;在controller执行&#xff09; 1.1登录数据库 1.2数据库里创建nova-api 1.3数据库登录授权 1.4创建nova用户 1.5添加admin用户为nova用户 1.6创建nova服务端点 1.7创建compute API 服务端点 1.8创建一个placement服务…...

centos7 oracle19c安装 ORA-01012: not logged on

总共分三步 1.下载安装包:里面有一份详细的安装教程 链接&#xff1a;https://pan.baidu.com/s/1Of2a72pNLZ-DDIWKrTQfLw?pwd8NAx 提取码&#xff1a;8NAx 2.安装后,执行初始化:时间较长 /etc/init.d/oracledb_ORCLCDB-19c configure 3.配置环境变量,不配置环境变量,sq…...

山东小巨人申报条件

国家专精特新小巨人特点1、经济效益&#xff1a;上年度企业营业收入在1亿元至4亿元之间&#xff0c;近2年主营业务收入或净利润的平均增长率达到10%以上&#xff0c;企业资产负债率不高于70%。2、专业化程度&#xff1a;&#xff08;1&#xff09;企业从事特定细分市场时间达到…...

手写中实现并学习ahooks——useRequest

前言 最近业务没有之前紧张了&#xff0c;也是消失了一段时间&#xff0c;也总结了一些之前业务上的问题。 和同事沟通也是发现普通的async await 封装api在复杂业务场景下针对于请求的业务逻辑比较多&#xff0c;也是推荐我去学习一波ahooks&#xff0c;由于问题起源于请求…...

[手写OS]动手实现一个OS 之 准备工作以及引导扇区

[手写OS]动手实现一个OS之第一步-环境以及引导扇区 环境准备 一台可用计算机&#xff08;linux我不知道&#xff0c;我用的Windows&#xff09;汇编编译器NASM一个方便的软盘读写工具VirtualBox 汇编编译器NASM 官网地址&#xff1a;https://www.nasm.us/pub/nasm/snapshot…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

MySQL用户和授权

开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务&#xff1a; test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...

AspectJ 在 Android 中的完整使用指南

一、环境配置&#xff08;Gradle 7.0 适配&#xff09; 1. 项目级 build.gradle // 注意&#xff1a;沪江插件已停更&#xff0c;推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

html-<abbr> 缩写或首字母缩略词

定义与作用 <abbr> 标签用于表示缩写或首字母缩略词&#xff0c;它可以帮助用户更好地理解缩写的含义&#xff0c;尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时&#xff0c;会显示一个提示框。 示例&#x…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...