mysql 集成测试_使用Go进行集成测试的MySQL Docker容器

2023-11-02

# 使用Go进行集成测试的MySQL Docker容器

[原文链接](https://itnext.io/mysql-docker-container-for-integration-testing-using-go-f784b70a03b)                                                                                     作者:Mitesh
[翻译整理](https://abser.top)                                                                                     翻译整理:Abser

## [](#qiw0hl)Overview

Bug 在实际生产中常常代价高昂。我们可以使用测试用例来在开发过程中捕获它们,以降低我们的成本。测试在所有软件中都非常重要。这有助于确保代码的正确性并有助于防止恶化。单元测试有助于隔离测试组件,而无需任何外部依赖。但是单元测试不足以确保我们能够拥有经过良好测试的稳定系统。实际上,在集成不同组件的过程中会发生故障。如果我们不在真实的环境上测试数据库后端的应用程序将面临的问题,我们可能永远不会注意到由于事务未提交,数据库的错误版本等问题。集成测试在端到端测试中扮演了重要角色。

在当今世界,我们编写了许多软件应用程序,其中包含数据库作为存储后端。模拟这些数据库调用以进行单元测试可能很麻烦。在纲要中进行小的更改可能会导致重写部分或全部。因为查询不会连接到实际的数据库引擎,因此不会验证查询的语法或约束。模拟每个查询都可能导致重复工作。为避免这种情况,我们应该测试一个真正的数据库,在测试完成后可以将其销毁。[Docker](https://www.docker.com/) 非常适合运行测试用例,因为我们可以在几秒钟内运行容器并在完成后终止它们。

### [](#vpvogw)安装docker

让我们了解如何启动 MySQL docker 容器并使用它来使用 go 代码进行测试。我们首先需要确保运行我们的测试用例的系统安装了 docker,可以通过运行命令“ **docker ps** ” 来检查。如果未安装docker,请从[此处](https://docs.docker.com/install/)安装 docker 。

```go

func(d * Docker)isInstalled()bool {

command:= exec.Command(“docker”,“ps”)

err:= command.Run()

if err!= nil {

return false

}

return true

}

```

### [](#rfqdgg)运行容器

安装 docker 之后,我们需要使用用户和密码运行 MySQL 容器,该用户和密码可用于连接 MySQL 服务器。

```bash

docker run --name our-mysql-container -e MYSQL_ROOT_PASSWORD = root -e MYSQL_USER = gouser -e MYSQL_PASSWORD = gopassword -e MYSQL_DATABASE = godb -p 3306:3306 --tmpfs / var / lib / mysql mysql:5.7

```

这将运行 MySQL 版本 5.7 的 docker 镜像,其容器名称为 “our-mysql-container”。“-e” 指定我们需要为 MySQL docker 容器设置的运行时变量。我们将 root 设置为 root 密码。使用密码“gopassword” 创建用户 “gouser”,我们用它来连接到我们的应用程序中的 MySQL 服务器。我们正在暴露 Docker 容器的 3306 端口,所以我们可以连接到在 docker 容器内运行的 mysql 服务器。我们使用的是 [tmpfs mount](https://docs.docker.com/v17.09/engine/admin/volumes/tmpfs/),它只将数据存储在主机的内存中。当容器停止时,将删除 tmpfs 挂载。因为我们只是进行测试,所以不需要永久存。

```go

type ContainerOption struct {

Name string

ContainerFileName string

Options map[string]string

MountVolumePath string

PortExpose string

}

func (d *Docker) getDockerRunOptions(c ContainerOption) []string {

portExpose := fmt.Sprintf("%s:%s", c.PortExpose, c.PortExpose)

var args []string

for key, value := range c.Options {

args = append(args, []string{"-e", fmt.Sprintf("%s=%s", key, value)}...)

}

args = append(args, []string{"--tmpfs", c.MountVolumePath, c.ContainerFileName}...)

dockerArgs := append([]string{"run", "-d", "--name", c.Name, "-p", portExpose}, args...)

return dockerArgs

}

func (d *Docker) Start(c ContainerOption) (string, error) {

dockerArgs := d.getDockerRunOptions(c)

command := exec.Command("docker", dockerArgs...)

command.Stderr = os.Stderr

result, err := command.Output()

if err != nil {

return "", err

}

d.ContainerID = strings.TrimSpace(string(result))

d.ContainerName = c.Name

command = exec.Command("docker", "inspect", d.ContainerID)

result, err = command.Output()

if err != nil {

d.Stop()

return "", err

}

return string(result), nil

}

func (m *MysqlDocker) StartMysqlDocker() {

mysqlOptions := map[string]string{

"MYSQL_ROOT_PASSWORD": "root",

"MYSQL_USER": "gouser",

"MYSQL_PASSWORD": "gopassword",

"MYSQL_DATABASE": "godb",

}

containerOption := ContainerOption{

Name: "our-mysql-container",

Options: mysqlOptions,

MountVolumePath: "/var/lib/mysql",

PortExpose: "3306",

ContainerFileName: "mysql:5.7",

}

m.Docker = Docker{}

m.Docker.Start(containerOption)

}

```

我们可以通过 containerId 检查容器以获取容器的详细信息。

```bash

docker inspect containerId

```

一旦我们运行 Docker 容器,我们需要等到我们的 docker 容器启动并运行。我们可以使用以下命令检查这个。

```basic

docker ps -a

```

### [](#1wvhmv)使用实例

一旦 docker 启动并运行,我们就可以开始在我们的应用程序中使用它来运行真实数据库的集成测试用例。

```go

func (d *Docker) WaitForStartOrKill(timeout int) error {

for tick := 0; tick < timeout; tick++ {

containerStatus := d.getContainerStatus()

if containerStatus == dockerStatusRunning {

return nil

}

if containerStatus == dockerStatusExited {

return nil

}

time.Sleep(time.Second)

}

d.Stop()

return errors.New("Docker faile to start in given time period so stopped")

}

func (d *Docker) getContainerStatus() string {

command := exec.Command("docker", "ps", "-a", "--format", "{{.ID}}|{{.Status}}|{{.Ports}}|{{.Names}}")

output, err := command.CombinedOutput()

if err != nil {

d.Stop()

return dockerStatusExited

}

outputString := string(output)

outputString = strings.TrimSpace(outputString)

dockerPsResponse := strings.Split(outputString, "\n")

for _, response := range dockerPsResponse {

containerStatusData := strings.Split(response, "|")

containerStatus := containerStatusData[1]

containerName := containerStatusData[3]

if containerName == d.ContainerName {

if strings.HasPrefix(containerStatus, "Up ") {

return dockerStatusRunning

}

}

}

return dockerStatusStarting

}

```

我们可以使用下面的连接字符串从 go 代码连接到 docker 中运行的 MySQL服 务器。

```bash

gouser:gopassword@tcp(localhost:3306)/godb?charset=utf8&parseTime=True&loc=Local

```

### [](#m2zdld)结束

这些可以在每次运行时重新创建来模拟使用真实数据库运行集成测试。这有助于确保我们的应用程序已准备好进行生产发布。

完整的代码可以在这个git存储库中找到:[https](https://github.com/MiteshSharma/DockerMysqlGo):[//github.com/MiteshSharma/DockerMysqlGo](https://github.com/MiteshSharma/DockerMysqlGo)

有疑问加站长微信联系(非本文作者)

5c5fbae790ec0313d6ee17e8b3dd9ba1.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql 集成测试_使用Go进行集成测试的MySQL Docker容器 的相关文章

  • 剑指Offer第三十六题:两个链表的第一个公共结点

    题目描述 输入两个链表 找出它们的第一个公共结点 思路 这里两个单向链表如果有公共结点肯定是下面这种情况 最后通过公共结点汇合 1 看到这题我直接想到哈希 直接利用map存储一个链表 第二个链表遍历查找地址即可 2 链表的叠加 如下图 假设
  • 前沿技术创新是人工智能发展的动力之源 不断拓展能力边界

    近日 WAIC2022上海人工智能开发者大会在中国 上海 自由贸易试验区临港新片区举行 记者从会上获悉 上海将加大力度推动算法开源 数据开放 算力开发 与国内外知名开源社区互联互通 打造国际人工智能开发生态网络的关键节点 前沿技术创新是人工
  • shell脚本之 函数——【初学者必看】

    shell脚本之函数 一 shell函数定义 1 1函数注意事项 1 2 函数返回值 1 3函数调用的方法 1 4 函数的传参 1 5 函数的作用范围 1 6函数的参数 1 6 1参数的用法 1 6 2参数的表示方法 1 6 3 经典案例
  • Flutter实战Align使用详解

    Align相关属性 Align Key key this alignment Alignment center this widthFactor this heightFactor Widget child alignment 需要一个Al
  • 关于C++中unsigned类型

    我们知道c 中的long long 也知道c 里long long有符号 unsigned long long和long long的区别就在于 1 unsigned long long 没有符号 表示范围是0到264 1 2 long lo
  • Java实现Kafka生产者和消费者的示例(1),mysqlsql语句面试题

    RecordMetadata recordMetadata null try 将消息发送到Kafka服务器的名称为 one more topic 的Topic中 recordMetadata kafkaProducer send new P
  • liboqs-go库在Mac编译使用

    liboqs go库在Mac编译使用 liboqs go是liboqs 量子安全密码算法的开源C库的go封装 将在mac m1上部署和开发使用 所以简单记录下过程 部署 安装基础依赖工具 brew install cmake ninja o
  • Python3,5行代码,Chatxxx能对PDF文件进行旋转、提取、合并等一系列操作,看了这篇,80岁老奶奶走路都不扶墙了。

    ChatPDF的妙用 1 引言 2 代码实战 2 1 原理 2 2 安装 2 2 示例 2 2 1 创建PDF文件 2 2 2 旋转PDF文件 2 2 3 拆分PDF文件 2 2 4 合并PDF文件 2 2 5 提取PDF文件内容 3 总结
  • Linux编译器

    Vi是LINUX系统的第一个全屏幕交互式编译工具 vi的查找与替换 lt 要查找的字符 gt 向下查找要找查的字符 lt 要查找的字符 gt 向上查找要找查的字符 range s string1 string2 gc 替换 例如 10 20
  • 读书笔记----《编写高质量代码:改善Java程序的151个建议》第八/九章

    读书笔记 编写高质量代码 改善Java程序的151个建议 第八 九章 第八章 异常 110 提倡异常封装 111 采用异常链传递异常 112 受检异常尽可能转化为非受检异常 113 不要在finally块中处理返回值 114 不要在构造函数
  • MySQL - 表字段的自增约束

    设置表字段值自动增加 AUTO INCREMENT AUTO INCREMENT是MySQL唯一扩展的完整性约束 当向数据库表中插入新记录时 字段上的值会自动生成唯一的ID 在具体设置AUTO INCREMENT约束时 一个数据库表中只能有
  • 【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)

    需要源码和资源包请点赞关注收藏后评论区留言私信 上一篇博客介绍了如何搭建飞机场景 制作了飞机引擎开启喷射火焰 并且让飞机起飞了参考链接如下 飞机场景搭建 一 效果展示 其中按空格可以控制后部引擎开关 即喷火和不喷火 演示视频如下 拆装飞机控
  • 仿微信 QQ聊天界面,弹出软键盘,listview上移,标题不动

    转载请注明出处 http blog csdn net ym4189 article details 79568820 完美解决聊天布局 顶部title固定 底部是EditText 中间是ListView 弹出软键盘 ListView上移 标
  • JAVA中的基本数据类型和包装类

    8大基本数据类型 byte byte 8位 存放的数据范围是 128 127之间 默认值为0 short short 16位 数据范围是 32768 32767之间 默认值为0 int int 32位 数据范围是 2 31 2 31 1 默
  • Unity3D 屏幕点击特效

    前言 屏幕点击特效目前用到两种 场景中特效和UI特效 其实就是坐标和层级之间的区别 无论特效用的帧动画 粒子特效亦或是贴图都可以使用 根据项目稍微调整下就好了 如果想优化的话可以写个对象池 这里就不赘述了 1 UI点击特效 注意要将Laye
  • java—手机号脱敏

    Java中手机号脱敏是指将真实手机号码中的一部分数字用特定字符替换 以保护用户的个人信息 通常 手机号码脱敏会将手机号的中间几位或者最后几位替换成特定字符 例如用 X 或者其他随意选择的字符来代替 手机号脱敏的目的是防止用户个人信息外泄 在
  • leetcode——探索字节跳动系列题目

    今天登陆leetcode发现探索区多了字节跳动的专栏 特意用了一下午去刷 有些是之前刷过的 但题目不错 就当是复习一遍吧 这里记录一下我会的以及自己觉得不错的题目 原题链接请点击题目 一 挑战字符串 3 无重复字符的最长子串 分析 这题要求
  • library()加载问题解决

    Rstudio中 在加载包 访问时遇到以下问题 trying URL https mirrors tuna tsinghua edu cn CRAN bin windows contrib 3 6 tseries 0 10 47 zip C
  • excel vlookup多个条件匹配多列_Excel数据多条件交叉查询,全部3种方法都在这,vlookup函数已经out了...

    Excel进行数据查询 相信许多人都会说一个函数 那就是vlookup函数 许多人会把这个函数当做Excel函数中的NO 1 毋庸置疑在Excel数据匹配的时候 单条件数据查找vlookup的功能确实是非常的强大 但是在进行数据多条件查询的

随机推荐

  • unity的C#学习——方法的定义、调用、递归与参数传递

    文章目录 C 方法 1 方法的定义与调用 2 方法的递归调用 3 方法的参数传递 3 1 按值传递参数 3 2 按引用传递参数 ref关键字 3 3 按输出传递参数 out关键字 C 方法 一个方法是把一些相关的语句组织在一起 用来执行一个
  • 开机后黑屏看不到桌面_电脑开机后黑屏不显示桌面解决方法

    方法一 设置原因的解决办法 1 开机后如果不显示桌面的图标 你就在桌面上点击右键 查看 显示桌面图标 这样你的桌面上的图标就会出现了 桌面功能也就正常了 2 如果你的问题是不显示图标也不显示任务栏的话 你就按住键盘上的esc shift c
  • 蓝桥杯官网练习题(0的个数)

    问题描述 给定一个正整数 n 请问 n 的十进制表示中末尾总共有几个 0 输入格式 输入一行包含一个正整数 n 输出格式 输出一个整数 表示答案 样例输入 20220000 样例输出 4 评测用例规模与约定 对于所有评测用例 1 lt n
  • 解决ThinkPad E580因AMD显卡导致系统崩溃的问题

    前言 由于着急解决问题 毕竟是常用电脑 而且现在也没法去修或者换电脑 修不好就真没用的了 所以基本全程没图 最后对问题原因有个猜测 如题 可能是因为AMD显卡相关程序导致的 如果有人知道具体原因请指点一下 对问题原因的猜测依据和文中一部分图
  • 双系统grub引导时,出现error: file '/boot/vmlinuz-xxx-xxx-xxx' not found的解决方法

    晚上本想修改一下grub cfg文件 去掉多余的引导项 没成想出现如题之尴尬局面 一番度娘之后终解决 下面是解决方法 Note 在grub下 注意提示按c进入grub命令行模式 首先需要确定你的ubutun安装到哪个硬盘哪个区 1 1 可以
  • 从零开始搭建物联网平台(三)数模设计

    首先 我们先从数模设计开始 这是一个系统的核心和精髓 决定了系统的架构和扩展控件 ETCloud的数模共有22张表 三个模块 一 用户模块 用户模块主要由企业表 用户表 角色表 权限表构成 1 数据权限 用户共分为三大类 model use
  • 力扣算法题解析

    一 278题 第一个错误的版本 难度 简单 1 题目描述 你是产品经理 目前正在带领一个团队开发新的产品 不幸的是 你的产品的最新版本没有通过质量检测 由于每个版本都是基于之前的版本开发的 所以错误的版本之后的所有版本都是错的 假设你有 n
  • stm32Cubemx:串口的空闲中断和接收中断------stm32f407zgt6

    介绍串口的接收中断与空闲中断 这两种中断都是在串口进行接收时可能会发生的中断 串口接收中断即每当串口完成一次接收之后触发一次中断 在 STM32 中相应的中断处理函数为 USARTx IRQHandler 中断回调函数为 HAL UART
  • 2023数据要素专题研究报告

    数据要素是实际参与社会生产活动的 完成确权的数据资源 数字化的文本 图形等数据经过权属确定后即为数据资产 再经过数据处理 分析后 形成数据产品并参与社会生产经营 对其他生产要素赋能并发挥数据自身价值 完成数据的价值闭环 根据国务院印发的 关
  • Neo4j CQl语句(持续更新)

    1 清空所有数据 MATCH n OPTIONAL MATCH n r DELETE n r 2 删除一个节点及其所有的关系 MATCH r WHERE id r 11 DETACH DELETE r 3 删除一个节点 DELETE 通过属
  • Mac Safari 此连接非私人连接

    1 问题 连接公司vpn的时候 Mac弹出此连接非私人连接 点击访问此网站后输入密码将证书手动设为可信后 又弹出了此连接非私人连接 之后进入了无限循环无论怎样都无法访问该网页 2 解决方案 2 1 点击页面上查看此证书 记住证书名字 可以看
  • 自制GUI

    包含了 sqlmap GUI Xray GUI dirmap GUI
  • selenium测试框架快速搭建(UI自动化测试)

    一 介绍 selenium目前主流的web自动化测试框架 支持多种编程语言Java pythan go js等 selenium 提供一系列的api 供我们使用 因此在web测试时我们要点页面中的某一个按钮 那么我们只需要获取页面 然后根据
  • js控制获得焦点与失去焦点样式

    function focusInput focusClass normalClass var elements document getElementsByTagName input for var i 0 i lt elements le
  • Vue项目保存代码之后页面自动更新

    Vue项目保存代码之后页面自动更新 想要在代码中保存之后 页面自动刷新 命令行敲如下代码 npm install webpack dev server 下载了这个东西就不用每次都手动刷新了 我也不知道这个是干嘛的 留在以后研究研究
  • Chromium OS autotest

    autotest三种主要测试手段 直接调用系统命令 相当于直接运行shell命令 通过dbus进行method call 通过加载插件到browser的方式 运行js代码 以js代码来调用C 方法 通过extension来运行js代码 目的
  • XSS闯关——第五关:level5

    第五关 level5 输入语句测试 gt 观察源代码发现字符被替换 把部分字符换成大写尝试 gt 一样的结果 采用html事件方法 失败 同样是字符被替换 使用伪链接方式假造一个超链接尝试 gt a href link a 点击后执行脚本
  • Laravel Collection 常用方法(1)

    我的个人博客 逐步前行STEP 1 first 返回集合第一个通过指定测试的元素 collect 1 2 3 4 gt first 1 collect 1 2 3 4 gt first function value key return v
  • 深度学习deep learning

    一 简介 深度学习是包含多个隐层的机器学习模型 核心是基于训练的方式 从海量数据中挖掘有用信息 实现分类与预测 早期的深度学习模型 编码器 循环神经网络 深度置信网络 卷积神经网络 衍生模型 堆叠降噪自编码器 稀疏自编码器 降噪自编码器 深
  • mysql 集成测试_使用Go进行集成测试的MySQL Docker容器

    使用Go进行集成测试的MySQL Docker容器 原文链接 https itnext io mysql docker container for integration testing using go f784b70a03b 作者 Mi