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

使用SQLAlchemy异步会话时pytest-cov代码覆盖不全问题求助

问题:SQLAlchemy异步会话下pytest-cov未标记session.get相关代码行

我编写了一个简单的FastAPI脚本,通过SQLAlchemy异步会话执行PostgreSQL查询。已确认session.get相关代码已执行,但pytest-cov并未标记这些代码行;若将get_session改为注释中的同步会话版本,pytest-cov则能正常工作。


app/main.py

from pydantic import BaseModel
from fastapi import FastAPI, Depends

import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm.session import sessionmaker, Session


# Orm
Base = declarative_base()


class TableOrm(Base):
    __tablename__ = "mytable"

    key = sa.Column(sa.String(length=16), primary_key=True)
    value = sa.Column(sa.Float(), nullable=False)


# Dependencies
async def get_session():
    database_uri = (
        "postgresql+asyncpg://***@localhost:5432/playground"
    )
    engine = create_async_engine(database_uri)
    Session = sessionmaker(bind=engine, class_=AsyncSession)

    async with Session() as session:
        yield session


# def get_session():
#     database_uri = "postgresql://***@localhost:5432/playground"
#     engine = create_engine(database_uri)

#     with Session(bind=engine) as session:
#         yield session


# App
app = FastAPI()


@app.get(path="/example")
async def function(key: str, session=Depends(get_session)):
    entity = await session.get(TableOrm, key)

    if entity:
        return {"key": entity.key, "value": entity.value}
    return {"key": key, "value": -1}

app/tests/test_example.py

from httpx import AsyncClient
from app.main import app


async def test_entity_found():
    async with AsyncClient(app=app, base_url="http://test") as client:
        params = {"key": "keyexist"}
        response = await client.get("/example", params=params)

        assert response.status_code == 200

        out = response.json()
        assert out["value"] == 15.0


async def test_entity_not_found():
    async with AsyncClient(app=app, base_url="http://test") as client:
        params = {"key": "keynotexist"}
        response = await client.get("/example", params=params)

        assert response.status_code == 200

        out = response.json()
        assert out["value"] == -1

执行命令及输出

执行命令:
pytest --asyncio-mode=auto --cov=app --cov-report=term-missing app/tests/

输出:

app/tests/test_example.py ..                                                                                                                                                                       [100%]

---------- coverage: platform darwin, python 3.9.12-final-0 ----------
Name                        Stmts   Miss  Cover   Missing
---------------------------------------------------------
app/__init__.py                 0      0   100%
app/main.py                    25      3    88%   50-52
app/tests/__init__.py           0      0   100%
app/tests/test_example.py      16      0   100%
---------------------------------------------------------
TOTAL                          41      3    93%

使用的依赖版本

asyncpg                   0.27.0
coverage                  6.5.0
psycopg2                  2.9.5
pytest                    7.2.0
pytest-asyncio            0.20.1
pytest-cov                4.0.0
SQLAlchemy                1.4.38

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 11:01:13