【青训营】Go的测试

news2024/10/7 8:25:25

Go的测试

测试主要包括:回归测试、集成测试、单元测试

一、单元测试

image.png
其中测试单元可以是函数,也可以是模块

规则:

1.所有测试文件都以_test.go结尾

2.测试函数命名规范:func TestXxx(*Testing.T)

3.初始化逻辑需要放置在TestMain中

以下是一个简单的测试:
测试函数HelloTom是否能打印出“tom”,如果不行,则启动错误打印

import "testing"

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)
   }
}

使用以下指令启动测试:

go test 文件名.go

很显然,测试不通过,实际输出为jerry

image.png

只要将HelloTom的输出改为"tom"就可以通过测试

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

func HelloTom() string {
   return "tom"
}

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

上述的代码中使用了来自github的库"github.com/stretchr/testify/assert" ,在判断输出是否相等的时候使用了assert.Equal()函数,合理使用第三方库可以减轻我们的开发负担

最终运行结果如下:

image.png

以上是单元测试的简单示例

1.2单元测试的评价标准

单元测试的标准主要是代码覆盖率,覆盖率越高则证明越多的代码经过了测试。下面我们通过一个例子来了解代码覆盖率。
测试代码覆盖率需要两个文件,分别为被测试的代码xxx.go和负责运行测试程序的xxx_test.go
首先是被测试代码Judge.go

// 判断学生成绩是否合格
func JudgePassLine(score int16) bool {
   if score >= 60 {
      return true
   }
   return false
}

接下来是测试程序Judge_test.go

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

func TestJudgePassLineTrue(t *testing.T) {
   isPass := JudgePassLine(70)
   assert.Equal(t, true, isPass)
}

测试代码覆盖率的命令如下:

go test 测试程序 被测试的代码 --cover
示例: go test Judge_test.go Judge.go --cover

输出如下

image.png

输出显示代码覆盖率为66.7%,这是因为JudgePassLine一共有三行代码,其中score=70的时候,只会执行他的if语句和return true语句,因此覆盖了66.7%的代码。另外可以提高测试样例数量,使得覆盖率为100%

实际项目中,达到100%覆盖率是可望不可及的,一般项目对于主流层需要覆盖50%,而对于资金类的交易等关键操作,需要达到80%的覆盖率。对于测试,需要有以下要求:

  • 测试分支完备独立,不重不漏,全面覆盖
  • 测试单元粒度足够小,函数职责单一

1.3 对依赖的单元测试

image.png
我们在项目中需要依赖一些缓存、数据库或者文件等,对其的测试有两个要求:

  • 幂等:重复运行一个测试其结果是一样的
  • 稳定:单元测试是相互隔离的

1.3.1 对文件的处理

对文件的测试主要是用Mock机制
比如有一个函数是用于将文本中所有的11都替换为00,但是用传统方法是无法做到反复测试的!一旦运行了该函数,文本中的11就全部被替换为00了,如果再次运行,那么实际上这个函数的执行流程实际上是和第一次不一样的,而且一旦有人删除了该文件或者修改了该文件,也会改变测试结果,不满足幂等和稳定的要求

import (
   "bufio"
   "os"
   "strings"
)

func ReadFirstLine() string {
   open, err := os.Open("log")
   defer open.Close()
   if err != nil {
      return ""
   }

   scanner := bufio.NewScanner(open)
   for scanner.Scan() {
      return scanner.Text()
   }
   return ""
}

func ProcessFirstLine() string {
   line := ReadFirstLine()
   destLine := strings.ReplaceAll(line, "11", "00")
   return destLine
}

此时我们就需要使用到Mock函数进行打桩。我们使用到的比较常用的Mock包是Monkey,其代码仓库地址是:https://github.com/bouk/monkey 。其中打桩可以使用函数A去替换需要被测试的函数B。其中Patch()为打桩函数,Unpatch()为卸桩函数。

image.png

施工中🚧待完善

二 基准测试

import (
   "math/rand"
   "testing"
)

var ServerIndex [10]int

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

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

func BenchmarkSelect(b *testing.B) {
   InitServerIndex()
   b.ResetTimer()
   for i := 0; i < b.N; i++ {
      Select()
   }
}

