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

本地Docker与GitHub Action运行FastAPI+HTTPX单元测试结果不一致

问题:本地Docker测试通过,GitHub Actions中pytest-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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 16:55:24