Go测试学习

news2024/9/28 21:21:07

前言: \textcolor{Green}{前言:} 前言:

💞这个专栏就专门来记录一下寒假参加的第五期字节跳动训练营
💞从这个专栏里面可以迅速获得Go的知识

Go测试学习

    • 03 测试
      • 3.1 单元测试
        • 3.1.1 单元测试 - 规则
        • 3.1.2 单元测试 - 例子
        • 3.1.3 单元测试 - 运行
        • 3.1.4 单元测试 - assert
        • 3.1.5 单元测试 - 覆盖率
        • 3.1.5 单元测试 - Tips
      • 3.2 单元测试 - 依赖
      • 3.3 单元测试 - 文件处理
      • 3.4 单元测试 - Mock
      • 3.5 基准测试
        • 3.5.1 基准测试 - 例子
        • 3.5.2 基准测试 - 运行
        • 3.5.3 基准测试 - 优化

今天的学习是测试:从单元测试实践出发,提升质量意识.这是对之前内容的回顾学习,通过回顾之前的内容来提升自己。

在开发过程中测试是非常重要的。先来了解一下测试的重要性:

1、通过软件测试确保软件的质量。

2、给开发人员提供信息,以方便其为风险评估做相应的准备。

3、软件测试贯穿在整个软件开发的过程中,保证整个软件开发的过程高质量。

4、通过软件测试发现软件的错误、有效定义和实现软件成分由低层到高层的组装过程。

5、通过软件测试验证软件是否满足任务书和系统定义文档所规定的技术要求。

6、软件测试为软件质量模型的建立提供依据。

通过测试的重要性今天就来学习一下测试

03 测试

这一讲主要有go 测试相关的内容,包括单元测试规范、测试 mock、基准测试。

测试关系着系统的质量,质量决定线上系统的稳定性,一旦发现 bug,就会造成事故。

事故有:

  1. 营销配置错误,导致非预期用户享受权益,资金损失10W+
  2. 用户提现,幂等失效,短时间可以多次提现,资金损失20w+(关于幂等问题可以去查一下)
  3. 代码逻辑错误,广告位被占,无法出广告,收入损失500w+
  4. 代码指针使用错误,导致APP不可用,损失上kw+

1673869929603.png

测试是避免事故的最后一道屏障

image.png

测试分为:回归测试是QA手动通过终端回归一些固定的主流程场景;集成测试是对系统功能维度做测试验证;单元测试是测试开发阶段,开发者对单独的函数、模块做功能验证;
层级从上到下,测试成本逐渐减低,测试覆盖率逐步上升,所以单元测试的覆盖率一定程度上决定着代码的质量。

3.1 单元测试

image.png

单元测试主要包括,输入->测试单元->输出->校对。

单元的概念比较广:包括接口、函数、模块等;用最后的校对来保证代码的功能与我们的预期相符;单侧一方面可以保证质量,在整体覆盖率足够的情况下,一定程度上既保证了新功能本身的正确性,又未破坏原有代码的正确性。其次可以提升效率,在代码有bug的情况下,通过编写单元测试,可以在一个较短周期内定位和修复问题。

3.1.1 单元测试 - 规则

image.png

这样从文件上就可以区分源码和测试代码,以 Test 开头,且连接的第一个字母大写。

3.1.2 单元测试 - 例子

func HelloTom() string {
    return "Jerry"
}
func TestHelloTom(t *testing.T) {
    output := HelloTom()
    expectOutput := "Tom"
    if output ≠ expectOutput {
        t.Errorf("Expected %s do not match actual %s", expectOutput, output)
    }
}

3.1.3 单元测试 - 运行

image.png

3.1.4 单元测试 - assert

func HelloTom() string {
    return "Tom"
}

import (
    "github.com/stretchr/testify/assert"
    "test"
)

func TestHelloTom(t *testing.T) {
    output := HelloTom()
    expectOutput := "Tom"
    assert.Equal(t, expectOutput, output)
}

