非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.2 基准测试 15.5.3 覆盖率测试

news2024/11/15 21:25:00

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第15章 Go命令行工具
        • 15.5 代码测试(test)
          • 15.5.2 基准测试
          • 15.5.3 覆盖率测试

第15章 Go命令行工具

15.5 代码测试(test)

15.5.2 基准测试

基准测试提供可自定义的计时器和一套基准测试算法,能方便快速地分析一段代码可能存在的CPU性能和内存分配问题。

类似于单元测试,使用者无须准备高精度的计时器和各种分析工具,基准测试本身即可打印出非常标准的测试报告。

基准测试的使用也有一套书写规范,使用“Benchmark”为前缀,后面加上需要测试的函数名,并使用*testing.B作为函数参数,如下所示。

func BenchmarkFunc(b *testing.B) {
 	b.ResetTimer()
 	for idx := 0; idx < b.N; idx++ {
 		// 要测试的代码
 	}
 	b.StopTimer()
}

有些测试代码需要一定的初始化时间,如果从Benchmark()函数开始计时,很大程度上会影响测试结果的精准性。

testing.B提供了可以方便地控制计时器的一系列方法,从而让计时器只在需要的区间进行测试。ResetTimer()表示重置计时器,StopTimer()表示停止计时,需要精准测试的代码只需要放到这两个函数中间即可。

其中b.N表示必须循环b.N次,b.N这个数字会在运行中调整,以便最终达到合适的时间消耗,方便计算出合理的数据。

通过基准测试,我们能够知道使用哪种编码方式会让程序的运行效率最高。

举个例子,针对字符串拼接这个场景,有非常多的实现方式,比如使用标准库中的fmt.Sprintf、使用字符串连接符“+”直接相加、使用BytesBuf方式等。

想要知道哪种方式才是性能最优的选择,可以用基准测试来判断。

[动手写 15.5.3]

package main

import (
	"bytes"
	"fmt"
	"strconv"
	"strings"
	"testing"
)

const Num = 10000

func BenchmarkSprintf(b *testing.B) {

	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {
		var str string
		for i := 0; i < Num; i++ {
			str = fmt.Sprintf("%s%d", str, i)
		}
	}

	b.StopTimer()
}

func BenchmarkStringBuilder(b *testing.B) {

	b.ResetTimer()
	for idx := 0; idx < b.N; idx ++ {

		var builder strings.Builder
		for i := 0; i < Num; i++ {
			builder.WriteString(strconv.Itoa(i))
		}

		_ = builder.String()
	}

	b.StopTimer()
}

func BenchmarkBytesBuf(b *testing.B) {

	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {

		var buf bytes.Buffer
		for i := 0; i < Num; i++ {
			buf.WriteString(strconv.Itoa(i))
		}
		_ = buf.String()
	}

	b.StopTimer()
}

func BenchmarkStringAdd(b *testing.B) {

	b.ResetTimer()
	for idx := 0; idx < b.N; idx++ {

		var str string
		for i := 0; i < Num; i++ {

			str += strconv.Itoa(i)
		}
	}
	b.StopTimer()
}

在这里插入图片描述

动手写15.5.3分别针对几种不同的字符串连接方式进行基准测试,使用for循环连接10000个数字。

运行go test -bench=.就可以获取结果。

在这里插入图片描述

OK,改一下

在这里插入图片描述

注意 -bench=. 这几个全挨着写,别想当然的打空格,亲测

可以发现,使用StringBuilder和BytesBuf这两种字符串连接的效率最优,而使用Sprintf连接的效率最差。

15.5.3 覆盖率测试

覆盖率测试用于统计通过运行程序包的测试有多少代码得到了执行。如果执行测试代码有70%的语句得到了运行,则测试覆盖率为70%。

使用-cover参数就可以对源码文件进行覆盖率测试。

go test -cover xxx.go

例如,我们有如下Level函数需要进行测试,Level函数根据不同的分数进行不同的评级。

[ 动手写15.5.4]

package main

func Level(point int) string {
   switch {
   case point < 60:
      return "不及格"
   case point < 70:
      return "及格"
   case point < 80:
      return "良"
   case point < 100:
      return "优秀"
   default:
      return "数据出错"
   }
}

针对动手写15.5.4,我们编写如下测试代码,分别测试分数为20、65、75时,程序是否运行正确。

