Django 单元测试 - 创建对象的 ID

Pao*_*olo 4 python django django-unittest

示例模型.py

模型.py

class Food(models.Model):
    name = models.CharField(max_length=50, verbose_name='Food')

    def __str__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

假设我已经编写了单元测试:

from django.test import TestCase
from myapp.models import Food

class TestWhateverFunctions(TestCase):
    """
    This class contains tests for whatever functions.
    """

    def setUp(self):
        """
        This method runs before the execution of each test case.
        """
        Food.objects.create(name='Pizza') # Will the created object have id of 1?
        Food.objects.create(name='Pasta') # Will the created object have id of 2?

    def test_if_food_is_pizza(self):
        """
        Test if the given food is pizza.
        """
        food = Food.objects.get(id=1)

        self.assertEqual(food.name, 'Pizza')

    def test_if_food_is_pasta(self):
        """
        Test if the given food is pasta.
        """
        food = Food.objects.get(id=2)

        self.assertEqual(food.name, 'Pasta')
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以安全地假设setUp() 方法中创建的对象的 id总是从 开始id 1,依此类推?如果不是,是否有特定原因导致测试数据库在运行所有测试后总是被破坏?

wim*_*wim 6

假设 ids 始终从 1 开始并递增是不安全的。如果其他测试事先运行并创建了Food行,并且单元测试不按任何保证的顺序执行,则它们可能具有更高的 id。

保存对测试设置上模型实例的引用:

class TestWhateverFunctions(TestCase):

    def setUp(self):
        self.food1 = Food.objects.create(name='Pizza')
        self.food2 = Food.objects.create(name='Pasta')
Run Code Online (Sandbox Code Playgroud)

  • 测试数据库在测试**会话**结束时被销毁。测试会话可以执行许多不同的测试用例(通常在事务内,但仍然使用相同的测试数据库)。 (3认同)