12.2 Go 编写测试代码

news2025/2/25 21:40:21

在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • Go 测试框架概述
      • 单元测试
        • 编写测试函数
        • 测试覆盖率
        • 测试并发
      • 基准测试
        • 编写基准测试
        • 运行基准测试
      • 示例测试
        • 使用示例作为测试
      • 高级测试技巧
        • Mock 对象
        • 数据驱动测试
        • 测试环境设置和清理
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
在软件开发过程中,编写高质量的测试代码是确保软件稳定性和可靠性的关键步骤。Go 语言以其简洁性和并发支持而广受欢迎,其内置的测试框架也提供了强大的工具来帮助开发者编写和执行测试。本文将深入探讨 Go 语言中编写测试代码的技巧,旨在帮助开发者提升测试的覆盖率和效率。

Go 测试框架概述

Go 的测试框架位于 testing 包中,它提供了一套简单的 API 来编写和执行测试。测试文件通常以 _test.go 为后缀,测试函数则以 Test 开头。Go 测试框架支持三种类型的测试:单元测试、基准测试和示例测试。

单元测试

单元测试是针对代码中最小可测试部分的测试。在 Go 中,单元测试通常关注于函数或方法的正确性。

编写测试函数

单元测试函数必须以 Test 开头,并且接受一个 *testing.T 类型的参数。testing.T 提供了一系列的方法来报告测试结果,例如 ErrorFail

func TestAdd(t *testing.T) {
    if add(2, 3) != 5 {
        t.Errorf("Add was incorrect, got: %d, want: %d.", add(2, 3), 5)
    }
}

测试覆盖率

提高测试覆盖率是提高软件质量的重要手段。Go 提供了 -cover 标志来生成测试覆盖率报告。

go test -cover

测试并发

Go 语言的并发特性使得编写并发测试变得尤为重要。使用 t.Parallel() 可以并行执行测试,这对于提高测试效率非常有帮助。

func TestConcurrentAdd(t *testing.T) {
    t.Parallel()
    var wg sync.WaitGroup
    for i := 0; i < 100; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            if add(2, 3) != 5 {
                t.Errorf("Add was incorrect.")
            }
        }()
    }
    wg.Wait()
}

基准测试

基准测试用于测量代码的性能。它通过重复执行代码片段来计算平均执行时间。

编写基准测试

基准测试函数以 Benchmark 开头,并且不接受任何参数。使用 b.N 来控制循环的次数。

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        add(2, 3)
    }
}

运行基准测试

使用 go test-bench 标志来运行基准测试。

go test -bench .

示例测试

示例测试用于验证代码示例的正确性。它允许将包中的示例代码直接作为测试运行。

使用示例作为测试

在 Go 文件中,以 Example 开头的代码块可以被 go test 命令执行。

func ExampleAdd() {
    fmt.Println("The sum is:", add(2, 3))
    // Output: The sum is: 5
}

高级测试技巧

Mock 对象

在测试中,有时需要模拟外部依赖或复杂对象。使用第三方库如 testify/mock 可以创建 Mock 对象。

数据驱动测试

数据驱动测试允许你使用不同的数据集来运行相同的测试逻辑。这可以通过传递参数给测试函数来实现。

func TestAddWithParams(t *testing.T) {
    tests := []struct {
        x, y, sum int
    }{
        {2, 3, 5},
        {5, 7, 12},
    }
    for _, tt := range tests {
        if got := add(tt.x, tt.y); got != tt.sum {
            t.Errorf("add(%d, %d) = %d; want %d", tt.x, tt.y, got, tt.sum)
        }
    }
}

测试环境设置和清理

使用 t.Cleanup 注册清理函数,确保测试结束后恢复到初始状态。

func TestDatabase(t *testing.T) {
    setup := setupDatabase()
    defer setup.Cleanup(t)
    // 测试逻辑
}

总结

编写测试代码是软件开发中不可或缺的一部分。Go 语言的测试框架提供了一套简单而强大的工具来帮助开发者编写有效的测试。通过掌握本文介绍的测试技巧,开发者可以进一步提升测试代码的质量和效率,从而提高软件的整体质量。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

