15.2 测试-网格测试、基准测试与测试覆盖率

1. 网格测试

函数或方法的输出因收到的输入而异,如果为每个输入专门编写一个测试用例,将导致大量的重复代码。

不妨将输入的各种组合存放在网格之中,只编写一个测试用例即完成对所有输入的测试,比如象下面这样:

var greetingTests = []greetingTest{
        {"en-US", "George",   "Hello George!"},
        {"fr-FR", "Chloé",    "Bonjour Chloé!"},
        {"it-IT", "Giuseppe", "Ciao Giuseppe!"},
}

// 网格测试
// 源代码
// Package greeting return greeting
package greeting
func translate(locale string) string {switch locale {case "en-US":return "Hi "case "fr-FR":return "Bonjour "case "it-IT":return "Ciao "default:return "Hello "}
}
// Greeting return greeting
func Greeting(locale, name string) string {return translate(locale) + name + "!"
}
// 源代码对应的测试用例(测试输入为我们之前定义的网格)
// 函数或方法的输出因收到的输入而异,如果为每个输入专门编写一个测试用例,将导/// 致大量的重复代码。不妨将输入的各种组合存放在网格之中,只编写一个测试用例即
// 完成对所有输入的测试 
package greeting
import "testing"type greetingTest struct {locale   stringname     stringexpected string
}var greetingTests = []greetingTest{{"en-US", "George", "Hello George!"},	// 与源代码不一致,会失败{"fr-FR", "Chloé", "Bonjour Chloé!"},{"it-IT", "Giuseppe", "Ciao Giuseppe!"},
}func TestGreeting(t *testing.T) {for _, test := range greetingTests {actual := Greeting(test.locale, test.name)if actual != test.expected {t.Fatalf("Greeting(%q,%q)->%q, expected %q",test.locale, test.name, actual,test.expected)}}
}
// 打印输出:
greeting_test.go:29: Greeting("en-US","George")->"Hi George!", expected "Hello George!"

2. 基准测试

Go语言提供了功能强大的基准测试框架,利用该框架开发人员可以精确地获知,选择何种方式能使程序完成特定任务的性能最优。

基准测试函数的函数名以"Benchmark"开头,接受一个类型为B的参数。

  • func ByPlus(strs ...string) string { ... }
  • func BenchmarkByPlus(b *testing.B) { ... }

在测试函数内部,使用循环反复地调用被测试函数以建立基准。

  • for n := 0; n < b.N; n++ {
            ByPlus("Hello", " ", "World", "!")
    }
  • 循环的次数N无需指定,框架会自动设置它以获得可靠的数据集。(为了避免随机性,会执行N次求平均值来衡量性能)

基准测试结束后,会生成一个测试报告,指出每个被测函数的总调用次数(N)和单次调用的平均耗时(单位ns)。

  • BenchmarkByPlus-8        10000000        185 ns/op

在包目录下执行如下命令,启动基准测试:

  • go test -bench
// 基准测试(测试了3种字符串拼接方法的效率)
// Package joinstrs join strings
package joinstrs import ("bytes""strings"
)// ByPlus join strings by plus
func ByPlus(strs ...string) string {s := ""for _, str := range strs {s += str}return s
}// ByJoin join strings by join
func ByJoin(strs ...string) string {return strings.Join(strs, "")
}// ByBuff join strings by buffer
func ByBuff(strs ...string) string {b := bytes.Buffer{}for _, str := range strs {b.WriteString(str)}return b.String()
}

// 基准测试(测试了3种字符串拼接方法的效率)
// 基准测试关注代码的运行性能。基准测试 
// 函数的函数名必须以"Benchmark"开头
// 
// 执行如下命令,启动基准测试: 
// go test -bench .
package joinstrs
import "testing"func TestByPlus(t *testing.T) {// 使用了"testing包"小节所述的actual-expected模式actual, expected := ByPlus("Hello", " ", "World", "!"),"Hello World!"if actual != expected {t.Fatalf("Actual %q, expected %q",actual, expected)}
}
func TestByJoin(t *testing.T) {actual, expected := ByJoin("Hello", " ", "World", "!"),"Hello World!"if actual != expected {t.Fatalf("Actual %q, expected %q",actual, expected)}
}
func TestByBuff(t *testing.T) {actual, expected := ByBuff("Hello", " ", "World", "!"),"Hello World!"if actual != expected {t.Fatalf("Actual %q, expected %q",actual, expected)}
}
func BenchmarkByPlus(b *testing.B) { // 基准测试for n := 0; n < b.N; n++ {ByPlus("Hello", " ", "World", "!")}
}func BenchmarkByJoin(b *testing.B) {// 基准测试for n := 0; n < b.N; n++ {ByJoin("Hello", " ", "World", "!")}
}func BenchmarkByBuff(b *testing.B) {// 基准测试for n := 0; n < b.N; n++ {ByBuff("Hello", " ", "World", "!")}
}
// 打印输出:goos: windowsgoarch: amd64pkg: test/benchmarkBenchmarkByPlus-8 10000000 185 ns/opBenchmarkByJoin-8 20000000 103 ns/op//字符串拼接strings.Join()是最高效的BenchmarkByBuff-8 10000000 161 ns/opPASSok       test/benchmark       6.479s

