跳转到主要内容

Django应用程序,为在`setUpTestData`期间创建的模型实例提供隔离。

项目描述

License Latest Version https://img.shields.io/github/workflow/status/charettes/django-testdata/CI/master Coverage Status Supported Python Versions Wheel Status

Django应用程序,为在setUpTestData期间创建的模型实例提供隔离。

注意: 此包已合并到Django并发布在版本3.2中(见PR #12608)。

安装

pip install django-testdata

动机

Django 1.8引入了TestCase.setUpTestData,以允许在测试类中仅执行一次代价高昂的模型固定数据生成,从而加快测试实例的执行。

然而,setUpTestData的一个问题是,所有测试实例都共享相同的模型实例,并且必须小心不要修改它们,以防止破坏测试隔离。请参阅Django的文档

Be careful not to modify any objects created in setUpTestData() in your
test methods. Modifications to in-memory objects from setup work done at
the class level will persist between test methods. If you do need to modify
them, you could reload them in the setUp() method with refresh_from_db(),
for example.

setUp()中重新加载对象当然可行,但这似乎违背了最初避免数据库调用以加速测试执行的目的。既然所有数据都已存在于内存中,从数据库中获取模型实例就没有什么意义。

此包提供了一种不同的替代方案来绕过setUpTestData的这种怪癖。不同于从数据库中重新加载对象,setUpTestData期间分配为类属性的模型实例在测试用例实例访问时进行惰性深度复制。测试期间的所有深度复制都使用共享的memo,以确保对象在内存中的关系得到保留。

使用方法

测试数据可以通过使用testdata手动包装

from django.test import TestCase
from testdata import testdata

from .models import Author, Book

class BookTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.author = testdata(Author.objects.create(
            name='Milan Kundera',
        ))
        cls.book = testdata(cls.author.books.create(
            title='Nesnesitelná lehkost bytí',
        ))

或者通过使用wrap_testdata装饰器自动包装

from django.test import TestCase
from testdata import wrap_testdata

from .models import Author, Book

class BookTests(TestCase):
    @classmethod
    @wrap_testdata
    def setUpTestData(cls):
        cls.author = Author.objects.create(
            name='Milan Kundera',
        )
        cls.book = cls.author.books.create(
            title='Nesnesitelná lehkost bytí',
        )

在内部,wrap_testdatasetUpTestData()执行期间添加到cls的所有属性包装到testdata(attr, name=name)中。

一旦测试数据被包装,测试用例实例方法可以修改从self获取的对象,而无需担心跨测试隔离问题。

from django.test import TestCase
from testdata import wrap_testdata

from .models import Author, Book

class BookTests(TestCase):
    @classmethod
    @wrap_testdata
    def setUpTestData(cls):
        cls.author = Author.objects.create(
            name='Milan Kundera',
        )
        cls.book = cls.author.books.create(
            title='Nesnesitelná lehkost bytí',
        )

    def test_book_name_english(self):
        self.assertEqual(self.book.title, 'Nesnesitelná lehkost bytí')
        self.book.title = 'The Unbearable Lightness of Being'
        self.book.save()

    def test_book_name_french(self):
        self.assertEqual(self.book.title, 'Nesnesitelná lehkost bytí')
        self.book.title = "L'Insoutenable Légèreté de l'être"
        self.book.save()

项目详情


下载文件

下载适用于您平台的文件。如果您不确定该选择哪个,请了解更多关于安装软件包的信息。

源代码分发

django-testdata-1.0.3.tar.gz (5.5 kB 查看哈希值)

上传时间: 源代码

构建分发

django_testdata-1.0.3-py2.py3-none-any.whl (5.6 kB 查看哈希值)

上传时间: Python 2 Python 3

支持者: