我希望通过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可能就是那种解决方法.但我猜还有更多.
在测试期间使用内存中的SQLite数据库肯定会加快速度.
更改测试加载程序以每次重用相同的测试数据库,并在需要时应用迁移
在编写自己的测试运行器时,我没有看到任何错误,只是截断表而不是删除和创建数据库.这是djangoic,因为它解决了一个特定的问题.有一个打开的票据允许将测试用例分组到测试套件中.修复后,您应该能够将测试用例分组到套件中以便于管理.您还可以检查附加到故障单的补丁,看它是否适合您的目的.
正如Ned 建议您可以使用内存数据库.这在很大程度上取决于您的数据模型和可跨数据库移植的查询.
如果您尚未尝试重新组织测试用例.根据我的经验,并非所有测试类都需要子类django.test.TestCase
.找出那些可以用子类进行测试的测试类unittest.TestCase
.这将加快东西一点位.
重组固定装置.将常用夹具移动到单个文件并在测试运行之前加载它,而不是在每个测试类中使用(使用fixtures = [...]
).
我不喜欢使用不同的数据库(SQLite)进行测试,因此我的单元测试使用与生产应用程序相同的数据库 - postgres.
开箱即用,这使得创建/销毁数据库成为运行测试的最慢步骤.
Django 1.8将使用--keepdb标志解决这个问题
但是我们还没有,所以我们必须用其他方法.
您可以使用它来运行测试而无需重新创建数据库.有用.如果您只关心在命令行上运行测试,我建议这样做.
在我的情况下,我喜欢使用PyCharm IDE,并且能够通过右键单击文件/方法来运行测试对我来说绝对是一个加分,所以我不得不去...
在您的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