我为我的 Django 应用程序编写的测试在我使用 SQLite 的初始开发过程中运行良好。现在我准备好部署我已经设置了一个 MySQL 服务器(因为这就是我将要部署的)但是现在我的一些测试失败了。
最后,当我手动测试功能时,失败的测试不会失败。
会发生什么?
我没有做任何不寻常的事情,所有的视图都会做一些数据库恶作剧并返回响应。没有任何与时间相关的东西(没有线程或任何东西)。
这些测试都继承自 django.test.TestCase 并且我没有使用任何固定装置。
这是一个失败的测试示例。
class BaseTest(TestCase):
def setUp(self):
super(BaseTest, self).setUp()
self.userCreds = dict(username='test', password='a')
# Create an admin user
admin = models.User.objects.create_superuser(
email='', username='admin', password='a')
# Create a user and grant them a licence
user = models.User.objects.create_user(
email='some@address.com', first_name="Mister",
last_name="Testy", **self.userCreds)
profile = models.getProfileFor(user)
node = profile.createNode(
'12345', 'acomputer', 'auser',
'user@email.com', '0456 987 123')
self.node = node
class TestClientUIViews(BaseTest):
def test_toggleActive(self):
url = reverse('toggleActive') + '?nodeId=%s' % self.node.nodeId
self.assertFalse(self.node.active)
# This should fail because only authenticated users can toggle a node active
resp = self.client.get(url)
self.assertEqual(resp.status_code, 403)
self.assertFalse(self.node.active)
# Login and make sure visiting the url toggles the active state
self.client.login(**self.userCreds)
resp = self.client.get(url)
self.assertEqual(resp.status_code, 200)
self.assertTrue(self.node.active)
resp = self.client.get(url)
self.assertEqual(resp.status_code, 200)
self.assertFalse(self.node.active)
这是模型的样子:
class Node(models.Model):
@property
def active(self):
'''
Activation state gets explictly tracked in its own table but is
exposed as a property for the sake of convenience
'''
activations = NodeActivation.objects \
.filter(node=self) \
.order_by('-datetime')
try:
return activations[0].active
except IndexError:
return False
@active.setter
def active(self, state):
if self.active != state:
NodeActivation.objects.create(node=self, active=state)
class NodeActivation(models.Model):
node = models.ForeignKey("Node")
datetime = models.DateTimeField(default=datetimeM.datetime.now)
active = models.BooleanField(default=False)
我的本地 MySQL 是 5.5.19(所以它使用 InnoDB),但我在使用 5.1.56 的部署服务器上遇到了同样的故障。无论存储引擎如何,测试都会失败。
正如我在开头提到的,如果我切换回使用 SQLite 数据库,所有测试都会返回通过。