You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 16:30:59