func TestLevel(t *testing.T) {

   input := []int{20, 65, 75}
   expected := []string{"不及格", "及格", "良好"}

   for i := 0; i < len(input); i++ {

      ret := Level(input[i])
      if ret != expected[i] {
         t.Errorf("input is %d , the expected is %s , the actual %s", input[i], expected[i], ret)
      }
   }
}

动手写15.5.5中,由于只测试了“不及格”“及格”“良”这三种情况的数据,而“优秀”和“数据出错”这两种情况未测试到,因此覆盖率约为66%。运行结果如下:

在这里插入图片描述

没毛病,测试覆盖率 和我们预计的 一样

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108216.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

P5 PyTorch 常用数学运算

前言&#xff1a; 这里主要介绍一下PyTorch 的常用数学运算 目录&#xff1a; 1&#xff1a; add|sub 加减法 2: mul/div 乘/除运算 3: 矩阵乘法 4 2D矩阵转置 5 其它常用数学运算 6 clamp 梯度剪裁 一 加减法 1.1 加法 可以直接通过符号 或者 torch.add # -*- co…

并发编程学习(五):设计模式~同步模式之保护性暂停

1、保护性暂停 模式的定义 保护性暂停 即Guarded Suspension&#xff0c;用于在一个线程等待另一个线程的执行结果。 要点&#xff1a; 有一个结果需要从一个线程传递到另一个线程&#xff0c;让它们关联同一个对象GuardedObject。如果有结果不断从一个线程到另一个线程&…

Redis架构演变之主从、Sentinel哨兵、Cluster(通信、分片、路由等机制)

一. 主从复制 1. 含义 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会把数据复制多个副本到其它机器&#xff0c;满足故障恢复和负载均衡等要求&#xff0c;Redis也是如此&#xff0c;提供了主从复制功能。&#xff08;redis第一代架构&#xff09; 实质&…

程序员35岁就失业了吗?就没有其他路可以选了吗?

前言 回到老家最近感到很迷茫&#xff0c;不知道该做什么&#xff0c;也不知道学习了更多的技术又能干什么。 有句话确实是很符合我现在的处境&#xff1a;时势造英雄&#xff01;虽然我不是英雄&#xff0c;但是我确实需要一个鞥一展所长的环境。 记得当初决定回到哈尔滨&a…

【大话设计模式】工厂+策略+装饰模式 hw01

背景 小李已经是一个工作一年的初级工程师了&#xff0c;他所在的公司是一家大型购物商场。随着各种网络购物软件兴起&#xff0c;老板也想做一个商场的购物 APP。分给小李的是一个一个订单结算模块&#xff0c;需要支持各种不同的结算策略。 需求 请帮小李写一个订单结算模…

vm2 <3.9.10 存在任意代码执行漏洞

漏洞描述 vm2 是一个基于 Node.js 的沙箱环境&#xff0c;可以使用列入白名单的 Node 内置模块运行不受信任的代码。 vm2 3.9.10之前版本中由于 WeakMap.prototype.set 方法使用原型查找从而存在任意代码执行漏洞&#xff0c;攻击者可利用此漏洞在沙箱内执行任意恶意代码&…

盲盒抽奖流程

盲盒模块的流程大致如下&#xff1a; 进入盲盒抽奖页面&#xff0c;需要初始化直接获取一些盲盒的信息&#xff0c;例如&#xff1a;盲盒活动id&#xff0c;开奖buff等。首先需要获取盲盒活动id&#xff0c;后面的所有请求都是基于盲盒活动id进行的。 初始化获取: 盲盒活动id…

Thymeleaf 下拉列表传值示例

参考资料 Spring Boot で Thymeleaf 使い方メモ 目录一. 前期准备二. 实体类.内部类设置下拉列表值2.1 form实体类2.2 Controller层2.3 Thymeleaf页面三. request.setAttribute()设置下拉列表值3.1 定义下拉列表存放类3.2 Controller层3.3 Thymeleaf页面一. 前期准备 枚举类 …

FT2232作为JTAG烧录器的使用步骤详解

FT2232作为JTAG烧录器的使用步骤详解FT2232作为JTAG烧录器的使用步骤详解配置OpenOCD环境(已经配置好的可以跳过)【步骤 1】安装 FT2232HL 芯片的驱动&#xff0c;安装文件为 CDM21228_Setup.exe。【步骤 2】 安装 FT_Prog_v3.6.88.402 Installer.exe【步骤 3】 使用 FT Prog 软…

模型实战一之YOLOv7实例分割、模型寻来自己数据集

