使用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
相关产品推荐
相关产品推荐

