跳转到主要内容

使用SQLAlchemy asyncio API进行数据库测试的固定装置

项目描述

pytest-async-sqlalchemy

PyPI version Python versions

使用SQLAlchemy asyncio API进行数据库测试的固定装置

您可以通过pipPyPI安装"pytest-async-sqlalchemy"

$ pip install pytest-async-sqlalchemy

设置

提供会话范围的事件循环

首先要做的是声明一个范围设置为"session"的even_loop固定装置。您可以将下面的代码复制并粘贴到您的conftest.py

@pytest.fixture(scope="session")
def event_loop():
    """
    Creates an instance of the default event loop for the test session.
    """
    if sys.platform.startswith("win") and sys.version_info[:2] >= (3, 8):
        # Avoid "RuntimeError: Event loop is closed" on Windows when tearing down tests
        # https://github.com/encode/httpx/issues/914
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

    loop = asyncio.new_event_loop()
    yield loop
    loop.close()

这是必需的,因为pytest-async-sqlalchemy出于性能原因在测试之间共享数据库连接,但pytest-asyncio定义的默认even_loop固定装置是函数范围的1(即,在每个测试后杀死数据库连接)。

提供数据库URL和初始化

pytest-async-sqlalchemy提供了用于配置和初始化测试数据库的占位符:database_urlinit_database。这两个必须在您的项目conftest.py中定义,如下所示

@pytest.fixture(scope="session")
def _database_url():
    return "postgresql+asyncpg://postgres:masterkey@localhost/dbtest"


@pytest.fixture(scope="session")
def init_database():
    from myprorject.db import metadata

    return metadata.create_all

_database_url必须是一个会话范围的固定装置,它返回SQLAlchemy标准中的数据库URL。init_database也必须是一个会话范围的固定装置,它返回用于初始化数据库的可调用函数(在大多数情况下,这会返回metadata.create_all函数)。

用法

本插件提供了以下配置项

  • db_session:一个绑定到测试会话数据库的AsyncSession对象。每次测试函数执行后都会丢弃数据库事务,因此整个测试套件使用相同的数据库(避免了每次测试都要初始化数据库的开销)。
  • database:指向初始化测试会话数据库的URL。
  • scoped_databasescoped_database在测试函数的作用域内提供一个新的数据库。配置项的值是一个指向数据库的字符串URL。

贡献

非常欢迎贡献。可以使用tox运行测试,请在提交拉取请求之前确保覆盖率至少保持不变。

许可协议

MIT许可条款下分发,“pytest-async-sqlalchemy”是免费和开源软件。


1. pytest-async-sqlalchemy无法提供自己的even_loop,因为pytest插件无法覆盖彼此的配置项。因此,我们目前唯一可行的解决方案是要求用户声明自己的event_loop配置项。欢迎提出如何更好地解决这个问题的方法,在问题部分联系我们。

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于安装软件包的信息。

源分发

pytest-async-sqlalchemy-0.2.0.tar.gz (5.3 kB 查看哈希值)

上传时间

构建分发

pytest_async_sqlalchemy-0.2.0-py3-none-any.whl (5.7 kB 查看哈希值)

上传时间 Python 3

由以下组织支持