根据文件:
另一方面,TestCase不会在测试开始时截断表并重新加载初始数据.相反,它将测试代码包含在数据库事务中,该事务在测试结束时回滚.它还可以防止被测代码对数据库发出任何提交或回滚操作,以确保测试结束时的回滚将数据库恢复到其初始状态.为了保证所有TestCase代码都以干净的数据库启动,Django测试运行器首先运行所有TestCase测试,然后再进行任何其他测试(例如doctests),这些测试可能会改变数据库而不将其恢复到原始状态.
所以,如果我有一个看起来像这样的测试:
class GeneralUserCreateTest(TestCase):
def setUp(self):
create_roletypes()
create_permissiontypes()
self.client = Client()
self.event = create_event()
def test_create(self):
create_url = reverse('event_user_signup', args=[self.event.slug])
post_data = {
'signup-account-email': 'foo@bar.com',
'signup-account-password': 'foobar',
'signup-account-password2': 'foobar',
'signup-account-first_name': 'Foo',
'signup-account-last_name': 'Bar',
}
response = self.client.post(create_url, data=post_data)
self.assertEqual(response.status_code, 302)
# check creation of user object
self.assertEqual(User.objects.filter(email=post_data['signup-account-email']).count(), 1)
user = User.objects.get(username=post_data['signup-account-email'])
# user and profile objects created
self.assertEqual(User.objects.all().count(), 1)
self.assertEqual(Profile.objects.all().count(), 1)
# get the first user and profile object to test against submitted field
user = User.objects.all()[0]
profile = Profile.objects.all()[0]
role = Role.objects.filter(event=self.event, profiles=profile)[0]
self.assertEqual(role.roletype.name, 'General')
self.assertEqual(user.username, post_data['signup-account-email'])
self.assertEqual(user.email, post_data['signup-account-email'])
self.assertEqual(profile.first_name, post_data['signup-account-first_name'])
self.assertEqual(profile.last_name, post_data['signup-account-last_name'])
Run Code Online (Sandbox Code Playgroud)
是否仍然需要运行一个teardown
方法或TestCase
该类是否需要处理它?如果是这样的话,何时应该使用teardown
给定TestCase
类的可用性的方法?
Chr*_*att 28
出于数据库的目的,这tearDown
是毫无意义的,因为每个测试都在事务中运行.但是,并非测试中的所有内容都涉及数据库.您可以测试文件创建/读取,分离进程,打开网络连接等.这些类型的事情通常要求您在完成后"关闭"它们.这就是tearDown
用来清理setUp
方法中的东西,与数据库无关.(但是,如果您实际上是直接连接到数据库,即实际的Django测试必须确保所有DBAPI工作正常,您也需要在那里进行清理.)
amd*_*rra 11
我正在处理一个处理一些文件上传的项目,我需要删除测试创建的文件,并且该tearDown
方法在这种情况下非常有用.
import shutil
#....
#....
def tearDown(self):
shutil.rmtree(settings.UPLOAD_ROOT)
Run Code Online (Sandbox Code Playgroud)
如果您使用的是MongoDB或Redis等替代数据库,并且需要加载一组初始数据("集合"),则还需要覆盖该tearDown
方法.
见http://www.belchak.com/2011/02/07/unit-testing-django-with-a-nosql-backend/
通常,django.test.TestCase
在每个新测试开始时都会刷新完整数据库.这意味着我们不需要像Chris Pratt上面提到的那样在我们的tearDown中手动删除对象.下一个测试setUp将确保数据库是干净的.
但是,如果我们使用doctests unittest.TestCase
,则在再次运行测试之前不会有数据库刷新.在测试开始时,数据库将处于先前测试剩余的任何状态.这意味着前一次运行留下的任何杂散数据都会导致冲突.因此,如果我们使用doctests或unittest.TestCase进行django测试,清理可能是一种很好的做法.
最后,在更复杂的场景中,故意坚持测试数据库来寻找特定的单元测试错误也是有意义的.
归档时间: |
|
查看次数: |
14569 次 |
最近记录: |