3.测试覆盖率

测试覆盖率指被测试执行的代码总代码百分比。

  • 单元测试通过,说明功能正确
  • 基准测试效果也不错,说明性能可以接受
  • 这并不表示被测软件经受住了考验,因为有些代码可能根本就没有被执行到

在包目录下执行如下命令,计算测试覆盖率:

  • go test -cover
  • 其是针对某一包目录下的所有go源文件中的func进行计算的
// 测试覆盖率指被测试执行的代码占总代码的百分比
// 
// 执行如下命令,启动测试并输出覆盖率: 
// go test -cover
package greetingimport "testing"func TestGreeting(t *testing.T) {actual, expected := Greeting("World"),"Hello World!"if actual != expected {t.Fatalf("Actual %q, expected %q",actual, expected)}
}
// Package greeting return greeting
package greeting// Greeting return greeting
func Greeting(s string) string {return "Hello " + s + "!"
}// Farewell return farewell
func Farewell(s string) string {return "Goodbye " + s + "!"
}
// 打印输出:
PASS
coverage: 50.0% of statements
ok test/coverage 0.447s 

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

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

相关文章

大模型卷出新高度|暴雨AI服务器M8878助解算力之困

当今世界&#xff0c;作为新一轮科技革命和产业革命的重要驱动力&#xff0c;AI已经成为“兵家必争之地”。我国也在政府报告中首次将“人工智能”行动纳入国家战略&#xff0c;开启了以人工智能为核心的数字经济高质量发展的新时代。 当今世界&#xff0c;作为新一轮科技革命…

盘点:中国智能物流装备头部企业的“业务地盘”,谁还不为自己护食?

导语 大家好&#xff0c;我是社长&#xff0c;老K。专注分享智能制造和智能仓储物流等内容。 随着中国市场对智能物流装备需求的不断增长&#xff0c;各大物流装备企业纷纷加大投入&#xff0c;拓展业务&#xff0c;形成各自的重点业务行业。以下是几家主要企业在智能物流装备领…

AI 正在攻克难题——赋予计算机嗅觉

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Nginx GeoIP 使用指南-宝塔识别ip屏蔽地区

Nginx 的 GeoIP 模块允许根据访问者的 IP 地址识别其地理位置,并根据地理位置执行特定操作。本文档将详细展示如何配置和使用 Nginx 的 GeoIP 模块,包括基本配置、访问控制、基于地理位置的重定向等。 1. 安装 GeoIP 模块 首先,需要确保 Nginx 安装了 GeoIP 模块。如果未安…

VUE3 学习笔记(13):VUE3 下的Element-Plus基本使用

UI是页面的门面&#xff0c;一个好的UI自然令人赏心悦目&#xff1b;国人团队开发的ElementUI在众多UI中较为常见&#xff0c;因此通过介绍它的使用让大家更好的了解第三方UI的使用。 安装 Npm install element-plus --save 或 Cnpm install element-plus --save 配置 全局配置…

Windows CMD对MySQL进行基本操作的常用命令

目录 前言1. 数据库操作2. 表操作3. 记录操作4. 备份与恢复数据库 前言 对于基本的命令行以及优化推荐阅读&#xff1a; 数据库中增删改常用语法语句&#xff08;全&#xff09;Mysql优化高级篇&#xff08;全&#xff09;命令行登录Mysql的详细讲解 启动MySQL服务&#xff1…

多线程知识-13

为什么应该在循环中检查等待条件 为了实现多线程的同步和协调&#xff0c;通常使用等待和唤醒机制。在等待和唤醒机制中&#xff0c;等待条件是指一个线程等待某个条件的满足&#xff0c;当条件满足时&#xff0c;线程被唤醒继续执行。 在循环中检查等待条件的目的是为了避免虚…

