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)
如果您不想为此目的安装新软件包,可以将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
对于它的价值,并且由于没有可接受的答案,Django 1.8现在提供开箱即用的功能 - 只要您使用支持事务的数据库后端.
它还为每个TestCase类添加了一次TestCase.setUpTestData()方法,用于手动创建测试数据.
请参阅Django 1.8发行说明.
| 归档时间: |
|
| 查看次数: |
10863 次 |
| 最近记录: |