本地Docker与GitHub Action运行FastAPI+HTTPX单元测试结果不一致
在测试FastAPI异步HTTP调用时,本地Docker容器内执行pytest --cov=app /tests/unit/ --asyncio-mode=strict全部测试通过,但推送到GitHub后,GitHub Actions运行测试时出现如下错误:
AssertionError: The following responses are mocked but not requested:
Match all requests
检查未调用的全局mock
错误提示存在未被请求的全局mock,可能是某个测试用例中设置了httpx_mock.add_response()但未触发对应请求,或是fixture中全局添加的mock未被部分测试用到。可以:- 逐个排查测试用例,确保每个添加的mock都有对应的请求触发;
- 对不需要严格断言的测试,添加
@pytest.mark.httpx(assert_all_responses_were_requested=False)临时关闭该检查。
对齐依赖环境版本
GitHub Actions中额外安装了pytest-cov==4.0.0,而本地Docker环境未包含该依赖,可能引发环境差异问题。修改GitHub Actions的依赖安装步骤,直接复用本地的requirements.txt:python -m pip install --upgrade pip pip install -r requirements.txt pip install pytest-cov==4.0.0同时可在本地安装相同版本的pytest-cov,尝试复现问题。
统一异步事件循环策略
本地Python版本为3.9.7,GitHub Actions使用3.9.14,细微版本差异可能导致异步事件循环行为不一致。在测试的conftest.py中显式指定事件循环:import asyncio import pytest @pytest.fixture(scope="session") def event_loop(): policy = asyncio.get_event_loop_policy() loop = policy.new_event_loop() yield loop loop.close()禁用冲突的测试插件
错误日志显示加载了trio-0.7.0插件,可能与pytest-asyncio的事件循环产生冲突。若测试不需要trio,可直接从依赖中移除;或在测试命令中临时禁用该插件:pytest --cov=app tests/unit/ --asyncio-mode=strict -p no:trio清理参数化测试的mock残留
错误发生在参数化测试的teardown阶段,可能是参数化过程中重复添加mock但未正确清理。可在每个测试用例结束后手动重置mock:def test_example(httpx_mock): # 测试逻辑 httpx_mock.reset(assert_all_responses_were_requested=False)或调整fixture的scope,控制mock的生命周期。
内容的提问来源于stack exchange,提问作者writes_on

