Django何时使用拆卸方法
根据文件: 另一方面,测试用例不会截断表并重新加载 测试开始时的初始数据。相反,它包含测试 在事务结束时回滚的数据库事务中的代码 测试。它还防止被测代码发出任何提交或 在数据库上执行回滚操作,以确保 测试结束时,将数据库恢复到其初始状态。在里面 以确保所有测试用例代码都以干净的 数据库中,Django测试运行程序首先运行所有测试用例测试,然后 任何其他可能在无需更改数据库的情况下更改数据库的测试(如doctest) 将其恢复到原始状态 因此,如果我有一个类似这样的测试:Django何时使用拆卸方法,django,Django,根据文件: 另一方面,测试用例不会截断表并重新加载 测试开始时的初始数据。相反,它包含测试 在事务结束时回滚的数据库事务中的代码 测试。它还防止被测代码发出任何提交或 在数据库上执行回滚操作,以确保 测试结束时,将数据库恢复到其初始状态。在里面 以确保所有测试用例代码都以干净的 数据库中,Django测试运行程序首先运行所有测试用例测试,然后 任何其他可能在无需更改数据库的情况下更改数据库的测试(如doctest) 将其恢复到原始状态 因此,如果我有一个类似这样的测试: class Genera
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'])
仍然需要运行
teardown
方法吗,还是TestCase
类会处理它?如果是这样,考虑到TestCase
类的可用性,什么时候应该使用teardown
方法?对于数据库而言,teardown
是毫无意义的,因为每个测试都在一个事务中运行。然而,并非测试中的所有内容都涉及数据库。您可能会测试文件创建/读取、派生过程、开放网络连接等。这些类型的事情通常要求您在完成后“关闭”它们。这就是拆卸
的目的,即从设置
方法中清理与数据库无关的内容。(不过,如果您实际上是直接连接到数据库,也就是说,实际的Django测试必须确保所有DBAPI工作正常,那么您也需要在那里进行清理。)如果您使用的是MongoDB或Redis等替代数据库,并且需要加载一组初始数据(“集合”),您还需要重写tearDown
方法
看
通常,django.test.TestCase
会在每次启动时刷新整个数据库
新测试。这意味着我们不需要像上面Chris Pratt提到的那样手动删除拆卸中的对象。下一个测试设置将确保数据库是干净的
但是,如果我们使用doctest和unittest.TestCase
,则在再次运行测试之前不会刷新数据库。在测试开始时,数据库将处于前一个测试的任何状态
左测试。这意味着上一次运行留下的任何散乱数据都会导致冲突。因此,如果我们在django测试中使用doctest或unittest.TestCase,那么清理可能是一种好的做法
最后,在更复杂的场景中,故意持久化测试数据库以查找特定的单元测试错误也是有意义的,我需要删除测试创建的文件,
tearDown
方法在这种情况下非常有用
import shutil
#....
#....
def tearDown(self):
shutil.rmtree(settings.UPLOAD_ROOT)
我发现
TestCase
并不总是刷新数据库。。。我不确定这是什么原因造成的,但有几次我不得不使用TransactionTestCase
在测试之间重置数据库。我不同意您关于查找单元测试错误的最后一点。原则上,单元测试是独立的,所以所有内容都应该包含在单元测试中,对吗?在之前或之后执行测试不应影响当前单元测试的运行。您能否解释一个可能需要在测试之间保存数据的复杂场景示例?