Django升级后单元测试失败

Mad*_*bat 15 python django django-unittest tastypie python-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
        )
Run Code Online (Sandbox Code Playgroud)

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

class TheAPITest(BaseApiTest):
    def setUp(self):
        super().setUp()
        # more setup goes here
Run Code Online (Sandbox Code Playgroud)

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

django.db.utils.InterfaceError: connection already closed

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

Mad*_*bat 7

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

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

from django.contrib.auth.models import User    
User.objects.create(username="something", password="something", something="something")
Run Code Online (Sandbox Code Playgroud)

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

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