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

golang testing使用

testing包服务于自动化测试

基本测试

Table Drvien Test

基于表的测试通过表形式进行测试每种情况的输入和期望输出,从而测试程序的正确性

func TestFib(t *testing.T) {var fibTests = []struct {in       int // inputexpected int // expected result}{{1, 1},{2, 1},{3, 2},{4, 3},{5, 5},{6, 8},{7, 13},}for _, tt := range fibTests {actual := Fib(tt.in)if actual != tt.expected {t.Errorf("Fib(%d) = %d; expected %d", tt.in, actual, tt.expected)}}
}

反馈测试情况接口

  • 跳过测试
    • SkipNow(): 跳过测试
    • Skip(): 跳过测试并输出log
    • Skipf(): 跳过测试并格式化输出log
  • 失败但继续
    • Fail(): 标记测试失败,但继续执行
    • FailNow(): 标记测试失败,不继续执行
    • Error(): 标记测试失败,并输出
    • Errorf(): 标记测试失败,并格式化输出
  • 输出
    • Log(): 输出
    • Logf(): 格式化输出
  • 失败且中断
    • Fatal(): 相当于FailNow() + Log()
    • Fatalf(): 相当于FailNow() + Logf()

Parallel()

Parallel方法表示会和其他带有Parallel方法的测试并行执行

ExampleXXX()

ExampleXXX方法中如果含有Output: 开头的行注释,则会在运行测试期间,将输出和注释中的值相比较

如果是不确定的顺序,则可以以Unordered output: 作为开头

但如果没有这样的注释,这就是一个普通函数,不能被直接运行

压力测试

压力测试方法以func BenchmarkXXX(*testing.B)函数名展现。

函数体格式如下

func BenchmarkHello(b *testing.B) {for i := 0; i < b.N; i++ {// do sth}
}

压力测试会自动调整b.N使得持续足够长时间

重置计时器

如果想要跳过不需要计时的耗时工作,那么可以通过b.ResetTimer()重置计时器

并行测试

如果想并行压力测试,那么可以通过RunParallel实现

func BenchmarkHelloParallel(b *testing.B) {b.RunParallel(func(pb *testing.PB) {// do sth})
}

内存统计

ReportAllocs方法用于打开内存统计功能

输出结果就会变成如下形式

// 方法名		迭代总次数		平均每次迭代时间		平均每次迭代分配字节数		平均每次迭代的内存分配次数
BenchmarkHello        2000000           898 ns/op         368 B/op           9 allocs/op

自定义度量值

ReportMetric(n float64, unit string)汇报自定义度量值

  • 如果度量值是每次迭代的,你应该将其除以 b.N。按照惯例,单位应该以 “/op” 结尾。
  • ReportMetric 会覆盖同一单位的任何先前报告的值。
  • 如果单位是空字符串,或者单位包含任何空格,ReportMetric 会引发 panic。
  • 如果单位是基准测试框架本身通常报告的单位(如 “allocs/op”),ReportMetric 会覆盖该度量值。将 “ns/op” 设置为 0 将禁止该内置度量值。
	testing.Benchmark(func(b *testing.B) {var compares int64for i := 0; i < b.N; i++ {s := []int{5, 4, 3, 2, 1}sort.Slice(s, func(i, j int) bool {compares++return s[i] < s[j]})}// This metric is per-operation, so divide by b.N and// report it as a "/op" unit.b.ReportMetric(float64(compares)/float64(b.N), "compares/op")// This metric is per-time, so divide by b.Elapsed and// report it as a "/ns" unit.b.ReportMetric(float64(compares)/float64(b.Elapsed().Nanoseconds()), "compares/ns")})

子测试

子测试也就是可以在测试中测试,子测试可以共用初始化等公共操作,并可以做父测试执行前的必要操作

func TestSubTest(t *testing.T) {t.Run("sub1", func(t *testing.T) {t.Log("sub1")})t.Run("sub2", func(t *testing.T) {t.Log("sub2")})t.Run("sub3", func(t *testing.T) {t.Log("sub3")})
}

模糊测试

模糊测试方法名为func FuzzXXX(f *testing.F)

func FuzzReverse(f *testing.F) {// 为模糊测试添加用例到种子语料库testcases := []string{"Hello, world", " ", "!12345"}for _, tc := range testcases {f.Add(tc)  // Use f.Add to provide a seed corpus}// 进行模糊测试。对于string类型的参数,将生成随机字符串// 对于本测试中的Reverse方法是可逆的,因此可以通过两次逆行操作来验证其正确性f.Fuzz(func(t *testing.T, orig string) {rev := Reverse(orig)doubleRev := Reverse(rev)if orig != doubleRev {t.Errorf("Before: %q, after: %q", orig, doubleRev)}if utf8.ValidString(orig) && !utf8.ValidString(rev) {t.Errorf("Reverse produced invalid UTF-8 string %q", rev)}})
}

运行模糊测试有go testgo test -fuzz两种方式,前者仅会运行手动添加的用例,而后者则会随机生成数据

值得注意的是如果go test -fuzz执行之后存在运行错误的用例会添加到语料库文件中,那么即使下次执行的是go test也依然会执行语料库文件中的用例

Ref

  1. https://go.dev/doc/tutorial/fuzz
  2. https://books.studygolang.com/The-Golang-Standard-Library-by-Example/chapter09/09.0.html

相关文章:

golang testing使用

testing包服务于自动化测试 基本测试 Table Drvien Test 基于表的测试通过表形式进行测试每种情况的输入和期望输出&#xff0c;从而测试程序的正确性 func TestFib(t *testing.T) {var fibTests []struct {in int // inputexpected int // expected result}{{1, 1}…...

在Excel中使用正则提取单元格内容

在办公自动化的浪潮中&#xff0c;Excel 作为数据处理的利器&#xff0c;一直在不断进化。最近&#xff0c;我注意到了不坑盒子Office插件一个非常实用的功能更新——bk_regex_string 公式。这个功能对于我们这些日常需要处理大量文本和数据的办公人员来说&#xff0c;无疑是一…...

SQL查询语句(二)逻辑运算关键字

上一篇文章中我们提到了条件查询除了一些简单的数学符号之外&#xff0c;还有一些用于条件判断的关键字&#xff0c;如逻辑判断 关键字AND,OR,NOT和范围查找关键字BETWEEN,IN等&#xff1b;下面我们来介绍一些这些关键字的用法以及他们所表达的含义。 目录 逻辑运算关键字 AND…...

矿山机械自动化中的激光雷达技术探索

在矿山机械自动化技术的快速发展中&#xff0c;激光雷达技术作为其关键组成部分&#xff0c;正发挥着越来越重要的作用。本文将深入探讨激光雷达在矿山机械自动化中的应用&#xff0c;以及其所面临的挑战与未来发展趋势。 一、激光雷达在矿山机械自动化中的应用 激光雷达技术…...

MOSFET场效应管栅极驱动电流的计算

MOSFET驱动 MOSFET场效应管是电压驱动器件&#xff0c;输入有电容&#xff0c;因此为可靠驱动MOSFET&#xff0c;栅极需要施加较大的驱动电流。 功率MOSFET开关模型 该模型显示了影响开关性能的最重要的寄生器件。 栅极所需驱动电流计算公式 一个很重要的参数是计算栅极驱…...

Python 爬虫:Spring Boot 反爬虫的成功案例

前言 在当今数字化时代&#xff0c;网络数据成为了信息获取和分析的重要来源之一。然而&#xff0c;随着网络数据的广泛应用&#xff0c;爬虫技术也逐渐成为了互联网行业的热门话题。爬虫技术的应用不仅可以帮助企业获取有价值的信息&#xff0c;还可以用于数据分析、市场研究…...

计算机毕业设计Python+Vue.js天气预测系统 中国气象质量采集与可视化 天气数据分析 天气可视化 天气大数据 天气爬虫 大数据毕业设计

摘要 随着科技技术的不断发展&#xff0c;人民物质生活质量不断提高&#xff0c;我们越来越关注身边的气象、空气等地理环境。对于普通居民我们会选择合适的气象进行出游&#xff0c;提高精神层面的生活质量&#xff1b;对于企业会关注气象变换状况&#xff0c;来定制相关的生产…...

【busybox记录】【shell指令】tr

目录 内容来源&#xff1a; 【GUN】【tr】指令介绍 【busybox】【tr】指令介绍 【linux】【tr】指令介绍 使用示例&#xff1a; 转换字符 - 默认 转换字符 - 不翻译指定字符数组 此指令目前接触少&#xff0c;用得少&#xff0c;把精力放到其他常用指令上 常用组合指令…...

Mac虚拟机软件哪个好用 mac虚拟机parallels desktop有什么用 Mac装虚拟机的利与弊 mac装虚拟机对电脑有损害吗

随着多系统使用需求的升温&#xff0c;虚拟机的使用也变得越来越普遍。虚拟机可以用于创建各种不同的系统&#xff0c;并按照要求设定所需的系统环境。另外&#xff0c;虚拟机在Mac电脑的跨系统使用以及测试软件系统兼容性等领域应用也越来越广泛。 一、Mac系统和虚拟机的区别 …...

Type-C转音频(USB2.0数据传输)+PD充电芯片乐得瑞LDR6500/LDR6023

LDR6500 USB-C DRP 接口 USB PD 通信芯片概述 Type-C转音频(USB2.0数据传输)PD充电芯片乐得瑞LDR6500LDR6500是乐得瑞科技针对USB Type-C标准中的Bridge设备而开发的USB-C DRP&#xff08;Dual Role Port&#xff0c;双角色端口&#xff09;接口USB PD&#xff08;Power Deliv…...

【busybox记录】【shell指令】expand

目录 内容来源&#xff1a; 【GUN】【expand】指令介绍 【busybox】【expand】指令介绍 【linux】【expand】指令介绍 使用示例&#xff1a; 把制表符转化为空格 - 默认输出 把制表符转化为空格 - 修改制表符转空格的个数 把制表符转化为空格 - 修改制表符转空格的个数…...

软件测试—— 接口测试之通讯流程相关概念

通讯流程 1、协议 通讯规则 2、HTTP协议 协议的一种 3、接口规范文档 如何发请求的要求文档&#xff0c;获取什么响应内容的说明文档&#xff08;相当于菜单&#xff09;...

AT32 雅特力CAN详细使用说明配置细则

CAN 过滤器使用说明 CAN 过滤器相当于关卡&#xff0c;每当收到一条报文时&#xff0c;CAN 要先将收到的报文从这些过滤器上"过滤"一下&#xff0c;能通 过的报文是有效报文&#xff0c;收进相关联 FIFO&#xff08;FIFO0 或 FIFO1&#xff09;&#xff0c;不能通过的…...

【机器学习】集成方法---Boosting之AdaBoost

一、Boosting的介绍 1.1 集成学习的概念 1.1.1集成学习的定义 集成学习是一种通过组合多个学习器来完成学习任务的机器学习方法。它通过将多个单一模型&#xff08;也称为“基学习器”或“弱学习器”&#xff09;的输出结果进行集成&#xff0c;以获得比单一模型更好的泛化性…...

AI大模型探索之路-训练篇11:大语言模型Transformer库-Model组件实践

系列篇章&#x1f4a5; AI大模型探索之路-训练篇1&#xff1a;大语言模型微调基础认知 AI大模型探索之路-训练篇2&#xff1a;大语言模型预训练基础认知 AI大模型探索之路-训练篇3&#xff1a;大语言模型全景解读 AI大模型探索之路-训练篇4&#xff1a;大语言模型训练数据集概…...

鸿蒙内核源码分析(工作模式篇) | CPU的七种工作模式

本篇说清楚CPU的工作模式 工作模式(Working mode) 也叫操作模式&#xff08;Operating mode&#xff09;又叫处理器模式&#xff08;Processor mode&#xff09;&#xff0c;是 CPU 运行的重要参数&#xff0c;决定着处理器的工作方式&#xff0c;比如如何裁决特权级别和报告异…...

5月6(信息差)

&#x1f30d;一次预测多个token&#xff0c;Meta新模型推理加速3倍&#xff0c;编程任务提高17% https://hub.baai.ac.cn/view/36857 &#x1f384; LeetCode 周赛超越 80% 人类选手&#xff0c;推理性能超 Llama3-70B。 ✨ 我国量子计算机实现“四算合一” 实现通算、…...

Qt在任务栏图标和系统托盘图标上显示红点

在任务栏图标上显示红点 关键类&#xff1a;QWinTaskbarButton #include <QWinTaskbarButton>QPointer<QWinTaskbarButton> taskbarBtn nullptr; if (!taskbarBtn) {taskbarBtn new QWinTaskbarButton(window);taskbarBtn->setWindow(window->windowHand…...

springboot拦载器

1、拦载器 package com.Interceptor;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;import javax.security.auth.login.Log…...

知道创宇安全服务实习

自我介绍攻防演练讲一下&#xff0c;我讲到了内网利用&#xff0c;用到了frp/nps这种nps直接扫不会有被发现吗&#xff1f;cs搭建在vps&#xff0c;有做什么隐藏吗&#xff0c;&#xff08;端口或者cdn之类的&#xff09;域前置了解吗cs上传的木马免杀了吗问了linux怎么查看进程…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...