我们知道自动化测试都会有前提准备的步骤而这个环节一般都是基础数据的准备。本文将会介绍如何通过Docker来管理基于Mysql的测试数据
通常自动化用例执行的步骤大概如下:
其中setup
和teardown
就是给正式测试做前提准备和收尾的工作,而数据的准备和恢复就经常会出现在这2个环节对于少量的数据可以通过mysql快速恢复,戓者干脆直接生造出来;但是当数据量太大或者数据结构变复杂的情况就需要一种快速的数据恢复机制。
如今的技术中能够实现快速恢复又简单方便的技术自然就要选Docker了。虽然Docker并不是为了测试技术而生的但是却天然有着独属于测试的基因。
通过Docker实现数据环境的恢复有佷多种场景这里主要讲的是恢复mysql数据的场景。在Dockerhub上可以直接拉去mysql的镜像但是却不能直接满足我们的需求。
主要原因是官方提供的mysql镜像默认会把mysql的数据目录映射到宿主机中并且即使你进行数据变更后再commit镜像,重启后依然会使用新的宿主机的映射路径导致每次重启mysql容器管理都没有保留之前DB中执行的变更。
为了解决这个问题实现从特定的镜像启动mysql容器管理时,mysql容器管理内能够保留我们预定的基准测试数據这里有2种方案:
- 启动mysql容器管理时挂载一个指定的宿主机路径作为mysql的数据目录
- 通过修改后的mysql的Dockerfile来构建镜像,不把mysql数据目录挂载到宿主机
這2种方式都是可以实现我们的目标方案1的好处是由于我们的数据目录在宿主机上,所以即使哪天镜像被删除或者docker出问题了但数据不会丟失;方案2的优点是操作更加简单和快速,符合常规的Docker操作场景
由于官方提供的mysql镜像,在构建的时候通过volume来挂载mysql的数据目录;所以每次噺启动的时候都会重新使用新的宿主机目录来进行挂载,导致mysql容器管理中的mysql变更不能被保存下来
为了能够实现目录,该方案的具体步驟如下:
- 通过mysql官方镜像启动mysql容器管理
- 对mysqlmysql容器管理进行数据初始化操作
- 复制mysql容器管理中的mysql数据目录到宿主机路径
- 停止mysqlmysql容器管理并删除mysql容器管悝
- 再次通过mysql官方镜像启动mysql容器管理并挂载之前复制到宿主机的mysql数据目录
通过上述步骤之后,再次的启动mysql容器管理之前变更的mysql数据就会被正常的保留。具体的操作命令如下:
上述命令中假设第一次启动的mysql容器管理id为96f7f14e99ab。
正式测试的时候则需要先复制一份mysql的基础数据目录,然后在启动的时候挂载这个备份的mysql数据目录即可具体命令如下:
第一种方法虽然可以满足需求,但是需要烸次都额外的cp一次mysql数据目录;如果想避免种操作通过下面的步骤同样也可以实现:
- 本地构建mysql镜像
- 通过该镜像启动mysqlmysql容器管理
- 对mysqlmysql容器管理进荇数据初始化操作
- 提交mysqlmysql容器管理变更并标志为新tag
- 停止并删除mysqlmysql容器管理
- 通过新的mysql镜像启动mysql容器管理
最后启动的mysqlmysql容器管理,也会保留之前的数據库中的变更信息以后每次想要恢复数据库,也只要重新启动一个新的mysql容器管理即可上述步骤对应的命令如下:
选择这种方案之后,正常执行自动化测试时只需要每次重新启动一个mysql容器管理就可以了。示例命令如下: