Django的单元测试
来源:互联网 发布:sql带参数的存储过程 编辑:程序博客网 时间:2024/06/06 07:25
Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类名为django.test.TestCase,继承于python的unittest.TestCase。
from
django.test
import
TestCase
from
myapp.models
import
Animal
class
AnimalTestCase(TestCase):
def
setUp(
self
):
Animal.objects.create(name
=
"lion"
, sound
=
"roar"
)
Animal.objects.create(name
=
"cat"
, sound
=
"meow"
)
def
test_animals_can_speak(
self
):
"""Animals that can speak are correctly identified"""
lion
=
Animal.objects.get(name
=
"lion"
)
cat
=
Animal.objects.get(name
=
"cat"
)
self
.assertEqual(lion.speak(),
'The lion says "roar"'
)
self
.assertEqual(cat.speak(),
'The cat says "meow"'
)
运行测试的时候,测试程序会在所有以test开头的文件中查找所有的test cases(inittest.TestCase的子类),自动建立测试集然后运行测试。
注意:如果测试是基于数据库访问的(读取、查询Model),一定要用django.test.TestCase建立测试类,而不要用unittest.TestCase。
Runing tests
执行目录下所有的测试(所有的test*.py文件):$ python manage.py test执行animals项目下tests包里的测试:$ python manage.py test animals.tests执行animals项目里的test测试:$ python manage.py test animals单独执行某个test case:$ python manage.py test animals.tests.AnimalTestCase单独执行某个测试方法:$ python manage.py test animals.tests.AnimalTestCase.test_animals_can_speak为测试文件提供路径:$ python manage.py test animals/通配测试文件名:$ python manage.py test --pattern="tests_*.py"启用warnings提醒:$ python -Wall manage.py test
数据库
测试是需要数据库的,django会为测试单独生成数据库。不管你的测试是否通过,当你所有的测试都执行过后,这个测试数据库就会被销毁。
默认情况下,测试数据库的名字是test_DATABASE_NAME, DATABASE_NAME是你在settings.py里配置的数据库名.如果 你需要给测试数据库一个其他的名字,在settings.py中指定TEST_DATABASE_NAME的值。使用sqlite3时,数据库是在内存中创建的。
默认情况下,django的测试过程会 创建测试数据库,执行test。删除测试数据库 。
这是一个很蛋疼的地方,因为测试数据库创建过程会花费很长的时间。
对于这中情况,有2个解决办法:
1.使用内存数据库sqlite。在settings.py中配置
if
'test'
in
sys.argv:
DATABASES[
'default'
]
=
{
'ENGINE'
:
'django.db.backends.sqlite3'
,}
这样做,同样会创建测试数据库,但是时间会少很多。
2.使用django的testrunner。 在settings.py中配置
TEST_RUNNER
=
'django.test.runner.DiscoverRunner'
这样做,同样也会创建数据库,但是这个创建数据库的时间话费也非常的少。
3.git hub上面有个项目叫做 django-test-utils 。这个项目有一个功能叫做 复用默认的数据库,不过,我安装了这个代码,使用了这个功能后,提示说,模块没有keep-database 这个属性的错误。google 上也有人说这个问题。同样是,没有解决方案。所以,这个方法,没有跑通。
其实这个问题的原因是,他这个项目的keep
-
database模块的写法太老,django无法读取。非要用这keep
-
database的这个逻辑的话,可以将
'django.test.runner.DiscoverRunner'
的复制出来,在里面把创建数据库和删除数据库的逻辑给干掉。
在上面方法1+方法2一起使用的时候,虽然创建了测试数据库,但是最终话费的时间是非常少的,所以,这个办法组合也算是解决了这个问题。
- Django的单元测试
- django单元测试
- django 单元测试
- Django 单元测试
- Django单元测试
- Django单元测试简明实践
- [Django] 单元测试小记
- Django单元测试基础知识
- 如何进行Django单元测试?
- Django在进行单元测试的时候出现Incorrect string value- '----.' for column ---
- 物联网笔记-----------Django单元测试,Django bug(一)
- 物联网笔记-----------Django单元测试,Django bug(二)
- Django 中的 csrf_token 与单元测试报错处理
- 单元测试与单元测试的基本方法
- 单元测试军规:如何编写更好的单元测试
- 单元测试军规:如何编写更好的单元测试
- 单元测试军规:如何编写更好的单元测试
- 【Android单元测试系列】真正的异步单元测试
- HDFS原理分析:基本概念
- codeforces-474D-Flowers
- uva 10954——Add All
- Generate Parentheses
- Android ListView 使用及MVC关系概要
- Django的单元测试
- 2015/11/5 笔记
- listview嵌入scrolview冲突解决方法
- 浅尝KMP算法
- 在linux上安装postgresql
- Linux源码中的mktime算法解析
- KMP算法的Next数组详解
- document.getElementById的用法
- newInstance参数详解