web3技术的特点

Web1、Web2和Web3是互联网发展的三個阶段&#xff0c;它们在架构、数据所有权、应用模式等方面都有着本质的区别。需要注意的是&#xff0c;Web3 仍处于早期发展阶段&#xff0c;其技术和应用场景还在不断探索和完善。Web3 的最终形态和影响还有待观察。北京木奇移动技术有限公…

排序1---插入排序

目录 插入排序的基本思路&#xff1a; 插入排序的代码实现&#xff1a; 代码&#xff1a; 代码解读&#xff1a; 插入排序的时间、空间复杂度&#xff1a; 插入排序的基本思路&#xff1a; 插入排序是一个比较简单的排序。 我们插入排序就是我们先假设前面的一段区间有序…

【每天学会一个渗透测试工具】AWVS安装及使用指南

&#x1f31d;博客主页&#xff1a;泥菩萨 &#x1f496;专栏&#xff1a;Linux探索之旅 | 网络安全的神秘世界 | 专接本 | 每天学会一个渗透测试工具 ✨AWVS介绍 是应用漏洞扫描工具 &#x1f4a6;使用docker安装 docker pull dockermi3aka/awvs启动镜像 docker run -dit …

期货分仓软件的搭建流程

期货分仓软件的搭建流程&#xff0c;是一个涉及多个环节的复杂过程。首先&#xff0c;明确功能需求是至关重要的&#xff0c;这有助于更好地规划软件的开发和设计。接下来&#xff0c;技术选型是关键一步&#xff0c;需要根据开发经验和项目需求&#xff0c;选择适合的编程语言…

webpack处理样式资源04--webpack入门学习

处理样式资源 本章节学习使用 Webpack 如何处理 Css、Less、Sass、Scss、Styl 样式资源 介绍 Webpack 本身是不能识别样式资源的&#xff0c;所以我们需要借助 Loader 来帮助 Webpack 解析样式资源 我们找 Loader 都应该去官方文档中找到对应的 Loader&#xff0c;然后使用…

C# WPF入门学习主线篇(二十二)—— 样式(Styles)的定义和应用

C# WPF入门学习主线篇&#xff08;二十二&#xff09;—— 样式&#xff08;Styles&#xff09;的定义和应用 欢迎来到C# WPF入门学习系列的第二十二篇。本篇文章将详细介绍WPF中的样式&#xff08;Styles&#xff09;的定义和应用。样式在WPF中起到重要作用&#xff0c;通过样…

Hallo技术:革新电影、游戏与虚拟现实中的动态肖像动画

在数字娱乐的浪潮中&#xff0c;逼真的动态肖像动画成为了电影制作、游戏开发和虚拟现实等领域不可或缺的一部分。复旦大学研发的Hallo技术&#xff0c;以其独特的扩散模型和分层音频驱动视觉合成模块&#xff0c;为这一领域带来了革命性的突破。 技术概览 Hallo技术是一种基…

Nvidia芯片Jetson系列 系统烧录环境 搭建

一、序言 Jetson 系列产品烧录系统的方法一般有两种&#xff1a; 一种为使用 NVIDIA 官方提供 的 SDK manager 软件给 Jetson 设备烧录系统&#xff08;请查看说明文档《Jetson 产品使用 SDKmanager 烧录系统》&#xff09;。 另一种即为当前文档所描述的&#xff0c;在安装 Ub…

LVS+Keepalived高可用集群部署

一、高可用群集(HA)的作用 企业应用中&#xff0c;单台服务器承担应用存在单点故障的危险&#xff0c;单点故障一旦发生&#xff0c;企业服务将发生中断&#xff0c;造成极大的危害。 高可用集群是由一台主调度器和一台或多台备用调度器。在主调度器能够正常运转时&#xff0c;…

JVM 相关知识整理

