PostgreSQL的Pytest设备
lathorp的Python项目详细描述
Lathorp-PostgreSQL测试夹具
lathorp为涉及访问postgresql数据库的测试代码提供了方便的pytest fixtures。
例如,如果测试下的代码将数据写入数据库,或查询数据库中的数据,则需要编写测试以查看 它按您所期望的方式写入和读取数据。 您需要一个隔离和控制的环境来进行测试,因此您需要为 测试并用已知数据填充它。 设置一个新的数据库是一个相对耗时的操作,会减慢测试速度。你想这么做 每个测试会话只需要一次,让多个测试共享同一个临时数据库实例。 但是,许多测试应该彼此隔离-您不希望测试产生副作用(例如,写入 数据库)泄漏到另一个测试。解决方案是在每次测试之前写入已知数据,然后在测试之后将其全部删除 测试已经完成。
固定装置
pg
fixture是一个会话范围的fixture,它在每个测试会话中创建一个新的临时数据库并删除
会议结束后。
pg_connect
fixture是一个函数范围的fixture,用于建立到临时数据库的连接。
可以选择在测试开始之前将数据加载到数据库中,方法是指向postgresql可以
阅读。在测试函数返回后,数据会被自动删除,这样它就不会泄漏给
可能需要不同的数据。
实用功能
可以使用名为load_schema_definitions
的实用函数通过读取sql ddl创建数据库结构
你提供的文件。将它嵌入到您自己的会话范围的fixture中,并与pg_connect
一起调用它。
另一个实用程序copy_data
以csv或文本格式(postgresql支持)从文件中复制数据。
它可以直接使用,也可以通过将文件路径传递给pg_connect
fixture来自动使用。
第三个实用程序delete_data
从一组表中删除所有数据。
它由pg_connect
自动用于从它加载的表中删除数据copy_data
。
您还可以直接使用它来清除测试所做的任何更改。
在项目中使用Lathorp
- 在项目的开发包中包含
lathorp
包。 使用pipenv
:
pipenv install --dev lathorp
从测试中的
lathorp
导入fixture。您还可以在conftest.py
中导入它们,使它们对所有人都可用 你的测试。有关示例,请参见本项目中的tests/conftest.py
。将
pg
或pg_connect
作为参数添加到测试函数中,如下所示。没有必要再加上 两者都是,因为pg_connect
本身使用pg
。
defmy_test(pg_connect):"""A test that connects to the temporary test database."""withpg_connect()asconn:withconn.cursor()ascursor:cursor.execute("SELECT 'Hello, world!' AS hello;")
有关更多示例,请参见本项目中的tests/test_fixtures.py
。
当您将lathorp与模式定义(sql ddl)文件和测试数据文件(csv或 PostgreSQL可读文本)。 创建一个会话范围的fixture,它调用
load_schema_definitions
,并为它提供模式定义的路径。 然后将这个fixture与pg_connect
一起使用,并为它提供数据文件的路径。# In conftest.pyimportpathlibfromlathorpimportload_schema_definitionsfromlathorp.fixturesimportpgfromlathorp.fixturesimportpg_connectdefinit_schema(pg):load_schema_definitions(pathlib.Path('path/to/my/ddl/file_or_directory'))# In your test moduledeftest_my_fun(init_schema,pg_connect):conn=pg_connect(pathlib.Path('path/to/my_table.csv'))# loads data into my_tablewithconn.cursor()ascursor:cursor.execute('SELECT * FROM my_table;')
现在,每个测试都可以使用特定于测试的数据访问已初始化的数据库。
为什么是“拿铁”?
名称是对Dr. Emmett Lathorp "Doc" Brown的引用, 从回到未来的德洛林时间机器的疯狂科学家和发明家。
Lathorp库也允许您在每次测试后及时返回到一个新的数据库。