Thi*_*rry 17 python django unit-testing
我希望通过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可能就是那种解决方法.但我猜还有更多.
Man*_*dan 10
更改测试加载程序以每次重用相同的测试数据库,并在需要时应用迁移
在编写自己的测试运行器时,我没有看到任何错误,只是截断表而不是删除和创建数据库.这是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',
}
}
Run Code Online (Sandbox Code Playgroud)
因此,"mydb"是用于正常执行的数据库,"mydbtesting"用于测试.
该TEST_MIRROR设置实际上并不适用于此,但事实是,如果您使用这样配置的数据库运行测试,Django将不会重新创建/销毁我们想要的.
但首先我们必须使用以下内容创建该数据库:
export USE_TEST_DB=1
./manage.py syncdb --migrate
Run Code Online (Sandbox Code Playgroud)
然后,只要您想快速运行测试,只需将USE_TEST_DB环境变量设置为"1"即可.为了在Pycharm上获得相同的好处,你可以去Run/Debug Configurations,Defaults/Django测试,然后是环境变量,添加USE_TEST_DB = 1
更新:
示例应用程序在Github上:https://github.com/freedomsponsors/www.freedomsponsors.org/blob/099ec1a7a1c404eba287d4c93d58c8cf600b2769
我找到了另一种加快测试速度的方法。如果您的测试模型是身份验证用户(User模型),并且您为他们设置了密码,则哈希函数需要相当多的毫秒才能完成。我所做的是将其添加到我的测试设置中:
PASSWORD_HASHERS = (
'django.contrib.auth.hashers.MD5PasswordHasher',
)
Run Code Online (Sandbox Code Playgroud)
这会强制对密码进行 MD5 散列,这比默认的快得多。就我而言,这改进了 12 个测试,每个测试创建 7 个用户,时间从 4.5 秒缩短到 500 毫秒。
小心不要将其添加到您的生产设置中!
| 归档时间: |
|
| 查看次数: |
5086 次 |
| 最近记录: |