Docker及GitHub workflow中Python单元测试的环境变量传递问题
本地Docker+GitHub PR测试环境变量传递解决方案
本地Docker运行单元测试方案
方式1:复用现有镜像,运行时加载环境变量
无需修改现有Dockerfile,构建镜像后在容器启动时挂载本地.env文件并执行测试命令:
# 构建基础镜像 docker build -t app-test . # 运行容器加载.env并执行测试,测试完成自动销毁容器 docker run --rm --env-file .env app-test python -m unittest discover -t src -s tests
方式2:测试专用Dockerfile(可选)
如果需要打包测试依赖,新建Dockerfile.test:
FROM python:3.7-alpine3.15 WORKDIR /app COPY requirements.txt requirements.txt COPY src/ ./src/ COPY tests/ ./tests/ RUN pip3 install -r requirements.txt # 默认执行测试,运行时可覆盖 CMD ["python", "-m", "unittest", "discover", "-t", "src", "-s", "tests"]
运行时同样挂载环境变量文件:
docker build -f Dockerfile.test -t app-test-image . docker run --rm --env-file .env app-test-image
GitHub工作流优化方案
1. 仅在PR触发测试
修改工作流文件(如.github/workflows/test.yml)的触发规则,只针对PR执行:
name: PR Unit Tests on: pull_request: branches: [ main ] # 替换为你的目标分支 jobs: test: runs-on: ubuntu-latest environment: test steps: - name: 拉取代码 uses: actions/checkout@v4 - name: 配置Python 3.7 uses: actions/setup-python@v5 with: python-version: "3.7" cache: 'pip' - name: 安装依赖 run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: 执行单元测试 env: EMAIL: ${{ secrets.EMAIL }} AUTH_KEY: ${{ secrets.AUTH_KEY }} ZONE_NAME: ${{ secrets.ZONE_NAME }} RECORD_ID: ${{ secrets.RECORD_ID }} CHECK_INTERVAL: ${{ secrets.CHECK_INTERVAL }} SENDER_ADDRESS: ${{ secrets.SENDER_ADDRESS }} SENDER_PASSWORD: ${{ secrets.SENDER_PASSWORD }} RECEIVER_ADDRESS: ${{ secrets.RECEIVER_ADDRESS }} run: python -m unittest discover -t src -s tests
2. 环境变量未读取排查
- 确认GitHub仓库
Settings > Environments > test环境下已正确添加所有Secrets; - 检查代码中环境变量读取逻辑,确保用
os.getenv("变量名")且拼写无大小写错误; - 调试时可临时添加打印步骤(敏感变量会被GitHub自动屏蔽):
- name: 调试环境变量 run: | echo "EMAIL: $EMAIL" echo "AUTH_KEY: $AUTH_KEY"
额外建议
- 确保
.env文件已加入.gitignore,避免提交敏感信息; - 单元测试优先使用Mock替代真实环境变量,降低依赖:
from unittest.mock import patch import unittest import os class TestApp(unittest.TestCase): @patch.dict(os.environ, {"AUTH_KEY": "mock-test-key"}) def test_auth_logic(self): # 测试代码 self.assertEqual(os.getenv("AUTH_KEY"), "mock-test-key")
内容的提问来源于stack exchange,提问作者DaruZero
相关产品推荐
相关产品推荐

