搞过自动化测试的人都知道,本地跑用例容易,但真要集成到持续集成流程里,尤其是服务涉及内外网交互时,问题就来了。比如你写的 Selenium 测试脚本在本机能顺利打开网页,一放到 CI/CD 的 Docker 环境里就打不开目标地址——八成是网络通路没打通。
为啥需要关心端口映射?
举个常见场景:你在本地写了个基于 Playwright 的自动化测试,测试的服务运行在本地 8080 端口。CI 系统把测试代码拉下来,在容器里启动服务后,默认只能在容器内部访问这个端口。外部的测试框架根本连不上,自然就报连接超时。
这时候就得靠端口映射来“搭桥”。比如用 Docker 启动服务时加上 -p 8080:8080,把容器内的服务端口暴露到宿主机,测试框架就能通过宿主机 IP 加端口访问到服务了。
实际配置示例
假设你的测试流程中,先启动一个被测 Web 应用容器,再运行自动化测试。Docker 命令可能是这样的:
docker run -d --name webapp -p 8080:8080 my-web-app:latest
然后在测试脚本里,就可以稳定地访问 http://localhost:8080 进行操作。如果没做端口映射,这一步就会失败。
结合 CI 工具的写法
在 GitHub Actions 或 GitLab CI 中,你可以通过 service 或自定义 job 来实现。比如 GitLab CI 的配置片段:
test_job:
image: python:3.9
services:
- name: my-web-app:latest
alias: webapp
script:
- pip install playwright
- pytest tests/e2e/
这里虽然没显式写 -p,但 GitLab 会自动处理服务容器的网络连接,相当于做了内部端口映射,让测试容器能通过 webapp 这个别名访问到服务。
别忽略防火墙和宿主机限制
有时候即使写了 -p,还是连不上。这时候得看看运行 CI 的机器是不是云服务器,安全组有没有放行对应端口。比如阿里云 ECS 上跑 Jenkins,容器映射了 8080,但安全组没开,外部请求照样被拦下。
还有一种情况是开发机跑 macOS 或 Windows,Docker 桌面版对端口映射的支持和 Linux 有细微差别,建议统一使用 Linux 环境做集成,避免莫名其妙的连接问题。
小技巧:用动态端口避免冲突
在并发执行多个测试任务时,固定端口容易撞车。可以改用动态映射:
docker run -d --name webapp-test -p 0:8080 my-web-app:latest
Docker 会自动分配一个宿主机端口(比如 32780),再通过 docker inspect 或环境变量拿到实际端口,传给测试脚本。这样多任务并行也不会打架。
自动化测试框架能不能稳,不光看代码写得好不好,底层网络通不通才是关键。端口映射看着简单,真出问题能让你查半天。早点理清楚这些细节,省得半夜被 CI 报警吵醒。