为什么Django中的测试用例在Python intrepreter中返回True时失败?

时间:2015-06-19 14:21:58

标签: python django django-testing

当我在Python解释器中运行此代码时,它返回True:

>>> from movies.models import Movie
>>> movie_list = Movie.objects.all()
>>> bool(movie_list)
True

当我运行我的测试用例python3 manage.py test movies时,它失败了:

from django.test import TestCase
from .models import Movie

class QuestionMethodTests(TestCase):

    def test_movie_list_empty(self):
        movie_list = Movie.objects.all()
        self.assertEqual(bool(movie_list), True)

我错过了什么?测试不应该通过吗?

2 个答案:

答案 0 :(得分:2)

  

我明白了。这是否意味着测试用例仅测试代码但不能使用   其测试中的任何实际数据库内容?

默认情况下没有,你也不想搞砸实际的数据库, 有一种通常的方法来为测试提供初始对象(实际的源可能不同,例如从文件加载)

from django.test import TestCase
from .models import Movie

class QuestionMethodTests(TestCase):

    def setUp(self):
        # You can create your movie objects here
        Movie.objects.create(title='Forest Gump', ...)

    def test_movie_list_empty(self):
        movie_list = Movie.objects.all()
        self.assertEqual(bool(movie_list), True)

TestCase类还包含setUpTestData方法,如果你喜欢它,https://docs.djangoproject.com/en/1.8/topics/testing/tools/#django.test.TestCase.setUpTestData

PS:test_movie_list_empty名称听起来很奇怪,因为它似乎测试电影列表不是空的

答案 1 :(得分:0)

因为在tests you are using a temporary database中没有对象:

  

需要数据库的测试(即模型测试)将不会使用您的   “真实”(生产)数据库。创建单独的空白数据库   进行测试。

     

无论测试通过还是失败,测试数据库都是   所有测试都已执行时被销毁。

使用真实数据库进行测试很危险。特别是测试应该可以在其他机器上重现。你应该使用灯具进行测试。请看factory_boy