UnitTest 支持¶
Tortoise ORM 包含其自己的帮助程序实用工具,以协助单元测试。
用法¶
from tortoise.contrib import test
class TestSomething(test.TestCase):
def test_something(self):
...
async def test_something_async(self):
...
@test.skip('Skip this')
def test_skip(self):
...
@test.expectedFailure
def test_something(self):
...
要使 test.TestCase
按预期工作,您需要配置您的测试环境设置并拆除以调用以下内容
from tortoise.contrib.test import initializer, finalizer
# In setup
initializer(['module.a', 'module.b.c'])
# With optional db_url, app_label and loop parameters
initializer(['module.a', 'module.b.c'], db_url='...', app_label="someapp", loop=loop)
# Or env-var driven → See Green test runner section below.
env_initializer()
# In teardown
finalizer()
在 DB_URL 上,它应遵循以下标准
TORTOISE_TEST_DB=sqlite:///tmp/test-{}.sqlite TORTOISE_TEST_DB=postgres://postgres:@127.0.0.1:5432/test_{}
{}
是字符串替换参数,它将创建一个随机数据库名称。这目前是 test.IsolatedTestCase
正常运行所必需的。如果您不使用 test.IsolatedTestCase
,则可以提供绝对地址。SQLite 内存 :memory:
数据库始终有效,并且是默认值。
测试运行器¶
Green¶
在您的 .green
文件中
initializer = tortoise.contrib.test.env_initializer
finalizer = tortoise.contrib.test.finalizer
然后使用以逗号分隔的模块路径列表定义 TORTOISE_TEST_MODULES
环境变量。
此外,您可以将数据库配置参数设置为环境变量(默认为 sqlite://:memory:
)
TORTOISE_TEST_DB=sqlite:///tmp/test-{}.sqlite TORTOISE_TEST_DB=postgres://postgres:@127.0.0.1:5432/test_{}
Py.test¶
注意
pytest 5.4.0 和 5.4.1 存在一个错误,阻止它与异步测试用例一起使用。您可能需要安装 pytest>=5.4.2
才能使其正常工作。
在您的 conftest.py
文件中运行初始化程序和终结程序
import os
import pytest
from tortoise.contrib.test import finalizer, initializer
@pytest.fixture(scope="session", autouse=True)
def initialize_tests(request):
db_url = os.environ.get("TORTOISE_TEST_DB", "sqlite://:memory:")
initializer(["tests.testmodels"], db_url=db_url, app_label="models")
request.addfinalizer(finalizer)
Nose2¶
通过命令行加载插件 tortoise.contrib.test.nose2
nose2 --plugin tortoise.contrib.test.nose2 --db-module tortoise.tests.testmodels
或通过配置文件
[unittest]
plugins = tortoise.contrib.test.nose2
[tortoise]
# Must specify at least one module path
db-module =
tests.testmodels
# You can optionally override the db_url here
db-url = sqlite://testdb-{}.sqlite
参考¶
-
类 tortoise.contrib.test.IsolatedTestCase(methodName=
'runTest'
)[源代码]¶ -
一个具有 asyncio 功能的测试类,将确保为每个测试提供一个隔离的测试数据库。
如果你的测试需要完全隔离,请使用此类。
请注意,将
{}
用作字符串替换参数,用于你的 DB_URL。这将创建一个随机的数据库名称。它将为每个测试创建一个新的数据库实例并销毁该实例。这显然很慢,但可以保证数据库是全新的。
如果你定义了
tortoise_test_modules
列表,它将覆盖测试的数据库设置模块。-
tortoise_test_modules : 可迭代对象[str | 模块] =
[]
¶
-
tortoise_test_modules : 可迭代对象[str | 模块] =
-
类 tortoise.contrib.test.SimpleTestCase(methodName=
'runTest'
)[源代码]¶ 基类:
IsolatedAsyncioTestCase
Tortoise 基本测试类。
这将确保你的数据库环境有一个可用于测试的测试替身。
一个具有 asyncio 功能的测试类,提供了一些帮助函数。
将运行任何
test_*()
函数,作为同步或异步函数,具体取决于函数的签名。如果你指定async test_*()
,那么它将在事件循环中运行该函数。基于 asynctest
- exception tortoise.contrib.test.SkipTest[source]¶
基类:
Exception
在测试中引发此异常以跳过它。
通常,你可以使用 TestCase.skipTest() 或其中一个跳过装饰器,而不是直接引发此异常。
-
class tortoise.contrib.test.TestCase(methodName=
'runTest'
)[source]¶ -
一个有能力的 asyncio 测试类,它将确保每个测试都将运行在单独的事务中,该事务将在完成时回滚。
这是一个快速的测试运行器。如果你的测试使用事务,请不要使用它。
-
class tortoise.contrib.test.TruncationTestCase(methodName=
'runTest'
)[source]¶ -
一个有能力的 asyncio 测试类,它将在测试后截断表。
当你的测试包含事务时,使用这个。
这比
TestCase
慢,但比IsolatedTestCase
快。请注意,使用此方法并不能保证自动编号 pks 将重置为 1。
- tortoise.contrib.test.env_initializer()[source]¶
使用从环境变量映射的参数调用
initializer()
。TORTOISE_TEST_MODULES
:一个要包含的模块的逗号分隔列表(必需)
TORTOISE_TEST_APP
:要在其中初始化模块的 APP 的名称(可选)
如果没有提供,它将默认为“models”。
TORTOISE_TEST_DB
:测试数据库的 db_url。(可选)
如果没有提供,它将默认为一个内存中的 SQLite DB。
- 返回类型:¶
无
-
tortoise.contrib.test.init_memory_sqlite(models: str | list[str] | None =
None
) Callable[[...], Callable[[P], Coroutine[None, None, T]]] [source]¶ - tortoise.contrib.test.init_memory_sqlite(models: Callable[][P], Coroutine[None, None, T]]) Callable[][P], Coroutine[None, None, T]]
单文件样式,使用内存 sqlite 运行代码
- 参数:¶
- models: str | list[str] | None =
None
¶ - models: Callable[[P], Coroutine[None, None, T]]
list_of_modules that should be discovered for models, default to [‘__main__’].
- models: str | list[str] | None =
用法
from tortoise import fields, models, run_async from tortoise.contrib.test import init_memory_sqlite class MyModel(models.Model): id = fields.IntField(primary_key=True) name = fields.TextField() @init_memory_sqlite async def run(): obj = await MyModel.create(name='') assert obj.id == 1 if __name__ == '__main__' run_async(run)
自定义模型示例
@init_memory_sqlite(models=['app.models', 'aerich.models']) async def run(): ...
- 返回类型:¶
Union
[Callable
[[~P],Coroutine
[None
,None
, ~T]],Callable
[…,Callable
[[~P],Coroutine
[None
,None
, ~T]]]]
-
tortoise.contrib.test.initializer(modules, db_url=
None
, app_label='models'
, loop=None
)[source]¶ 为测试设置数据库。必须作为测试环境设置的一部分进行调用。
-
tortoise.contrib.test.requireCapability(connection_name=
'models'
, **conditions)[source]¶ 如果未匹配所需功能,则跳过测试。
注意
在装饰的测试运行之前必须初始化数据库。
用法
@requireCapability(dialect='sqlite') async def test_run_sqlite_only(self): ...
或有条件地跳过一个类
@requireCapability(dialect='sqlite') class TestSqlite(test.TestCase): ...