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

如何在pytest中设置环境变量及配置Moto模拟AWS凭证?

问题解答

一、测试前设置环境变量some_var的方法

你需要在pytest运行测试前注入环境变量some_var,推荐以下两种可靠方式:

1. 使用monkeypatch fixture(推荐)

monkeypatch是pytest内置的fixture,可以安全修改环境变量,测试结束后自动恢复原有值,避免污染其他测试。在conftest.py中添加:

import pytest

@pytest.fixture(autouse=True)
def set_test_env(monkeypatch):
    # autouse=True 会自动作用于所有测试用例,无需手动传入
    monkeypatch.setenv("some_var", "你的测试值")

如果只需要给特定测试用例设置,去掉autouse=True,在测试函数中传入该fixture即可:

def test_list_posts(set_test_env):
    # 测试逻辑

2. 通过pytest命令行参数临时设置

运行测试时直接在命令行指定环境变量:

some_var=测试值 pytest tests/

二、Moto模拟AWS凭证的正确配置

你的配置存在三个核心问题:未激活mock_s3、凭证fixture未被调用、main.py中boto3客户端初始化时机错误,修正步骤如下:

1. 修复conftest.py,激活mock并设置凭证

使用monkeypatch设置凭证,并确保mock_s3在测试期间处于激活状态:

import pytest
import boto3
from moto import mock_s3

@pytest.fixture(autouse=True)
def mock_aws_environment(monkeypatch):
    # 设置伪造的AWS凭证
    monkeypatch.setenv("AWS_ACCESS_KEY_ID", "testing")
    monkeypatch.setenv("AWS_SECRET_ACCESS_KEY", "testing")
    monkeypatch.setenv("AWS_DEFAULT_REGION", "us-east-1")

@pytest.fixture
def mock_s3_bucket(mock_aws_environment):
    # 启动S3 mock,并提前创建测试用Bucket
    with mock_s3():
        s3_client = boto3.client("s3")
        s3_client.create_bucket(Bucket="test-bucket")  # 替换为你的业务Bucket名
        yield s3_client

2. 修正测试文件的App导入与客户端初始化

你的test_main.py中错误地创建了新的FastAPI实例,应该导入main.py中的真实App;同时,由于main.py中的s3_client是模块加载时创建的,需要在mock激活后重新导入main模块,确保客户端使用mock凭证:

from fastapi.testclient import TestClient
import importlib
import main

test_client = TestClient(main.app)

def test_list_posts(mock_s3_bucket):
    # 重新导入main模块,确保s3_client使用mock后的凭证
    importlib.reload(main)
    response = test_client.get("/posts")
    assert response.status_code == 200

关键注意事项

  • mock_s3必须在boto3.client("s3")创建前激活,否则客户端会尝试连接真实AWS服务;
  • 使用importlib.reload(main)可以重新初始化main.py中的模块级变量(如s3_client),确保其使用mock环境;
  • 务必确保测试用的Bucket名与业务代码中一致,否则会出现Bucket不存在的错误。

内容的提问来源于stack exchange,提问作者haju

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 12:48:22