func BenchmarkSelectParallel(b *testing.B) {
   InitServerIndex()
   b.ResetTimer()
   b.RunParallel(func(pb *testing.PB) {
      for pb.Next() {
         Select()
      }
   })
}

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

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

相关文章

django框架【待续】

目录简介MVC与MTV模型MVCMTV创建项目目录生命周期静态文件配置&#xff08;无用&#xff09;启动django[启动](https://www.cnblogs.com/xiaoyuanqujing/articles/11902303.html)路由分组无名分组有名分组路由分发反向解析反向解析结合分组名称空间re_path与path自定义转换器视…

为什么普通人赚钱这么难?普通人的赚钱之路在哪里

前几天听一个老家的朋友说辛辛苦苦一整年&#xff0c;发现并没有赚到什么钱。付出与收入不成正比。首先要知道勤奋、努力并不一定就能够赚到钱像送外卖的&#xff0c;工地上班的&#xff0c;厂里上班的哪个不勤奋但他们即使非常努力工作一个月&#xff0c;扣除基本开支&#xf…

这是一篇知识帖:终于能明白云原生技术的概念和可落地的应用分享

随着云计算的发展和普及&#xff0c;云原生概念的热度也越来越高&#xff0c;到底什么是云原生&#xff1f;和我们日常工作有什么关系&#xff1f;本文是向大家介绍云原生技术的概念和要点&#xff0c;帮助大家快速了解和学习云原生&#xff0c;&#xff0c;便于大家了解工作的…

【PHP了解】PHP脚本语言基础

PHP PHP 文件的默认文件扩展名是 “.php”PHP 文件通常包含 HTML 标签和一些 PHP 脚本代码 例&#xff1a; <!DOCTYPE html> <html> <body><?php xxxxxxxxxxxxxxxxx; ?></body> </html>语法 代码框架 <?php 开始&#xff0c;以 ?…

DW动手学数据分析Task1:数据加载及探索性数据分析

目录1 数据载入1.1 载入数据1.2 read_csv和read_table的区别1.3 逐块读取1.4 修改表头和索引2 数据初步观察2.1 查看数据基本信息2.2 保存数据3 pandas数据结构和列操作3.1 Series 和DataFrame3.2 查看 DataFrame数据每列的名称和值3.3 DataFrame 的列删除和隐藏4 数据筛选4.1 …

如何合并pdf?来看这几个方法!

我们经常在整理文件的时候经常会选择将一些常用文件的格式改为pdf&#xff0c;因为这种文件格式就算发送给了别人&#xff0c;别人也不能随意的修改文件内容&#xff0c;这就保证了我们的文件内容的隐私安全。不过&#xff0c;对于处理pdf文件&#xff0c;我们还是会面临一些不…

c++ dynamic_cast,static_cast,const_cast,reinterpret_cast四种cast用法整理

在C中主要分为四种cast&#xff0c;分别是&#xff1a;static_cast、dynamic_cast、const_cast和reinterpret_cast dynamic_cast动态类型转换 首先&#xff0c;我们明确基类和派生类之间的两个转换术语 向上转换(upcast)&#xff1a;派生类向基类转换 向下站还(downcast)&…

证券服务应用评测系列:海通e海通财发布9.0版本,探索证券APP持续提升用户体验

易观分析&#xff1a;APP作为券商机构线上服务的入口&#xff0c;其活跃用户规模和运营水平在一定程度上能够体现机构战略定位、品牌运营、科技创新、用户竞争等综合实力。易观分析认为&#xff0c;如何围绕用户进行创新&#xff0c;利用技术将壁垒升高&#xff0c;打造具有品牌…

PuTTY installation directory must be on a local hard drive

putty安装问题 问题描述&#xff1a;安装时候报错&#xff0c;installation directory must be on a local hard drive 解决方案&#xff0c;无法解决。 很多人使用了这个方法解决了。但是我解决不了。 1、如果是exe类型的&#xff0c;直接右击以管理员身份运行。 2、如果是…

常用的文件类型大全(建议收藏)

文件格式格式图标格式概况mpg文件mpg是一种常见的视频格式,mpeg标准主要有以下五个,MPEG-1、MPEG-2、MPEG-4、MPEG-7及MPEG-21等。mpg有可能是基于MPEG-1(VCD)或MPEG-2torrent文件torrent文件(扩展名为.torrent)包含了一些BT下载所必须的信息,根据BitTorrent协议,文件发布者…

opencv文字旋转 putText旋转90°

文章目录● opencv文字旋转 putText旋转901. cv::getTextSize获取文字的尺寸textSize2. 设置文字图像textImg尺寸格式3. 将文字绘制在文字图像textImg上4. 对文字图像textImg进行旋转5. 在原图img上设置用来放置文字图像textImg的roi区域5.1 矩形区域roi5.2 行列范围roi6. 将文…

Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation论文解读

Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation 论文&#xff1a;[2105.05537] Swin-Unet: Unet-like Pure Transformer for Medical Image Segmentation (arxiv.org) 代码&#xff1a;HuCaoFighting/Swin-Unet: The codes for the work “Swin-Unet:…

LiveNVR监控流媒体Onvif/RTSP功能功能-支持GB35114接入国标流媒体平台接入说明

LiveNVR监控流媒体Onvif/RTSP功能功能-支持GB35114接入国标流媒体平台接入说明1、GB35114注册2、LiveNVR通过GB35114接入LiveGBS2.1、开启LiveGBS 35114功能2.2、 获取设备端证书给平台2.3、LiveGBS白名单中添加需要接入的国密设备2.4、导出LiveGBS平台端证书给设备&#xff08…

管理学实验的设计与实践结课作业

一、不同组织结构类型对组织的沟通效率会带来影响&#xff0c;这也是在组织结构设计过 程需要考虑的重要内容&#xff0c;但对于两者的关系无法准确界定。如在直线职能制的组织结构中&#xff0c;管理幅度和深度是影响是影响沟通效率的主要因素。请设计实验来验证分析直线职能制…

手动部署SQL审计平台Archery(连接mysql8.x)

安装Python和virtualenv从1.9.0版本开始&#xff0c;将不再支持python3.7及以下版本&#xff0c;手动安装也将使用3.9版本作为样例&#xff0c;移除yum安装方式# 安装依赖 yum install libffi-devel wget gcc make zlib-devel openssl openssl-devel ncurses-devel openldap-de…

分享81个PHP源码,总有一款适合您

PHP源码 分享81个PHP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 81个PHP源码下载链接&#xff1a;https://pan.baidu.com/s/18jo0nrQ6tCf-e1PAylItmQ?pwd3rxz 提取码&#xff…

Mysql之多表查询

简单测试 由于我们之前没学过多表查询 我们简单测试一下初学者认为的多表查询 SELECT * FROM emp,dept这是我们的输出结果 其实不难发现 1.返回的结果就是&#xff0c;第一张表一个个数据取出然后和第二张表所有组合 最后返回的是含有两张表的所有列 2.一共返回的记录数第一章…

【ES6篇新语法】(1)ES6介绍及常量声明、对象数组,附实例详解

【写在前面】 应一些粉丝的要求&#xff0c;整理一些ES6相关的文章&#xff0c;因此借这个岁末之际&#xff0c;给大家整理一篇ES6的相关的博客&#xff0c;不管是面试还是在实际的编程上&#xff0c;我们都常提到ES6这个词&#xff0c;可能前几年比较热门&#xff0c;希望大家…

焊接变形的原因以及防止焊接变形的措施

焊接变形的原因   在焊接过程中对焊件进行了局部的、不均匀的加热是产生焊接应力及变形的原因。焊接时焊缝和焊缝附近受热区的金属发生膨胀&#xff0c;由于四周较冷的金属阻止这种膨胀&#xff0c;在焊接区域内就发生压缩应力和塑性收缩变形&#xff0c;产生了不同程度的横向…

喜报!西门子低代码连续四年获评Gartner企业低代码应用平台魔力象限领导者

点击下载最新发布的Gartner魔力象限图™https://www.mendix.com/resources/gartner-magic-quadrant-for-low-code-application-platforms/?utm_mediumpr&utm_campaignMQ&utm_sourceMQ#formWrapper 想象一下&#xff0c;一个为持续数字化转型做好准备的组织会是什么样…