使用postgres数据库进行测试的pytest插件和帮助程序。
pytest-pgsql的Python项目详细描述
为测试清理PostgreSQL数据库
下面是完整的pytest_pgsql文档的摘要,这些文档是可用的 在ReadTheDocs上。
什么是pytest_pgsql?
pytest_pgsql是一个pytest插件,您可以使用它 编写使用临时postgresql数据库的单元测试 每次测试运行后自动启动,允许每个测试在 清理数据库(有一些限制)。
该插件提供了两个可以在测试中使用的fixture:postgresql_db和 transacted_postgresql_db。这两种方法都提供了相似的访问接口 到数据库,但有稍微不同的用例(见下文)。
样本使用
您可以使用会话、连接或引擎-选择权在您。 postgresql_db和transacted_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_db和transacted_postgresql_db提供一些通用的 用于简化测试设置和执行的函数。
- 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。