首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django rest框架:单元测试数据库问题

Django rest框架:单元测试数据库问题
EN

Stack Overflow用户
提问于 2016-10-05 14:26:01
回答 4查看 3.8K关注 0票数 0

我正在做rest Apis的单元测试。我使用的是django rest框架。Apis用于在数据库中保存数据和从数据库中获取数据。这两个操作都不工作,或者如果它工作,我不能在数据库中看到这一点。Apis也在使用django-fsm,因此我需要来自db的相同数据用于其他测试。由于django-fsm,测试依赖于以前的测试。api的状态总是会发生变化。但现在我在测试运行期间看不到数据库中的任何数据。不知道它将数据保存在哪里或在哪个数据库中。

以下是我的测试设置:

代码语言:javascript
复制
DATABASES = {
'default': {
    'ENGINE': 'django.db.backends.sqlite3',
    'NAME': join(PROJECT_ROOT, 'run', 'db_for_testing.sqlite3'),
    'TEST': {
        'NAME': 'test_db_for_testing',
    },
 },
}

以下是我的api:

代码语言:javascript
复制
class DummyView(CreateAPIView):
    def post(self, request, *args, **kwargs):
        data = request.data.copy()
        serializer = self.get_serializer(data=data)
        serializer.is_valid(raise_exception=True)
        order = self.model(book=serializer.data.get('book'))
        order.save()
        data = {
        'status_code': 200,
        'message': 'successfully.'
        }
        return Response(data, status=status.HTTP_200_OK)

由于我的测试依赖于将数据保存到db的前一次测试,因此其他测试也会失败。我使用的是rest_framework的APITestCase。帮帮大伙。提前谢谢。

EN

回答 4

Stack Overflow用户

发布于 2016-10-05 14:50:28

如果我没理解错的话,Django会在每次测试(回滚或截断)后“清除”数据库。因此,您需要编写相应的测试。

请参阅:https://docs.djangoproject.com/en/1.10/topics/testing/tools/#transactiontestcase

票数 1
EN

Stack Overflow用户

发布于 2017-12-07 04:59:29

TL;DR -解决方案:使用SimpleTestCase -参见下面的示例

解释

问题是,Django为涉及数据库查询的测试提供的推荐测试类,TransactionTestCase和子类TestCase,将每个测试包装在一个事务中,以加快每次测试后重置数据库的过程。来源:Django TransactionTestCase docs

可以通过使用TransactionTestCase的父类SimpleTestCase来避免此行为。然后,您必须通过将allow_database_queries设置为True-来显式指定允许数据库查询。

还请注意,您将负责测试后需要执行的任何清理工作。您可以通过覆盖tearDownClass类方法来做到这一点。类似地,在运行测试之前,任何初始化都有一个setUpClass类方法。记得调用超方法。See full details in the docs

示例

代码语言:javascript
复制
from django.test import SimpleTestCase

class MyTestCase(SimpleTestCase):
    allow_database_queries = True

    @classmethod
    def setUpClass(cls):
        # Do your pre test initialization here.
        super(MyTestCase, cls).setUpClass()

    @classmethod
    def tearDownClass(cls):
        # Do your post test clean uphere.
        super(MyTestCase, cls).tearDownClass()

    def test_add_data_through_api(self):
        # Add 'dat data
        ...

    def test_work_with_data_from_previous_test(self):
        # Work 'dat data
        ...
票数 1
EN

Stack Overflow用户

发布于 2019-01-02 23:29:23

在调用manage.py测试时使用--keepdb选项:

https://docs.djangoproject.com/en/2.1/ref/django-admin/#cmdoption-test-keepdb

它是从django 1.8开始提供的。希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39866805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档