如何在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
相关产品推荐
相关产品推荐

