使用postgres数据库进行测试的pytest插件和帮助程序。

pytest-pgsql的Python项目详细描述


为测试清理PostgreSQL数据库

下面是完整的pytest_pgsql文档的摘要,这些文档是可用的 在ReadTheDocs上。

什么是pytest_pgsql

pytest_pgsql是一个pytest插件,您可以使用它 编写使用临时postgresql数据库的单元测试 每次测试运行后自动启动,允许每个测试在 清理数据库(有一些限制)。

该插件提供了两个可以在测试中使用的fixture:postgresql_dbtransacted_postgresql_db。这两种方法都提供了相似的访问接口 到数据库,但有稍微不同的用例(见下文)。

样本使用

您可以使用会话、连接或引擎-选择权在您。 postgresql_dbtransacted_postgresql_db都为您提供会话,但是 postgresql_db公开其引擎,transacted_postgresql_db公开其 连接:

def test_orm(postgresql_db):
    instance = Person(name='Foo Bar')
    postgresql_db.session.add(instance)
    postgresql_db.session.commit()
    with postgresql_db.engine.connect() as conn:
        do_thing(conn)

def test_connection(transacted_postgresql_db):
    instance = Person(name='Foo Bar')
    transacted_postgresql_db.session.add(instance)
    transacted_postgresql_db.session.commit()

    transacted_postgresql_db.connection.execute('DROP TABLE my_table')

功能

以下是提供给您的一些功能的非详尽列表 数据库设备。

操纵时间

两个数据库设备都使用freezegun来 允许您在一个代码块中冻结时间。你可以把它用在 方式:

作为上下文管理器:

with postgresql.time.freeze('December 31st 1999 11:59:59 PM') as freezer:
    # Time is frozen inside the database *and* Python.
    now = postgresql_db.session.execute('SELECT NOW()').scalar()
    assert now.date() == datetime.date(1999, 12, 31)
    assert datetime.date.today() == datetime.date(1999, 12, 31)

    # Advance time by 1 second so we roll over into the new year
    freezer.tick()

    now = postgresql_db.session.execute('SELECT NOW()').scalar()
    assert now.date() == datetime.date(2000, 1, 1)

作为装饰师:

@pytest_pgsql.freeze_time(datetime.datetime(2038, 1, 19, 3, 14, 7))
def test_freezing(postgresql_db):
    today = postgresql_db.session.execute(
        "SELECT EXTRACT('YEAR' FROM CURRENT_DATE)").scalar()
    assert today.year == 2038
    assert datetime.date.today() == datetime.date(2038, 1, 19)

还有更多!

通用函数

postgresql_dbtransacted_postgresql_db提供一些通用的 用于简化测试设置和执行的函数。

    ^ TT11}$将CSV文件加载到现有表中。
  • run_sql_file()执行一个sql脚本,可以选择执行变量绑定。

扩展管理

因为9.1版Postgres支持extensions。 您可以检查是否存在这样的扩展并安装它们:

>>> postgresql_db.is_extension_available('asdf')  # Can I install this extension?
False
>>> postgresql_db.is_extension_available('uuid-ossp')  # Maybe this one is supported...
True
>>> postgresql_db.install_extension('uuid-ossp')
True
>>> postgresql_db.is_extension_installed('uuid-ossp')
True

install_extension()有其他参数,允许控制哪个架构 扩展已安装在中,如果扩展已安装,该怎么办, 等等。有关这些功能的说明,请参见文档。

模式和表

您可以创建table schemas 通过调用create_schema()like so:

postgresql_db.create_schema('foo')          # Create one schema
postgresql_db.create_schema('foo', 'bar')   # Create multiple ones
<>快速查看表模式是否存在,调用^ {tt15} $:

>>> postgresql_db.has_schema('public')
True

类似地,可以使用create_table()在数据库中创建表。你可以 传递sqlalchemyTable实例或orm声明性模型类:

# Just a regular Table.
my_table = Table('abc', MetaData(), Column('def', Integer()))

# A declarative model works too.
class MyORMModel(declarative_base()):
    id = Column(Integer, primary_key=True)

# Pass a variable amount of tables to create
postgresql_db.create_table(my_table, MyORMModel)

安装

抱歉,此库与Python2不兼容。请确保使用pip3,而不是 pip安装时:

pip3 install pytest-pgsql

贡献指南

有关为开发和贡献设置pytest_pgsql的信息 更改,查看CONTRIBUTING.rst

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何创建带有图标的按钮?   java我想实现定制的Android应用程序物理键盘键,我需要修改qwerty吗。kl文件或如何添加新的键盘映射?   java Toast并没有显示在Android应用程序中,但它首先被显示,然后在两天后停止   java如何检查URLConnection是否已处于连接状态?   java无法访问其他类中的方法(Android Studio)   java无法获取访问字符串中字符的方法   使用jdax/dex2jar反编译后的java类   java如何使用Junit获取数据块报告   如何在java/j2ee中以编程方式为新闻网站生成RSS?   java如何使用已声明的事实类型动态重新加载规则?   java单例模式使用   javaq:Mockito使用@Mock和@Autowired   java在Raspberry Pi上将RXTX集成到OSGi包时未解决的需求