Django的单元测试

Django的单元测试使用python的unittest模块,这个模块使用基于类的方法来定义测试。类名为django.test.TestCase,继承于python的unittest.TestCase。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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中配置

?
1
2
if  'test'  in  sys.argv:
     DATABASES[ 'default' =  { 'ENGINE' 'django.db.backends.sqlite3' ,}

 这样做,同样会创建测试数据库,但是时间会少很多。

2.使用django的testrunner。 在settings.py中配置

?
1
TEST_RUNNER   =  'django.test.runner.DiscoverRunner'

 这样做,同样也会创建数据库,但是这个创建数据库的时间话费也非常的少。

3.git hub上面有个项目叫做 django-test-utils 。这个项目有一个功能叫做 复用默认的数据库,不过,我安装了这个代码,使用了这个功能后,提示说,模块没有keep-database 这个属性的错误。google 上也有人说这个问题。同样是,没有解决方案。所以,这个方法,没有跑通。

?
1
其实这个问题的原因是,他这个项目的keep - database模块的写法太老,django无法读取。非要用这keep - database的这个逻辑的话,可以将  'django.test.runner.DiscoverRunner'  的复制出来,在里面把创建数据库和删除数据库的逻辑给干掉。

   在上面方法1+方法2一起使用的时候,虽然创建了测试数据库,但是最终话费的时间是非常少的,所以,这个办法组合也算是解决了这个问题。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值