使用assert 注意需要importgithub.com/stretchr/testify/assert

3.1.5 单元测试 - 覆盖率

  • 如何衡量代码是否经过了足够的测试?
  • 如何评价项目的测试水准?
  • 如何评估项目是否达到了高水准测试等级?

这就需要 代码覆盖率 来去解决上述的问题

例子

这是一个判断是否及格的函数,超过 60 分,返回 true,否则返回 false。
右边是对输入为 70 的单元测试,通过执行右边的单测,通过指定的 cover 参数,可以看到覆盖率。
image.png

因为没有经过 false 这一行,所以仅仅是 2/3。

接下来提升覆盖率,增加一个不及格的测试 case。重新执行所有的单测,最终得到覆盖率为 100%。

image.png

3.1.5 单元测试 - Tips

在实际项目中:

  • 一般覆盖率:50%~60%,较高覆盖率 80%+
  • 测试分支相互独立、全面覆盖。
  • 测试单元粒度足够小,函数单一职责。

3.2 单元测试 - 依赖

image.png

工程中复杂的项目,一般会依赖数据库、本地文件等强依赖,而我们的单测需要保证稳定性和幂等性,稳定是指相互隔离,能在任何时间,任何环境,运行测试。幂等是指每一次测试运行都应该产生与之前一样的结果,而要实现这一目的就要用用到 mock 机制。

3.3 单元测试 - 文件处理

替换文件中第一行字符串中的 11,将其换为 00。测试通过,会发现 单测需要依赖本地的文件,如果文件被修改或者删除就会 fail。为了保证测试 case的稳定性,需要对读取文件函数进行 mock,从而屏蔽对文件的依赖。

image.png

3.4 单元测试 - Mock

monkey

image.png

monkey 是一个开源的 mock 测试库,可以对 method 或者实例的方法进行 mock。
反射指的是指针赋值。
Mockey Patch 的作用域在 Runtime,在运行时通过 Go 的 unsafe 包,能够将内存中函数的地址替换为运行时函数的地址。

下面是一个 mock 的使用样例, 通过 patch 对 Readfineline 进行打桩 mock,默认返回 line110,通过 defer 卸载 mock,这样整个测试函数就需要本地文件的束缚和依赖。

image.png

对 ReadFirstLine 打桩测试,不再依赖本地文件

3.5 基准测试

  • 优化代码,需要对当前代码分析
  • 内置的测试框架提供了基准测试的能力

go 语言提供了基准测试框架,基准测试是指测试一段程序的运行性能以及耗费CPU 的程度,而我们在实际项目开发中,经常会遇到代码性能瓶颈,为了定位问题经常要对代码进行性能分析,这就用到了基准测试。使用方法类似于单元测试。

3.5.1 基准测试 - 例子

下面是 服务器负载均衡的例子,首先有10个服务器列表,每次随机执行 select 函数随机选择一个执行。

import (
    "math/rand"
)

var ServerIndex [10]int

func InitServerIndex() {
    for i := 0; i < 10; i++ {
        ServerIndex[i] = i + 100
    }
}

func Select() int {
    return ServerIndex[rand.Intn(10)]
}

10个服务器随机选择一个服务器执行。对其进行一个基准测试

3.5.2 基准测试 - 运行

基准测试 以 Benchmark 开头,入参 试 testing.B,用 b 中的 N 值反复递增循环测试。
(对于一个测试用例的默认测试时间为1s,当测试用例函数返回时还不到1s,那么testing.B中的N值将按1、2、5、10、20、50…递增,并以递增后的值重新进行用例函数测试)

image.png

Resetimer重置计时器,再 reset之前做了int或其他的准备工作,这些不作为基准测试的范围;RunParallel 是多协程并发测试;执行两个基准测试,发现代码在并发情况下存在劣化,主要原因是 rand 为了保证全局随机性和并发安全,持有了一把全局锁

