golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布

2023-11-16

最近一周写一个比较复杂的业务模块,越写到后面真心越心虚。操作越来越复杂了,代码也逐渐凌乱了起来。比如一个接口,传入的是一个比较复杂的大json,我需要解析这个大json,然后根据json中字段进行增删改查,调用第三方服务等操作。告诉前端接口已经完成的时候,总是有点没有底气。说实话,在写PHP的时候,我确实很少写单元测试,大都是对着页面进行一波一波的测试,现在想想,一个是懒,还有一个是确实PHP是不需要编译的语言,没有编译时间,测试-修正,整个流程非常短。但是这次是一个比较大的GoLang项目,如果还是按照“编译-起服务-调用-调整代码-编译-起服务-调用-...” 这种循环来做调试,真是会疯了的。所以我能静下心好好研究研究如何写Golang的单元测试了。

数据库怎么办?

这个是第一个需要思考的问题。这个问题和语言无关。一旦有数据库操作,就需要考虑如何在测试用例中如何处理数据库操作。我想了想,无外乎两种做法,一种是直接mock数据库的返回对象。另外一种,是搭建一个测试DB,然后灌入假数据,进行测试。这两种方式我选择了后一种。有几个理由:首先,mock数据库返回数据是一个比灌入DB数据更为复杂的逻辑,数据库返回的数据根据sql各种各样,要想在每个环节都写好数据库操作返回,倒不如我直接伪造一些数据来的方便。其次,mock数据库返回会丢失model层的测试逻辑,当然如果你是轻model层,整个model就只有一个orm,这个可能就不是理由了。

所以,我操作的第一步,从线上把数据库表结构copy一份到我本地vagrant的mysql中。

这里必须要注意,你的测试数据库和测试代码最好是同一个机器上,否则每跑一个测试用例,消耗的时间非常大,你的测试体验也不会太好。

第三方请求怎么办?

我的代码逻辑中也有一些第三方调用,调用其他服务。当然这里也有同样的两种办法,一种是直接在本地测试环境搭建第三方服务,另外一种是mock第三方服务的返回数据。这里我选择了mock数据的方式。基本想法是因为我这个测试毕竟不是一种全链路测试,测试的主体还是我的服务,我的服务基本上只包含服务+DB,如果要搭建第三方服务,这就有点舍本逐末的感觉了。

好了,如何mock第三方服务呢?