关于nginx的配置参数

关于nginx的配置参数 nginx参考配置参数 #宝塔服务器PHP项目配置文件 server {listen 80;server_name 服务器公网地址;index index.php index.html index.htm default.php default.htm default.html;root /root/peopledata/front/dist/;#CERT-APPLY-CHECK--START# 用于SSL证书…

Binary Ninja 4.0.5336 (macOS, Linux, Windows) - 逆向平台

Binary Ninja 4.0.5336 (macOS, Linux, Windows) - 逆向平台 请访问原文链接&#xff1a;https://sysin.org/blog/binary-ninja/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Binary Ninja A New Type of Reversing Platfo…

【TB作品】msp430g2553单片机,智能台灯,依据亮度调节小灯亮度,IIC oled,PWM亮度

功能 msp430g2553单片机&#xff0c;读取gy-30的光照强度&#xff0c;oled显示光照强度&#xff0c;依据光照强度调节小灯亮度。 硬件 gy-30 0.96寸 iic oled //gy-30 //SCL--P1.4 //SDA--P1.5 //VCC--3.3V //GND--GND //ADDR--GND//oled //SCL--P2.0 //SDA--P2.1 //VCC--…

MATLAB算法实战应用案例精讲-【数模应用】内容效度(附R语言代码实现)

目录 前言 几个高频面试题目 不同类型的效度对比 一、效度定义 二、结构效度 三、结构效度延伸

如何零基础自学软件测试

自学软件测试需要掌握以下技能&#xff1a; 一、基础技能 掌握编程语言&#xff1a;软件测试的基础是编程&#xff0c;因此需要掌握至少一种编程语言&#xff0c;如Python、Java等。这是测试用例编写、自动化脚本编写、测试报告编写等的基础。了解测试理论&#xff1a;包括软…

Nginx--安装SSL证书(支持https)的方法

原文网址&#xff1a;Nginx--安装SSL证书(支持https)的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Nginx如何安装SSL证书。 1.上传证书 1.在Nginx的配置文件目录下创建存放证书的目录 cd /etc/nginx/ #进入Nginx默认配置文件目录。请根据实际配置调整。 mkdir cert #…

机器学习算法 —— 逻辑回归

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 逻辑回归逻辑回归的介绍逻辑回归的优点逻辑回归的缺点逻辑回归的应用 实践演示库函数导入模型训练模型参数查看数据和模型可视化模型预测 …

11_JavaWeb监听器

文章目录 监听器1.监听器的分类2.application域监听器案例 监听器 概念&#xff1a;后端要发生一些事情的时候&#xff0c;自动触发一些代码的执行&#xff1b; 1.监听器的分类 web中定义八个监听器接口作为监听器的规范,这八个接口按照不同的标准可以形成不同的分类 按监听的…

下载ubuntu22.04

建议使用&#xff1a;清华源镜像 官网下载比较慢Ubuntu 22.04.4 LTS (Jammy Jellyfish) 打开清华源向下翻 然后找到22.04 下载完成&#xff1a;

C++的线性回归模型

线性回归模型是数理统计中的一种回归分析方法&#xff0c;其核心思想是通过建立一个线性方程来描述因变量与自变量之间的关系。这种关系可以表示为y wx e&#xff0c;其中y是因变量&#xff0c;x是自变量&#xff0c;w是回归系数向量&#xff0c;e是误差项&#xff0c;服从均…

28份 | FCIS 2023网络安全创新大会(公开)PPT分享

1、AIGC安全审计框架初探 2、AI领航&#xff0c;提效网络安全运营新未来 3、AI时代大模型安全分析 4、AI在企业内部的机遇与挑战 5、从0开始设计webshell管理工具 6、从实战看红队进攻技巧 7、移动终端软件供应链安全治理探讨 8、大模型时代下蓝军攻防实践 9、多视角下…

如何微调出自己的大模型——LoRA原理解析

1、前言 上一篇文章&#xff0c;我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型&#xff0c;参数量及其之大。你没有足够的算力资源&#xff0c;就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型&#xff0c;那我们就想&#xff0c;是…

RocketMQ教程(一):RocketMQ的基本概念

RocketMQ是什么&#xff1f; RocketMQ 是一个分布式消息中间件和流计算平台&#xff0c;由阿里巴巴团队开源并贡献给 Apache 软件基金会&#xff0c;现为 Apache 顶级项目。它主要用于处理大规模数据的传输问题&#xff0c;支持高吞吐量、高可用性和可扩展性的消息发布和订阅服…