我正在做rest Apis的单元测试。我使用的是django rest框架。Apis用于在数据库中保存数据和从数据库中获取数据。这两个操作都不工作,或者如果它工作,我不能在数据库中看到这一点。Apis也在使用django-fsm,因此我需要来自db的相同数据用于其他测试。由于django-fsm,测试依赖于以前的测试。api的状态总是会发生变化。但现在我在测试运行期间看不到数据库中的任何数据。不知道它将数据保存在哪里或在哪个数据库中。
以下是我的测试设置:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': join(PROJECT_ROOT, 'run', 'db_for_testing.sqlite3'),
'TEST': {
'NAME': 'test_db_for_testing',
},
},
}以下是我的api:
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。帮帮大伙。提前谢谢。
发布于 2016-10-05 14:50:28
如果我没理解错的话,Django会在每次测试(回滚或截断)后“清除”数据库。因此,您需要编写相应的测试。
请参阅:https://docs.djangoproject.com/en/1.10/topics/testing/tools/#transactiontestcase
发布于 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
示例
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
...发布于 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开始提供的。希望这能有所帮助。
https://stackoverflow.com/questions/39866805
复制相似问题