Dyl*_*ens 8 python django unit-testing
我已经编写了一些单元测试来测试我的Django应用程序.特别是一个测试套件在其setUp()功能中有很多代码.所述代码的目的是为数据库创建测试数据.(是的,我知道固定装置,并选择在这种情况下不使用它们).当我运行单元测试套件时,第一个运行的测试通过,但随后套件中的其余测试失败.所有失败的消息都是相同的:它提到错误的位置是"self.database_object.save()",原因是"IntegrityError:列名不唯一".所以,我最好的猜测是Django在每次测试后都没有正确拆除数据库.
今天早些时候它正在工作,但我想我做了一些重构搞砸了.关于为什么Django在每次测试后没有正确拆除数据库的任何想法?
Tis*_*sho 10
您是否为您的基类使用TestCase或TransactionTestCase?有时这种行为与Django为TestCase进行的优化有关,而有利于TransactionTestCase.这是区别:
https://docs.djangoproject.com/en/dev/topics/testing/?from=olddocs#django.test.TransactionTestCase
class TransactionTestCase
Django TestCase类利用数据库事务工具(如果可用)来加速在每次测试开始时将数据库重置为已知状态的过程.但是,这样做的结果是Django TestCase类无法测试事务提交和回滚的影响.如果您的测试需要测试此类事务行为,则应使用Django TransactionTestCase.
TransactionTestCase和TestCase是相同的,除了数据库重置为已知状态的方式以及测试代码测试提交和回滚效果的能力.TransactionTestCase通过截断所有表并重新加载初始数据,在测试运行之前重置数据库.TransactionTestCase可以调用commit和rollback,并观察这些调用对数据库的影响.
另一方面,TestCase不会在测试开始时截断表并重新加载初始数据.相反,它将测试代码包含在数据库事务中,该事务在测试结束时回滚.它还可以防止被测代码对数据库发出任何提交或回滚操作,以确保测试结束时的回滚将数据库恢复到其初始状态.为了保证所有的TestCase代码用干净的数据库启动时,Django的测试运行第一次运行所有的TestCase的测试,在任何其他的测试(如文档测试)可以改变数据库,而使其恢复到原来的状态.