当前位置:  开发笔记 > 编程语言 > 正文

加速Django测试

如何解决《加速Django测试》经验,为你挑选了3个好方法。

我希望通过Django了解有关您的测试流程的更多信息.

背景资料 http://docs.djangoproject.com/en/dev/topics/testing/

我在使用测试驱动开发时遇到了困难.Django的测试运行器在启动时不断在测试数据库中创建所有数据库模型.对于我们当前的项目(40到240个型号),这意味着测试开始需要20秒.

这使得经常测试新功能完全不可行.我的问题,你们是如何解决这个问题的呢?

我在过去尝试了一些事情.) - 每次更改testloader以重用相同的测试数据库并在需要时应用迁移b.) - 从__main__python文件流中运行我的单元测试

选项b对于sys.path很尴尬,选项a是可行的,但似乎不是django方式.

更新:选项A确实不是一个糟糕的解决方案.它只是相当多的努力.这让我相信人们使用不同的解决方法.SQL lite可能就是那种解决方法.但我猜还有更多.



1> Ned Batcheld..:

在测试期间使用内存中的SQLite数据库肯定会加快速度.



2> Manoj Govind..:

更改测试加载程序以每次重用相同的测试数据库,并在需要时应用迁移

    在编写自己的测试运行器时,我没有看到任何错误,只是截断表而不是删除和创建数据库.这是djangoic,因为它解决了一个特定的问题.有一个打开的票据允许将测试用例分组到测试套件中.修复后,您应该能够将测试用例分组到套件中以便于管理.您还可以检查附加到故障单的补丁,看它是否适合您的目的.

    正如Ned 建议您可以使用内存数据库.这在很大程度上取决于您的数据模型和可跨数据库移植的查询.

    如果您尚未尝试重新组织测试用例.根据我的经验,并非所有测试类都需要子类django.test.TestCase.找出那些可以用子类进行测试的测试类unittest.TestCase.这将加快东西一点位.

    重组固定装置.将常用夹具移动到单个文件并在测试运行之前加载它,而不是在每个测试类中使用(使用fixtures = [...]).



3> Tony Lâmpada..:

我不喜欢使用不同的数据库(SQLite)进行测试,因此我的单元测试使用与生产应用程序相同的数据库 - postgres.

开箱即用,这使得创建/销毁数据库成为运行测试的最慢步骤.

Django 1.8将使用--keepdb标志解决这个问题

但是我们还没有,所以我们必须用其他方法.

解决方案1)使用pytest-django

您可以使用它来运行测试而无需重新创建数据库.有用.如果您只关心在命令行上运行测试,我建议这样做.

在我的情况下,我喜欢使用PyCharm IDE,并且能够通过右键单击文件/方法来运行测试对我来说绝对是一个加分,所以我不得不去...

解决方案2)TEST_MIRROR技巧.

在您的settings.py文件中,配置您的数据库,如:

if os.getenv('USE_TEST_DB') == '1':
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'mydbtesting',
            'USER': 'mydb',
            'PASSWORD': 'mydb',
            'HOST': 'localhost',
            'PORT': '5432',
            'TEST_MIRROR': 'default',
        }
    }
else:
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.postgresql_psycopg2',
            'NAME': 'mydb',
            'USER': 'mydb',
            'PASSWORD': 'mydb',
            'HOST': 'localhost',
            'PORT': '5432',
        }
    }

因此,"mydb"是用于正常执行的数据库,"mydbtesting"用于测试.

TEST_MIRROR设置实际上并不适用于此,但事实是,如果您使用这样配置的数据库运行测试,Django将不会重新创建/销毁我们想要的.

但首先我们必须使用以下内容创建该数据库:

export USE_TEST_DB=1
./manage.py syncdb --migrate

然后,只要您想快速运行测试,只需将USE_TEST_DB环境变量设置为"1"即可.为了在Pycharm上获得相同的好处,你可以去Run/Debug Configurations,Defaults/Django测试,然后是环境变量,添加USE_TEST_DB = 1


更新:

示例应用程序在Github上:https://github.com/freedomsponsors/www.freedomsponsors.org/blob/099ec1a7a1c404eba287d4c93d58c8cf600b2769

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有