如何明确指示 PyTest 在某些测试后删除数据库?

How to explicitly instruct PyTest to drop a database after some tests?

我正在使用 pytest-django 为 Django 应用编写单元测试。我想让我的测试性能更高,这样做要求我将数据保存在数据库中一段时间​​,而不是仅在一次测试后将其丢弃。例如:

@pytest.mark.django_db
def test_save():
    p1 = MyModel.objects.create(description="some description") # this object has the id 1
    p1.save()

@pytest.mark.django_db
def test_modify():
    p1 = MyModel.objects.get(id=1)
    p1.description = "new description"
    

我想知道如何将两个测试分开,但两者都会使用相同的测试数据库一段时间,然后将其删除。

我认为你需要的是 pytest fixtures。它们允许您创建将在测试期间使用的对象(如果需要则存储在数据库中)。您可以查看可以设置的 pytest fixtures 范围,这样 fixture 就不会从数据库中删除并为每个需要它的测试重新加载,而是为一堆测试创建一次并在之后删除。

您应该阅读 pytest fixtures 的文档 (https://docs.pytest.org/en/6.2.x/fixture.html) and the section dedicated to fixtures' scope (https://docs.pytest.org/en/6.2.x/fixture.html#scope-sharing-fixtures-across-classes-modules-packages-or-session)。