跨 Django 测试用例共享的测试数据库

2024-10-04 01:25:29 发布

您现在位置:Python中文网/ 问答频道 /正文

简介

我正在为一个Django项目编写单元测试,其中一些DB条目是从一个文件加载的。解析文件并创建所有条目的成本很高

应用程序有不同的模块要测试,所以我为每个模块实现一个TestCase

问题

模块依赖于从文件解析的数据(即,它们需要相同的数据库),但我负担不起为所有不同的TestCase重新设置数据库,如下所示:

class TestBehavior_A(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

class TestBehavior_B(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

class TestBehavior_C(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

我也不能将所有的测试用例合并到同一个类中,否则会一团糟

理想情况下

我想在所有测试用例中共享一个设置(即只调用setUpClass一次)

有类似的东西:

class TestBase(TestCase):
    @classmethod
    def setUpClass(cls):
        super().setUpClass()
        expensive_db_init()

   class TestBehavior_A(TestCase):
       pass

   class TestBehavior_B(TestCase):
       pass

   class TestBehavior_C(TestCase):
       pass

Tags: 模块文件数据库dbinitdefpasstestcase
2条回答

库模块:unittest

子类来自django.test.TestCase,后者是unittest.TestCase的子类

from django.test import TestCase

from myapp.models import Animal

class AnimalTestCase(TestCase):

    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")
        self.assertEqual(lion.speak(), 'The lion says "roar"')
        self.assertEqual(cat.speak(), 'The cat says "meow"')   

运行测试:

使用项目的manage.py实用程序的test命令运行它们:

 $ ./manage.py test

运行animals.tests模块中的所有测试

$ ./manage.py test animals.tests

运行“animals”包中的所有测试

$ ./manage.py test animals

只运行一个测试用例

$ ./manage.py test animals.tests.AnimalTestCase

只运行一个测试方法

$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak

我找不到任何合适的方法为所有的TestCase一次性设置DB

相反,我只检查expensive_db_init()如果DB已经从文件初始化(通过检查某些条目的存在),如果没有,我就初始化它

相关问题 更多 >