3.5.3 基准测试 - 优化

为了解决随机性能问题,开源一个高性能随机数方法 fastrand。开源地址 再次进行基准测试,发现性能会提升百倍为什么?这是因为牺牲了一定的数列一致性。

image.png

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

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

相关文章

【Spring Boot 初识丨八 丨 外部化配置(二)】外部应用程序属性

上一篇讲了 Spring Boot 的外部化配置的加载顺序及一些简单的属性说明 本篇来讲一讲 外部化配置一些比较重要的部分 Spring Boot 初识&#xff1a; 【Spring Boot 初识丨一】入门实战 【Spring Boot 初识丨二】maven 【Spring Boot 初识丨三】starter 【Spring Boot 初识丨四】…

SortShuffleManager的bypass机制触发条件是什么?

SortShuffleManager的运行机制主要分成两种&#xff0c;一种是普通运行机制&#xff0c;另一种是bypass运行机制。当shuffle write。 task的数量小于等于spark.shuffle.sort.bypassMergeThreshold参数的值时(默认为200)&#xff0c;就会启用bypass机制。 该模式下&#xff0c…

置信区间笔记1 模型性能的置信区间

目录 补充实验-TCASVM置信区间 成功运行代码 误差棒图 置信区间与泛化性的关系 置信区间的计算公式 分类精度的置信区间 F1的置信区间 误差棒图 show confidence intervals for the prediction accuracy 补充实验-TCASVM置信区间 AUC的置信区间参考: https://blog.c…

加密接口如何测试?

随着互联网技术的发展&#xff0c;服务安全性和数据安全性变的越来越重要&#xff0c;提供接口服务的系统往往会应用各种加密技术&#xff0c;保证接口的安全调用&#xff0c;如何应用工具来实现加密接口测试成为一项必要技能。在讲解如何用Jmeter实现接口安全性测试之前&#…

【论文阅读】AugGPT: Leveraging XXX for Text Data Augmentation(AugGPT:利用XXX进行文本数据增强)

文章目录 一.论文信息二.论文内容摘要2.相关工作2.1.数据增强 4.方法4.1.整体框架4.4.Baseline方法4.6.评价指标4.6.1.余弦相似度4.6.2.TransRate 6.总结和讨论 一.论文信息 论文题目&#xff1a; AugGPT: Leveraging XXX Transformer for Text Data Augmentation&#xff08;…

RocketMQ --- 高级篇

一、高级功能 1.1、消息存储 分布式队列因为有高可靠性的要求&#xff0c;所以数据要进行持久化存储。 消息生成者发送消息MQ收到消息&#xff0c;将消息进行持久化&#xff0c;在存储中新增一条记录返回ACK给生产者MQ push 消息给对应的消费者&#xff0c;然后等待消费者返回…

HR谈薪之前,先要工资流水,礼貌吗?

hr谈薪前先要工资流水&#xff0c;这种做法礼貌吗&#xff1f;如果是你&#xff0c;你会给吗&#xff1f; 一部分网友认为可以不给&#xff0c;因为薪水是自己的隐私&#xff0c;跟求职无关&#xff0c;不需要告诉hr。 有人说&#xff0c;公司都双标&#xff0c;让你对工资保密…

LLM - 搭建 ProteinGPT 结合蛋白质结构知识的 ChatGPT 系统

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131403263 论文&#xff1a;ProteinChat: Towards Enabling ChatGPT-Like Capabilities on Protein 3D Structures 工程&#xff1a;ht…

高速电路设计系列分享-电源噪声分析

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 当今许多应用都要求高速采样模数转换器&#xff08;ADC)具有12位或以上的分辨率&#xff0c;以便用户能够进行更精确的系统测量。然而&#xff0c;更高分辨率…

高速电路设计系列分享-低频和高频接地

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; 在大多数电子系统中&#xff0c;降噪是一个重要设计问题。与功耗限制、环境温度变化、尺寸限制以及速度和精度要求一样.必须处理好无所不在的噪声因素&#…

