当我正在为我的django应用程序开发单元测试时,我发现自己一遍又一遍地运行manage.py测试。我正在使用MySQL后端并且在项目中有许多模型,因此创建所有测试数据库的加速时间大约为30秒。
如何通过保持创建数据库表并在“manage.py test”命令的两次运行之间清除所有记录来更快地使用make进行每个单元测试?
答案 0 :(得分:7)
请注意,您不必每次都运行整个测试套件。您只需运行manage.py test appname
(或使用manage.py test app1 app2 ...
一次针对多个应用),即可为单个应用运行测试套件。
我通常的工作流程是在我工作时运行我正在处理的应用程序的测试,并在我提交下一组更改之前运行完整套件。
答案 1 :(得分:4)
我还没有尝试过,但是最近有一个检查是允许测试在然后回滚的事务中运行,这应该是有帮助的:
答案 2 :(得分:1)
您可以使用sqlite数据库后端运行测试。它不适合完整的测试运行(因为数据库不同),但是为了进行健全性检查,它可以节省大量时间。请参阅:http://mindlesstechnology.wordpress.com/2008/08/16/faster-django-unit-tests/
答案 3 :(得分:1)
我使用ram-disk作为我的MySQL数据库,快速甚至没有描述它,结合只测试你正在使用它的特定应用程序中的特定测试可以大大缩短测试时间。有一些脚本可以自动创建数据库的ramdisk,我使用mysql-ramdisk.py我的一个同事编写,这个版本适用于Mac OS X.还有一个适用于Linux的版本here。花了大约30秒为django dev设置整个过程,我的测试有时会在五秒钟内完成,包括创建默认测试数据库。 ;)
答案 4 :(得分:1)
您可以通过使用以下标志防止在Django 1.8+中的测试运行之间破坏测试数据库:
--keepdb
(https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-test-keepdb)
在Django 1.9+中,如果您有多核处理器,另一个不错的选择是标志:
--parallel
这需要您pip安装tblib,但可以让您在多个内核上同时运行单元测试。 (https://docs.djangoproject.com/en/1.10/ref/django-admin/#cmdoption-test-parallel)
答案 5 :(得分:0)
正如在这个主题:How do I run a unit test against the production database?中发布的那样,我创建了一个测试套件,可以针对生产数据库(在我的本地开发机器上,通过“manage.py shell”)或常规django“管理.py测试“测试套件。对于我来说,在开发过程中进行快速的健全性检查和提交时间验证对我来说是一个真正的节省时间。在任何一种情况下,我都在运行相同的db(MySQL)并在我的测试中获得django ORM。