文章目录 前言JVM 相关知识整理1. 新生代和老年代2. 对象的分配过程3. Full GC /Major GC 触发条件4. 逃逸分析4.1.示例4.2. 使用逃逸分析&#xff0c;编译器可以对代码做如下优化 5. 对象的内存分配6. Minor GC 与 Major GC/Full GC的比较:7. 什么对象进入老年代7.1. 大对象直…

【Tello无人机】使用Matlab完成控制器的设计—建模

模型辨识篇 在实际的无人机系统中&#xff0c;控制器的设计至关重要&#xff0c;它直接影响无人机的稳定性和响应能力。然而&#xff0c;要设计出高效、可靠的控制器&#xff0c;首先必须准确理解无人机的动态行为&#xff0c;这就需要通过收集输入输出数据来辨识其运动学模型。…

LabVIEW与Matlab联合编程的途径及比较

​ LabVIEW和Matlab联合编程可以通过多种途径实现&#xff0c;包括调用Matlab脚本节点、使用LabVIEW MathScript RT模块、利用ActiveX和COM接口&#xff0c;以及通过文件读写实现数据交换。每种方法都有其独特的优势和适用场景。本文将详细比较这些方法&#xff0c;帮助开发者…

【Kubernetes】集群学习

常见的 Kubernetes 集群类型 Kubernetes 集群可以根据不同的标准进行分类&#xff0c;但通常我们根据其部署环境和用途来区分集群类型。以下是几种常见的 Kubernetes 集群类型&#xff1a; 开发集群&#xff08;Development Cluster&#xff09;&#xff1a; 用于开发和测试环…

RAG优化技巧|7大挑战与解決方式|提高你的LLM能力

在当今快速发展的人工智能领域&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经成为无处不在的技术&#xff0c;它们不仅改变了我们与机器交流的方式&#xff0c;还在各行各业中发挥着革命性的影响。 然而&#xff0c;尽管LLM RAG的能力已经让人惊叹&#xff0c;但我…

分享一下,如何搭建个人网站的步骤

在这段充满探索与创造的奇妙旅途中&#xff0c;我就像一位耐心的建筑师&#xff0c;在数字世界的荒原上精心雕琢&#xff0c;两周的时光缓缓流淌。每天&#xff0c;我与代码共舞&#xff0c;手执HTML、CSS与JavaScript这三大构建魔杖&#xff0c;一砖一瓦地筑起了梦想中的网络城…

string类(C++)

文章目录 一.引言二.string类&#xff1a;成员函数&#xff1a;构造函数&#xff1a;析构函数 遍历&#xff1a;operator[]迭代器&#xff08;iterator&#xff09;范围for反向遍历(反向迭代器reverse_iterator)const迭代器 容器&#xff1a;capacity扩容clear清数据shrink_to_…

Azure数据分析Power BI

Azure数据分析Power BI 一、Power BI简介二、Power BI 如何匹配角色三、Power BI 构建基块四、使用 Power BI 服务一、Power BI简介 Microsoft Power BI 是一系列的软件服务、应用和连接器,这些软件服务、应用和连接器协同工作,将不相关的数据源转化为合乎逻辑、视觉上逼真的…

Web渗透:XSS-反射型存储型

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者将恶意脚本注入到网页中&#xff0c;其他用户在浏览这些页面时&#xff0c;可能会执行这些恶意脚本&#xff0c;从而导致各种安全问题&#xff0c;如…

关于STM32上用HID HOST调鼠标数据的解析

一、前言 关于这章主要是基于我前面的那篇文章 链接: 关于怎么用Cubemx生成的USBHID设备实现读取一体的鼠标键盘设备&#xff08;改进版&#xff09; https://blog.csdn.net/qq_29187987/article/details/139535648?spm1001.2014.3001.5501 引用的文章的简介 引用的这篇文…

【文末附gpt升级秘笈】AI音乐大模型崛起:版权归属与创意产业的新挑战

AI音乐大模型崛起&#xff1a;版权归属与创意产业的新挑战 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;已经深入到社会生活的各个领域&#xff0c;音乐领域也不例外。最近一个月&#xff0c;轮番上线的音乐大模型不仅为普通人打开了音乐创作的大门&…