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')[源代码]

基类:SimpleTestCase

一个具有 asyncio 功能的测试类,将确保为每个测试提供一个隔离的测试数据库。

如果你的测试需要完全隔离,请使用此类。

请注意,将 {} 用作字符串替换参数,用于你的 DB_URL。这将创建一个随机的数据库名称。

它将为每个测试创建一个新的数据库实例并销毁该实例。这显然很慢,但可以保证数据库是全新的。

如果你定义了 tortoise_test_modules 列表,它将覆盖测试的数据库设置模块。

tortoise_test_modules : 可迭代对象[str | 模块] = []
tortoise.contrib.test.SimpleTestCase(methodName='runTest')[源代码]

基类:IsolatedAsyncioTestCase

Tortoise 基本测试类。

这将确保你的数据库环境有一个可用于测试的测试替身。

一个具有 asyncio 功能的测试类,提供了一些帮助函数。

将运行任何 test_*() 函数,作为同步或异步函数,具体取决于函数的签名。如果你指定 async test_*(),那么它将在事件循环中运行该函数。

基于 asynctest

assertListSortEqual(list1, list2, msg=Ellipsis, sorted_key=None)[source]
返回类型:

async asyncSetUp()[source]
返回类型:

async asyncTearDown()[source]
返回类型:

exception tortoise.contrib.test.SkipTest[source]

基类:Exception

在测试中引发此异常以跳过它。

通常,你可以使用 TestCase.skipTest() 或其中一个跳过装饰器,而不是直接引发此异常。

class tortoise.contrib.test.TestCase(methodName='runTest')[source]

基类:TruncationTestCase

一个有能力的 asyncio 测试类,它将确保每个测试都将运行在单独的事务中,该事务将在完成时回滚。

这是一个快速的测试运行器。如果你的测试使用事务,请不要使用它。

async asyncSetUp()[source]
返回类型:

async asyncTearDown()[source]
返回类型:

class tortoise.contrib.test.TruncationTestCase(methodName='runTest')[source]

基类:SimpleTestCase

一个有能力的 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.expectedFailure(test_item)[source]

将测试标记为预期失败。

如果成功,则将其标记为意外成功。

tortoise.contrib.test.finalizer()[source]

测试后清理数据库。必须作为测试环境拆除的一部分调用。

返回类型:

tortoise.contrib.test.getDBConfig(app_label, modules)[source]

用于测试的数据库配置工厂。

参数:
app_label

应用程序的标签(对于多个应用程序必须不同)。

modules

要查找模型的模块列表。

返回类型:

dict

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__’].

用法

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]

为测试设置数据库。必须作为测试环境设置的一部分进行调用。

参数:
modules

要查找模型的模块列表。

db_url=None

db_url,默认为 sqlite://:memory

app_label='models'

要初始化模块的 APP 的名称,默认为“models”

loop=None

可选事件循环。

返回类型:

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):
    ...
参数:
connection_name='models'

要从中检索功能的连接的名称。

**conditions

功能测试,所有测试都必须通过才能运行测试。

返回类型:

Callable

tortoise.contrib.test.skip(reason)[source]

无条件跳过测试。

tortoise.contrib.test.skipIf(condition, reason)[source]

如果条件为真,则跳过测试。

tortoise.contrib.test.skipUnless(condition, reason)[source]

除非条件为真,否则跳过测试。