Django升级后单元测试失败

时间:2017-08-04 21:24:42

标签: python django tastypie python-unittest django-unittest

我正在尝试将Django项目从1.8版带到1.11版。除了单元测试之外,几乎所有东西看起来都很好。我们有一个基础测试类继承自Django TestCase和Tastypie mixin。基类在setUp()中有一些代码,如下所示

class BaseApiTest(ResourceTestCaseMixin, django.test.TestCase):
    def setUp(self):
        super().setUp()
        self.username = "secret_user"
        self.password = "sekret"
        self.email = "secret@mail.com"
        self.first_name = "FirstName"
        self.last_name = "LastName"
        self.user = User.objects.create_superuser(
            self.username,
            self.username,
            self.password
        )

应用程序特定的测试将继承基本测试并执行类似

的操作
class TheAPITest(BaseApiTest):
    def setUp(self):
        super().setUp()
        # more setup goes here

所以,在Django 1.8.x下,这很好用。但是在1.11.x下,所有这些都给我User.objects.create_superuser() line上的错误。

django.db.utils.InterfaceError: connection already closed

我一直在阅读发行说明,但是在1.8和1.11之间发生了太多的事情。我缺少一些简单的东西吗?

2 个答案:

答案 0 :(得分:3)

拥有错误跟踪可能很有用。 但是在代码中,我看到了这个错误:

   self.user = User.objects.create_superuser(
                self.username,
                self.username, **this should be self.email**
                self.password
            )

答案 1 :(得分:2)

我已经发现了我的单元测试覆盖率的多个问题,但为了回答我发布的问题,两个单独的问题导致了我所描述的错误。

Django 1.11对其模型实例创建更严格,我们有一些未更新到新模型结构的遗留测试代码。例如,如果您使用默认的User模型,则可以在Django 1.8中执行

from django.contrib.auth.models import User    
User.objects.create(username="something", password="something", something="something")

但在Django 1.11中,它会引发异常"TypeError: 'something' is an invalid keyword argument for this function"

第二个问题是Django TestCase将测试用例包装在两个独立的原子块中。这有助于将类级别设置与实例级别设置分开,但它也引入了一个微妙的问题。如果测试因数据库错误而崩溃,您永远不会看到错误,因为它发生在测试级别的原子级而不是类级别的原子级。测试级别原子失败,数据库连接被删除。之后,每次测试都会失败并出现我所看到的确切django.db.utils.InterfaceError: connection already closed错误。从TestCase切换到TransactionTestCase导致许多这些问题直接暴露在测试输出中。