01 为什么你的测试脚本总在“环境冲突”中挣扎?
你遇到过这种情况吗?测试脚本在本地跑得飞起,提交到 Git 仓库后,同事拉下来却报错连连。不是 Python 版本不对,就是依赖库缺失,甚至数据库连接失败。环境冲突,是测试脚本管理的头号杀手。

传统做法是写一份冗长的 README,列出所有依赖和安装步骤。但现实是:没人读,读了也配不对,配对了也跑不起来。文档永远赶不上环境变化的速度。
Docker 的出现改变了这一切。它将环境打包成一个“镜像”,你只需要一个 Dockerfile,就能定义操作系统、编程语言、依赖库、配置文件等所有环境要素。环境即代码,代码即文档。
举个例子。你的测试脚本需要 Python 3.9、Selenium 4.0、Chrome 浏览器和 MySQL 数据库。传统做法需要手动安装这些组件,还要处理版本冲突。用 Docker,你只需要写一个 Dockerfile:
dockerfile
FROM python:3.9-slim
RUN apt-get update && apt-get install -y \
wget \
gnupg \
unzip \
&& wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - \
&& echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google.list \
&& apt-get update && apt-get install -y google-chrome-stable \
&& rm -rf /var/lib/apt/lists/*
RUN pip install selenium==4.0 pytest allure-pytest
COPY test_scripts /app/test_scripts
WORKDIR /app/test_scripts
CMD ["pytest", "-v", "--alluredir=./allure-results"]
这个 Dockerfile 定义了完整的测试环境。任何人拉取这个镜像,都能得到一模一样的运行环境。环境冲突从此消失。
环境即代码,代码即文档。
02 用 Git 管理测试脚本,Docker 是“版本控制”的加速器
Git 负责管理代码版本,Docker 负责管理环境版本。两者结合,才是测试脚本管理的终极方案。版本控制不只是代码,更是环境。
想象一下这个场景:你的测试脚本从 v1.0 升级到 v2.0,依赖库从 Selenium 3.0 升级到 4.0,数据库从 MySQL 5.7 升级到 8.0。如果只用 Git 管理代码,v1.0 的脚本在 v2.0 的环境下肯定跑不起来。你需要手动回滚环境,或者维护多套环境配置。
有了 Docker,问题迎刃而解。每个版本都对应一个 Docker 镜像,镜像标签与 Git 标签一一对应。你只需要在 Git 仓库中维护一个 docker-compose.yml 文件,定义不同版本的服务依赖:
yaml
version: '3.8'
services:
test-web:
build: .
image: my-test-scripts:${TAG:-latest}
depends_on:
- mysql
- redis
environment:
- DB_HOST=mysql
- REDIS_HOST=redis
mysql:
image: mysql:${MYSQL_VERSION:-5.7}
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: test_db
redis:
image: redis:${REDIS_VERSION:-6.0}
在 Git 中打标签时,同时构建对应版本的 Docker 镜像:
bash
# 打标签并构建镜像
git tag v1.0.0
docker-compose build --build-arg TAG=v1.0.0
docker tag my-test-scripts:latest my-test-scripts:v1.0.0
# 切换到旧版本
git checkout v1.0.0
docker-compose up -d
这个组合拳的效果是:切换 Git 分支,环境自动切换。 无需手动安装任何依赖,无需担心环境冲突。团队成员只需执行 docker-compose up,就能在任何机器上复现任何版本的测试环境。
切换 Git 分支,环境自动切换。
03 用 Docker 搭建各类测试环境:从数据库到浏览器
测试脚本的多样性决定了环境需求的多样性。UI 测试需要浏览器,API 测试需要数据库,性能测试需要分布式集群。Docker 的生态让你一键搭建任何环境。
数据库环境: 用 Docker 启动 MySQL、PostgreSQL、MongoDB 等数据库,只需一行命令:
bash
# 启动 MySQL 8.0
docker run -d --name test-mysql \
-e MYSQL_ROOT_PASSWORD=root123 \
-e MYSQL_DATABASE=test_db \
-p 3306:3306 \
mysql:8.0
# 启动 Redis 7.0
docker run -d --name test-redis \
-p 6379:6379 \
redis:7.0
浏览器环境: UI 自动化测试需要浏览器驱动。用 Selenium Grid Docker 镜像,一键启动 Chrome 和 Firefox:
bash
# 启动 Selenium Hub
docker run -d --name selenium-hub \
-p 4442:4442 -p 4443:4443 -p 4444:4444 \
selenium/hub:4.0
# 启动 Chrome 节点
docker run -d --name chrome-node \
--link selenium-hub \
-e SE_EVENT_BUS_HOST=selenium-hub \
-e SE_EVENT_BUS_PUBLISH_PORT=4442 \
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 \
selenium/node-chrome:4.0
集成环境: 用 docker-compose 启动完整测试栈:
yaml
version: '3.8'
services:
test-runner:
build: .
depends_on:
- selenium-hub
- mysql
- redis
environment:
- SELENIUM_HUB_URL=http://selenium-hub:4444/wd/hub
- DB_URL=jdbc:mysql://mysql:3306/test_db
selenium-hub:
image: selenium/hub:4.0
ports:
- "4444:4444"
chrome-node:
image: selenium/node-chrome:4.0
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: test_db
redis:
image: redis:7.0
执行 docker-compose up -d,5 秒内启动一个完整的测试环境。从数据库到浏览器,一键搞定。
5 秒搭建完整测试环境,从数据库到浏览器。
04 版本控制最佳实践:Git + Docker 的组合拳
光有技术不够,还需要规范。Git 仓库中如何组织 Docker 文件?如何管理镜像版本?如何实现 CI/CD 自动化?规范比技术更重要。
仓库结构规范: 每个测试项目独立一个仓库,仓库根目录包含 Dockerfile 和 docker-compose.yml:
text
my-test-project/
├── Dockerfile
├── docker-compose.yml
├── .dockerignore
├── test_scripts/
│ ├── test_login.py
│ ├── test_api.py
│ └── test_performance.py
├── config/
│ ├── test_config.yaml
│ └── docker_env.sh
└── README.md
镜像标签规范: 镜像标签与 Git 标签一一对应,遵循语义化版本:
bash
# Git 标签格式:v主版本.次版本.修订号
git tag v1.0.0
# Docker 镜像标签格式:项目名:版本号
docker build -t my-test-scripts:v1.0.0 .
CI/CD 自动化: 在 GitLab CI 或 GitHub Actions 中配置自动构建和测试:
yaml
# .gitlab-ci.yml
stages:
- build
- test
- deploy
build:
stage: build
script:
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
- docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_TAG
only:
- tags
test:
stage: test
script:
- docker-compose up -d
- docker-compose exec test-runner pytest -v
- docker-compose down
only:
- tags
版本回滚流程: 当测试脚本出问题需要回滚时,执行:
bash
<div style="margin:24px 0;border:1px solid #E3F2FD;border-radius:8px;background:#FAFAFA;overflow:hidden;"><div style="display:flex;align-items:center;gap:12px;padding:12px 20px;background:linear-gradient(135deg,#E3F2FD,#BBDEFB);"><span style="width:36px;height:36px;background:#2196F3;color:#fff;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:bold;font-size:16px;flex-shrink:0;">1. </span><span style="font-size:17px;font-weight:700;color:#1565C0;">回滚 Git 代码</span></div><div style="padding:16px 20px;"><p>git checkout v0.9.0</p></div></div>
<div style="margin:24px 0;border:1px solid #E3F2FD;border-radius:8px;background:#FAFAFA;overflow:hidden;"><div style="display:flex;align-items:center;gap:12px;padding:12px 20px;background:linear-gradient(135deg,#E3F2FD,#BBDEFB);"><span style="width:36px;height:36px;background:#2196F3;color:#fff;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:bold;font-size:16px;flex-shrink:0;">2. </span><span style="font-size:17px;font-weight:700;color:#1565C0;">拉取对应版本的镜像</span></div><div style="padding:16px 20px;"><p>docker pull my-test-scripts:v0.9.0</p></div></div>
<div style="margin:24px 0;border:1px solid #E3F2FD;border-radius:8px;background:#FAFAFA;overflow:hidden;"><div style="display:flex;align-items:center;gap:12px;padding:12px 20px;background:linear-gradient(135deg,#E3F2FD,#BBDEFB);"><span style="width:36px;height:36px;background:#2196F3;color:#fff;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-weight:bold;font-size:16px;flex-shrink:0;">3. </span><span style="font-size:17px;font-weight:700;color:#1565C0;">启动旧版本环境</span></div><div style="padding:16px 20px;"><p>TAG=v0.9.0 docker-compose up -d</p></div></div>
## 05 实战案例:一个完整的测试脚本版本控制流程
理论讲完了,来一个实战案例。假设你是一个测试工程师,负责一个电商网站的自动化测试。测试脚本包含登录、商品搜索、下单等功能。
**第一步:初始化 Git 仓库并编写 Dockerfile**
mkdir e2e-tests && cd e2e-tests
git init
text
创建 Dockerfile(见上文示例),创建 docker-compose.yml(见上文示例)。
**第二步:编写测试脚本并提交**
test_login.py
from selenium import webdriver
from selenium.webdriver.common.by import By
def test_login_success():
driver = webdriver.Remote(
command_executor='http://selenium-hub:4444/wd/hub',
options=webdriver.ChromeOptions()
)
driver.get('http://web-app:8080/login')
driver.find_element(By.ID, 'username').send_keys('test_user')
driver.find_element(By.ID, 'password').send_keys('test_pass')
driver.find_element(By.ID, 'login-btn').click()
assert 'Dashboard' in driver.title
driver.quit()
git add .
git commit -m "feat: 添加登录测试脚本"
git tag v1.0.0
docker build -t e2e-tests:v1.0.0 .
docker tag e2e-tests:v1.0.0 registry.example.com/e2e-tests:v1.0.0
docker push registry.example.com/e2e-tests:v1.0.0
git clone https://github.com/team/e2e-tests.git
cd e2e-tests
git checkout v1.0.0
docker pull registry.example.com/e2e-tests:v1.0.0
docker-compose up -d
text
**第五步:迭代更新**
修改测试脚本后,提交新版本:
git add .
git commit -m "fix: 修复登录按钮定位问题"
git tag v1.0.1
docker build -t e2e-tests:v1.0.1 .
docker push registry.example.com/e2e-tests:v1.0.1
git checkout v1.0.0
docker pull registry.example.com/e2e-tests:v1.0.0
docker-compose up -d
声明:本站部分稿件版权来源于网络,如有侵犯版权,请及时联系我们。