使用 Docker 来进行测试

上一篇 egg 的介绍中我们说到测试的问题,测试一直是个让人很头大的问题,不过有了 Docker 以后就解决了很多问题,本文用数据库来抛砖引玉,举个🌰,更重要的是一种思路。

要进行 mock,其实本质思路是一样的,我们需要一个用完就可以卸载的数据库,以便下一次测试使用,他必须对外暴露一个端口,可以读写数据。

为了避免被打,补充一则,本文是基于 app 安装到运行的过程需要 ssh key 或者其他身份认证系统的情况所写,之后会补充常规情况。

为了便于与未来其他服务进行链接,我们使用 docker-compose 来配置,如果还没有相关概念并且想要了解的同学建议阅读一下 docker 相关科普以及官方文档。

version: '3'
services:
  db:
    build: ./db/
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: test
      MYSQL_USER: root
    ports:
      - "0.0.0.0:3306:3306"

这里设置了 docker 的用户名密码和创建的数据库,并且暴露了 3306 端口。build 的目录选择的是 db 目录下的 Dockerfile,也可以直接定义 docker 仓库中的 MySQL 数据库。

Dockerfile 中很简单的写一下,我们之所以不直接用 MySQL image 是因为需要导入数据库表初始化的 SQL:

FROM mysql:5.6

COPY db.sql /docker-entrypoint-initdb.d/

这东西大概长这样,放在 docker-entrypoint-initdb.d 文件夹中就会自动在启动好之后自动导入。

如果到这里文章就能结束,那么自然是全体欢呼,但是现实却是挺残酷的。docker-compose up -d 的结束只代表容器启动,不代表服务启动,在刚开始的阶段如果直接执行 test 非常容易失败。

没办法,叹了口气,写一个 shell 脚本……写 bash 的时候真是痛恨自己读书少,老是忘了怎么写,于是好不容易找到了能跑起来的,照抄一波:


(
  docker-compose up -d
  while ! mysqladmin --user=root --password=root --host "127.0.0.1" ping --silent &> /dev/null ; do
    sleep 2
  done
  echo "success for database connection..."
  npm run lint -- --fix
  npm run test-local
  docker-compose down
)

其实也就是写一个循环……阻塞下一个命令的执行而已……

之后 docker-compose down 会自动卸载创建的容器,整个流程结束。

参考链接:

https://docs.docker.com/compose/compose-file/

如果您觉得文章不错,可以通过赞助支持我

标签: 知识, 代码段, docker

添加新评论