查了下golang中mock的包有两个比较出名,一个是golang官网出品的golang/mock,另外一个是monkey(https://github.com/bouk/monkey)。两个相比之下,我感觉golang/mock是师出有名,但是不如monkey好用,monkey属于黑科技,使用修改函数指针的方式进行mock函数。我想了想,实用第一位,投入了monkey的怀抱。

基本使用代码如下:

// mock路网接口guard := monkey.Patch(lib.Curl, func(trace *lib.TraceContext, CurlType, urlString string, data url.Values, addToken bool) ([]byte, error) { return []byte("{["10010":"后厂村路"}"]), nil})defer guard.Unpatch()

将lib.Curl整个函数给mock了,并且在函数结束后修改mock的函数,保证不影响其他测试用例。

配置文件怎么办?

web服务一般都会有读取配置的代码,我的服务是读取一个参数config=base.json来进行配置的读取的。go test中是没有办法给test的代码传递参数的,(我看网上的一些文章说有个-args的参数,但是我在go1.11版本中确实没有看到这个参数)。于是我只能选择使用环境变量的方式。在运行go test的时候,在最开头的部分设置下当前这个go test的环境变量CONFIG_PATH,然后修改下我的初始化配置文件的代码,允许传入参数进行配置文件的读取。

大概代码如下:

在运行go test的时候设置环境变量:

CONFIG_PATH=/home/vagrant/foo/conf/yejianfeng/base.json go test foo/signaledit/... -v -test.run TestGetGroups

测试环境的初始化配置文件逻辑:

package testimport ( ..)var HasSetup = false// signalEdit初始化,只调用一次func SetUpSignalEdit() { if HasSetup == false { gin.SetMode(gin.TestMode) confPath := os.Getenv("CONFIG_PATH") // 获取环境变量 commonlib.Init(confPath, "") // 初始化配置文件 conf.ParseLocalConfig() db.InitDB() HasSetup = true } DestroyTestData(db.EditDB) CreateTestData(db.EditDB)}

web怎么进行单元测试?

关于这个,httptest这个包提供给我们想要的逻辑了,网上的文章也一大堆了。使用起来也是很方便,

router := gin.New()jc := Controller{}// 灯组模型表获取信息router.GET("/group/all
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布 的相关文章

  • 华为OD机试真题 Java 实现【完美走位】【2022.11 Q4】

    题目描述 输入一个长度为4的倍数的字符串 字符串中仅包含WASD四个字母 将这个字符串中的连续子串用同等长度的仅包含WASD的字符串替换 如果替换后整个字符串中WASD四个字母出现的频数相同 那么我们称替换后的字符串是 完美走位 求子串的最
  • vue+播放直播视频流(websocket的流文件)

    前言 之前分享的有 rtmp直播流 flv直播流的一些方法 这里分享下 播放 websocket的直流的方法 使用的方法是JSMpeg JSMpeg是JS写的视频 音频解码器 能使用WebGL Canvas2D渲染以及WebAudio声音输
  • Linux14.04下安装网易云音乐和搜狗输入法(太棒了!!!)

    本文转载于 http blog csdn net tao 627 article details 51535294 注 本人比较喜欢挺音乐 一直用的是Linux版本 一直苦苦的用着网页版的网易云音乐 哎呀 反正不太好 不舒服 今天由于其他原
  • React 从零开始学习(一) —— 搭建项目

    React 文档地址 https react docschina org docs create a new react app html 简介 React 是一个用于构建用户界面的 JAVASCRIPT 库 React 主要用于构建 UI
  • 如何通过JAVA代码实现多线程分段下载+断点续传

    多线程下载技术是很常见的一种下载方案 这种方式充分利用了多线程的优势 在同一时间段内通过多个线程发起下载请求 将需要下载的数据分割成多个部分 每一个线程只负责下载其中一个部分 然后将下载后的数据组装成完整的数据文件 这样便大大加快了下载效率
  • matplotlib.pyplot.plot()参数详解

    https matplotlib org api pyplot summary html 在交互环境中查看帮助文档 import matplotlib pyplot as plt help plt plot 以下是对帮助文档重要部分的翻译
  • CloudCompare——计算点云的法向量

    目录 1 Computing normals on a cloud 2 点云法线计算结果 3 反转法线方向 Normals gt Invert 4 With Minimum Spanning Tree 5 With Fast Marchin
  • AutoCAD 二次开发之 ObjectARX 环境搭建

    AutoCAD2017 VS2015 Win7 Win10 第一步 安装ObjectARX SDK 库 解压 ObjectARX SDK 文件到指定路径 C ObjectARX 避免出错 使用默认路径 第二步 安装向导程序 创建注册表 新建
  • 使用JestClient连接elasticsearch-5.x对数据进行分组聚合

    原本数据存放在mysql中 项目需求是从mysql中查出来计算推送给前端 但是随着数据量增大 我们的查询语句也复杂 性能会明显下降 所以就考虑干脆存放到elasticsearch中 查询计算都方便 于是去和公司专门负责es平台服务的人对接
  • IT项目管理大作业-个人报告

    在本次IT项目管理大作业中我主要负责了寻找对应模块和工具的工作 主要职责就是负责百度搜索 为开发人员和测试人员提供支持 虽然在本次大作业的实际执行中 由于我实习白天确实很忙外加团队开发人员都有很强的开发能力 因此基本上开发人员和测试人员还是
  • JAVA和C++区别都有哪些?

    转载自品略图书馆 http www pinlue com article 2020 05 1022 4710469487040 html 这是Java与C 区别的一个比较完整的答案 大家可以学习一下 JAVA和C 都是面向对象语言 也就是说
  • shiro使用自定义realm实现数据认证

    自定义realm实现数据认证 在开发中 有时会与一些nosql或者其他地方保存的数据进行认证 这时候 shiro定义的那些realm类可能不能满足实际的功能需求 这时候我们可以通过自定义一个realm来沟通这些数据 实现认证和权限控制 首先
  • Python数据挖掘进阶--泰坦尼克号案例分析

    一 概念介绍 1 机器学习 机器学习算法来建立模型 当有新的数据过来 通过模型能够进行预测 2 特征 features 和标签 labels 特征 数据的属性 通过这些特征可以代表数据的特点 例如Excel的字段列名 也叫做解释变量或自变量
  • Java基础-File

    File 1 file和IO的概述 2 Flie的构造方法 3 File 绝对路径和相对路径 4 File创建功能 5 File 判断和获取功能 6 File listFile 7 案例 File的练习 上一篇Java基础 Stream流
  • 算法分析与设计二分搜索问题Python

    需求分析 设a 0 n 1 是已排好序的数组 试改写二分搜索算法 使得当搜索元素x不在数组a中时 返回小于x的最大元素的位置i和大于x的最小元素的位置j 当搜索元素x在数组a中时 返回x在数组中的位置 此时i和j相同 代码如下 def bi
  • 如何将分布式锁性能提升100倍【含面试题】

    面试题分享 云数据解决事务回滚问题 点我直达 2023最新面试合集链接 2023大厂面试题PDF 面试题PDF版本 java python面试题 项目实战 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转clo
  • List接口不是很详细的介绍

    文章目录 前言 一 List是什么 1 1 List概述 1 2 常用API 带有Index 都是List新增方法 1 3 List用法 二 常见实用类 2 1 ArrayList与Vector 2 2 ArrayList与LinkedLi
  • 微信小程序之behaviors

    目录 简介 使用方法 意义 简介 微信小程序的behaviors是一种可复用的代码块 可以在多个组件中共享 它类似于面向对象编程中的 继承 可以将一些通用的逻辑和方法封装在behaviors中 然后在需要使用的组件中引用该behaviors
  • SQL注入原理-报错盲注

    小伙伴们大家好 本期为大家带来的内容是SQL注入原理之报错盲注 目录 为什么要使用报错盲注 常见的报错函数 updatexml 函数 extractvalue 函数 实战演示 1 检测是否存在注入点 2 执行报错语句爆出数据 1 爆出当前数

随机推荐

  • Docker安装+基本操作+配置阿里云镜像仓库,以及Docker下mysql,tomcat,redis安装 包括redis.conf文件

    1 帮助启动类命令 2 镜像命令 3 容器命令 4 配置阿里云镜像仓库 1 登陆阿里云镜像仓库 2 往阿里云镜像仓库推送本地镜像 有教程 最后只用改一个版本号即可 版本最好不要重复 3 从阿里云镜像仓库拉取镜像 同上 非常简单 5 dock
  • 回调函数的作用

    回调函数的作用 原文地址 http wmnmtm blog 163 com blog static 3824571420105484116877 一直不太理解回调函数的作用 下面是找到的一些关于回调函数的作用的解答 1 回调函数是一个很有用
  • java正则表达式验证密码_java密码验证正则表达式校验

    正则表达式就是记录文本规则的代码 php密码验证正则表达式 8位长度限制 密码验证 password zongzi Abc oo13a2 n preg match all a zA Z d 8 password array 长度是8或更多
  • Spring中事件监听器

    Spring中事件监听器 概述 基本构成 Spring事件监听器应用 Spring中监听器流程和源码解析 概述 事件监听器是观察者模式的一个应用 当被观察的事件发生改变时需要通知该事件的订阅者针对这个事件做出对应行为 它将事件的发布和订阅进
  • MyBatisPlus之条件查询(常规查询、范围查询、模糊查询、null值处理等)

    MyBatisPlus之条件查询 MyBatisPlus之条件查询 1 设置查询条件 1 1 常规格式 1 2 链式编程格式 1 3 lambda格式1 1 4 lambda格式2 2 组合查询条件 2 1 并且 2 2 或者 3 条件查询
  • 项目难管理?先学会用好甘特图(内附操作方法及实用模板)

    先分享一些项目管理甘特图的模板 省事儿 高效 简单 再放制作教程 注 模板文中自取 部分Excel模板做成文件放在文末了 01 项目管理Excel套表 02 工程项目流程甘特图 03 项目管理甘特图表 模板指路 gt gt 工程项目管理模板
  • create-react-app中使用axios请求本地json文件

    在create react app创建react应用时 模拟本地请求静态json文件 必须把静态文件放到public下才可以请求到
  • appium+jenkins实例构建

    自动化测试平台 Jenkins简介 是一个开源软件项目 是基于java开发的一种持续集成工具 用于监控持续重复的工作 旨在提供一个开放易用的软件平台 使软件的持续集成变成可能 前面我们已经开完测试脚本 也使用bat 批处理来封装了启动App
  • P3369 【模板】普通平衡树【splay】

    题目链接 一个学习splay的链接 挺不错的哟 初识splay的时间里 总是会在各种各样的地方反着各种各样稀奇古怪的错误 好蒻 这次的错误是在pushup 的时候 我们更新其父节点的时候 不能直接使用 1 来做 而是要理解为什么是加上这个节
  • linux内核之无锁缓冲队列kfifo原理(结合项目实践)

    无锁缓冲队列kfifo 1 kfifo概述 2 kfifo功能描述 3 kfifo put与 kfifo get详解 4 kfifo get和kfifo put无锁并发操作 5 总结 6 项目使用介绍 7 其它 userspace 移植实现
  • Qt之QEvent

    简述 QEvent 类是所有事件类的基类 事件对象包含事件参数 Qt 的主事件循环 QCoreApplication exec 从事件队列中获取本地窗口系统事件 将它们转化为 QEvents 然后将转换后的事件发送给 QObjects 一般
  • 冠脉造影的医学背景知识

    1 冠脉造影读片技巧 医学界医生站
  • 内容:先有详细设计,还是先有接口文档?

    有朋友询问 对于一个项目来说是先写接口文档还是先设计表呢 有的人说 先写接口文档再慢慢完成表的设计 这样就可以避免由于太了解表了而导致对于返回的数据模型太受表的影响 针对这个问题 我们需要明确2个概念 并结合研发流程考虑信息依赖 才能更好地
  • avue dynamic动态子表单启用插槽slot功能的正确方式

    avue dynamic动态子表单启用插槽slot功能的正确方式 关于avue dynamic动态子表单 配置dynamic的children字段即可 内部组件为crud组件 大部分属性参考Crud文档 默认的type为curd 还可以配置
  • spring boot整合MySQL数据库

    spring boot整合MySQL数据库 spring boot整合MySQL数据库可以说很简单 只需要添加MySQL依赖和在配置文件中添加数据库配置信息 利用spring boot starter jdbc的JdbcTemplate即可
  • 集成算法——Adaboost代码

    集成算法是我们将不同的分类器组合起来 而这种组合结果就被称为集成方法或者是元算法 使用集成方法时会有多种形式 可以是不同算法的集成 也可以是同意算法在不同设置下的集成 还可以是数据集不同部分分配给不同分类器之后的集成 两种形式 baggin
  • 【总结】Markdown个人常用语法

    目录 输入 toc 按回车Enter Table of Contents TOC toc 标题 一级标题 二级标题 六级标题 段落 一个段落是由一个以上的连接的行句组成 一个以上的空行和Tab则会划分出不同的段落 一般的段落不需要用空白或换
  • GFPGAN源码分析—第十四篇

    项目总结 1 简述思想 本项目主要是利用预训练好的GAN生成器 StyleGAN 作为先验实现低质量人脸图片的修复 论文中提到 1 We leverage rich and diverse generative facial priors
  • vue中实现el-table点选和鼠标框选功能

    实现思路 项目有两个需求 既能在el table实现点选又能实现鼠标框选 一 点选实现思路 使用el table的cellClick方法 1 直接给点击的cell添加类名 cell classList add blue cell 然后把获取
  • golang 读取文件最后一行_测试用例是开发人员最后一块遮羞布

    最近一周写一个比较复杂的业务模块 越写到后面真心越心虚 操作越来越复杂了 代码也逐渐凌乱了起来 比如一个接口 传入的是一个比较复杂的大json 我需要解析这个大json 然后根据json中字段进行增删改查 调用第三方服务等操作 告诉前端接口