【SQL】查询数据库每张表的数据及索引占用大小

【SQL】查询数据库每张表的数据及索引占用大小 SELECTa.*,CONCAT( a.总大小 / 1024000000, G ) 总大小G FROM(SELECTTABLE_SCHEMA,TABLE_NAME,sum( DATA_LENGTH ) 数据大小,sum( INDEX_LENGTH ) 索引大小,( sum( DATA_LENGTH ) sum( INDEX_LENGTH ) ) 总大小FROMinformation_s…

【Linux】如何在tty终端terminal上实现上下翻页?ubuntu\centos

一、问题背景 有时候&#xff0c;我们在tty终端执行一条命令&#xff0c;会产生很多输出文本&#xff0c;这些文本占满了整个屏幕还不止。 于是乎&#xff0c;我们没办法查看到上面的输出。 在图形界面中的终端&#xff0c;可以用shift Pageup或shift Pagedown来翻页。 …

两小时快速入门 TypeScript 基础(一)工作流、基本类型、高级类型

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;也会涉及到服务端&#xff08;Node.js 等&#xff09; &#x1f4c3;个人状态&#xff1a; 2023届本科毕业生&#xff0c;已拿多个前端 offer&#x…

vscode实现本地代码自动同步到远程机器

在用vscode编码时经常会遇到代码在本地&#xff0c;实际代码编译运行在远端的服务器上&#xff0c;如果在本地修改了代码还需要用比较工具同步到远程服务器上&#xff0c;这样的开发模式非常费时费力&#xff0c;有时候还会漏代码&#xff0c;给开发带来了隐患。 以上的不变可以…

大类资产轮动策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

Roop:显卡GPU版软件已就位,速度提升28倍!

我在本地的一台电脑行做了个简单的对比&#xff0c;同一个小视频&#xff0c;CPU要5分多钟&#xff0c;GPU只要12秒。而且&#xff0c;内存的需求量也大幅度降低了。 美队这个架子&#xff0c;给托尼用&#xff0c;也挺不错哦&#xff01; 这次的版本&#xff0c;准确来说是GPU…

小程序中实现二维数组的展示

目录 1 定义变量2 外层循环3 内层循环总结 我们在小程序中有一类需求就是要显示二维数组&#xff0c;二维数组是指数组中的元素也是数组&#xff0c;比如我们以菜谱为例&#xff0c;菜谱有名称和用料&#xff0c;用料就又是一个数组&#xff0c;如果我们构造数据可以是这样 [ {…

纯干货:怎么样去满足客户需求,增强用户粘性?

无论是销售产品还是提供服务&#xff0c;最终目标是为客户提供他们想要和需要的东西。但随着竞争的加剧和客户期望的变化&#xff0c;了解这些需求变得越来越复杂。因此我们需要识别和满足他们可以产生重大影响的地方。 识别和了解客户需求的好处 想象一下&#xff0c;你在家乡…

详解volatile关键字、线程的可见性、有序性

0、引言 在juc多线程并发编程中&#xff0c;常常需要关注线程的“可见性”与“有序性”。本文将详细介绍这两部分内容&#xff0c;以及volatile关键字的使用。 阅读本文前需要一些jvm运行时内存、进程与线程、共享内存、锁等相关知识。 1、可见性 1.1 定义 定义&…

DOTA-Acrylamide,DOTA-DBCO,DOTA-MeTz,三者DOTA双功能螯合剂信息说明总结

今天小编分享DOTA螯合剂试剂&#xff1a;它们分别是DOTA-Acrylamide&#xff0c;DOTA-DBCO&#xff0c;DOTA-MeTz&#xff0c;今天整体分享一下相关的知识&#xff0c;一起看看吧。 &#xff08;文章编辑来源于&#xff1a;西安凯新生物科技有限公司小编WMJ&#xff09; 一、D…