模型实战一之YOLOv7实例分割、模型训练自己数据集 1.环境准备 下载yolov7实例分割模型&#xff1a; git clone https://github.com/WongKinYiu/yolov7.git -b mask yolov7-maskcd yolov7-mask安装环境 #查看已安装环境 conda info --envs #查看安装了哪些包 conda list#创建…

神奇的线性表(链表)

目录 神马是链表 链表的分类 单向链表 链表的常用操作 查找操作 插入操作 删除操作 链表与数组 数组的插入 数组的删除 链表的应用 尾声 神马是链表 记得很久很久以前…我们学习过数组&#xff0c; 数组是在内存中一段连续的存储空间&#xff0c; 可以在常数时间内访…

逻辑分析仪解析SPI数据

工具为梦源逻辑分析仪&#xff0c;本次测试的是ST7789v屏幕驱动 接线方面一共需要三根线&#xff08;MOSI&#xff0c;SCL&#xff0c;GND&#xff09; SCL PA5 MOSI PA7 DSView上位机配置 通道按照接线选择&#xff0c;这个一定要对应上 COPL CPOH按照SPI实际配置来&#x…

生成模型(四):扩散模型(Diffusion Models)

本文大纲如下&#xff1a; 生成模型种类 到目前为止&#xff0c;我已经写了三种类型的生成模型&#xff0c;[[生成模型-GAN]]、[[生成模型-VAE]]和[[生成模型-Flow based model]]。 它们在生成高质量样本方面显示出巨大的成功&#xff0c;但每一种都有其自身的一些局限性。下…

基于Python的GUI图形用户界面编程

【无限嚣张&#xff08;菜菜&#xff09;】&#xff1a;hello您好&#xff0c;我是菜菜&#xff0c;很高兴您能来访我的博客&#xff0c;我是一名爱好编程学习研究的菜菜&#xff0c;每天分享自己的学习&#xff0c;想法&#xff0c;博客来源与自己的学习项目以及编程中遇到问题…

非零基础自学Golang 第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求

非零基础自学Golang 文章目录非零基础自学Golang第17章 HTTP编程(上)17.2 HTTP客户端17.2.4 发起POST请求第17章 HTTP编程(上) 17.2 HTTP客户端 17.2.4 发起POST请求 在上一小节我们使用了http.NewRequest来创建一个请求&#xff0c;http.NewRequest有三个参数&#xff0c;第…

web前端-javascript-String字符串的相关方法

文章目录字符串的相关方法1. 底层字符串保存2. 方法1) length 属性 获取长度2) charAt() 获取指定字符3) chartCodeAt() 获取指定字符编码4) String.formCharCode() 根据编码获取字符5) concat() 连接字符串6) indexOf() 是否含有指定内容7) lastIndexOf() 是否含有指定内容8) …

哈斯机床联网

一、设备信息确认 1、确认型号 哈斯的数控面板共有两种情况。 老版本&#xff1a; 新版本&#xff1a; 注&#xff1a;老版本通讯为串口&#xff0c;新版本通讯为网口。 2、确认通讯接口 1、数控面板的后面 老版本的串口一般都会引出在正后面的左侧位置&#xff0c;上面有…

结构型模式之代理模式(八)

常说的设计模式是23种设计模式&#xff0c;分为3大类&#xff1a; 创建型模式5种&#xff1a;工厂方法、抽象工厂、单例、建造者、原型结构型模式7种&#xff1a;适配器、代理、桥接、装饰者、外观、享元、组合行为型模式11种&#xff1a;模板方法、解释器、策略、观察者、迭代…

非零基础自学Golang 第15章 Go命令行工具 15.5 代码测试(test) 15.5.1 单元测试

非零基础自学Golang 文章目录非零基础自学Golang第15章 Go命令行工具15.5 代码测试(test)15.5.1 单元测试第15章 Go命令行工具 15.5 代码测试(test) go test命令用于对Go语言编写的代码包进行测试。 可以指定要测试的文件&#xff0c;也可以直接对整个包进行测试&#xff0c…

[Java实战]Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]

Squaretest单元测试生成利器...一天生成所有简单单元测试...[新手开箱可用]1.Squaretest是什么?2.如何配合JUnit使用...?3.生成的java文件长啥样?4.如何生成和使用?5.如何用生成的XXXTest.java文件进行单元测试...6.观察结果7.单元测试成功8.源码地址为了好好写单元测试,提…