如何在django单元测试中只加载一次灯具?

Ram*_*ttu 26 django unit-testing

在单元测试中,我需要加载灯具,如下所示:

   class TestQuestionBankViews(TestCase):

        # Load fixtures
        fixtures = ['qbank']

        def setUp(self):                           
            login = self.client.login(email="mail@gmail.com",password="welcome")        


        def test_starting_an_exam_view(self):               
            candidate = Candidate.objects.get(email="mail@gmail.com")
            .......etc


        def test_review_view(self):
            self.assertTrue(True)            
            .........

       def test_review_view2(self):
            self.assertTrue(True)
            .........
Run Code Online (Sandbox Code Playgroud)

问题:

这些灯具正在为每次测试加载,即在test_review_view,test_review_view2等之前加载,因为Django在每次测试后刷新数据库.

此行为导致测试需要很长时间才能完成.

如何防止这种冗余夹具加载?

有没有办法setUp在测试类完成时加载夹具并冲洗它们,而不是在每次测试之间刷新?

mho*_*ost 20

使用django-nose和一些代码,你可以完全按照你的要求去做.使用django-nose,您可以拥有每个包,每个模块和每个类别的设置和拆卸功能.这允许您在其中一个较高级别的设置函数中加载灯具,并禁用django.test.TestCase重置测试之间的灯具.

这是一个示例测试文件:

from django.test import TestCase
from django.core import management

    def setup():
        management.call_command('loaddata', 'MyFixture.json', verbosity=0)

    def teardown():
        management.call_command('flush', verbosity=0, interactive=False)

    class MyTestCase(TestCase):

        def _fixture_setup(self):
            pass

        def test_something(self):
            self.assertEqual(1, 1)
Run Code Online (Sandbox Code Playgroud)

请注意,设置和拆除都在课堂之外.设置将在此文件中的所有测试类之前运行,并且将在所有测试类之后运行拆解.

在课堂内,你会注意到def _fixture_setup(self)方法.这将覆盖在每次测试之间重置数据库的功能.

请记住,如果您的测试向数据库写入任何内容,则可能会使测试无效.因此,每个测试需要重新加载的任何其他测试都应放在不同的测试文件中.


Tom*_*ght 13

或者使用setUpModule:

def setUpModule():
    print 'Module setup...'

def tearDownModule():
    print 'Module teardown...'

class Test(unittest.TestCase):
    def setUp(self):
       print 'Class setup...'

    def tearDown(self):
       print 'Class teardown...'

    def test_one(self):
        print 'One'

    def test_two(self):
        print 'Two'
Run Code Online (Sandbox Code Playgroud)

打印:

Creating test database for alias 'default'...
Module setup...
Class setup...
One
Class teardown...
Class setup...
Two
Class teardown...
Module teardown...
Run Code Online (Sandbox Code Playgroud)


ker*_*ryz 7

如果您不想为此目的安装新软件包,可以将Tom Wainwright的解决方案mhost的解决方案结合起来.

在您的测试文件中,在任何类之外添加这些函数:

from django.core.management import call_command

def setUpModule():
    call_command(
        'loaddata', 
        'path_to_fixture.json',
        verbosity=0
    )

def tearDownModule():
    call_command('flush', interactive=False, verbosity=0)
Run Code Online (Sandbox Code Playgroud)

如果您不希望将这些灯具加载到数据库中以用于所有测试用例,请通过在应用程序中创建一个新目录将测试分成多个文件tests,添加一个空__init__.py文件告诉Python这是一个包,并添加您的测试文件的文件名以文件名开头test,因为跑步者将查找与该模式匹配的文件test*.py


oog*_*les 6

对于它的价值,并且由于没有可接受的答案,Django 1.8现在提供开箱即用的功能 - 只要您使用支持事务的数据库后端.

它还为每个TestCase类添加了一次TestCase.setUpTestData()方法,用于手动创建测试数据.

请参阅Django 1.8发行说明.


jam*_*sls 3

我遇到了同样的问题。一般来说,使用 django 的测试运行器并没有一个真正好的方法来做到这一点。您可能对此主题感兴趣

话虽这么说,如果所有测试用例都使用相同的装置,并且它们不以任何方式修改数据,那么使用initial_data就可以了。