Django单测详解
编写单元测试
Django的单元测试是基于Python的标准库模块:unittest实现的。
下面我们使用一个例子来了解一下如何编写单测Case:
- 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开头的文件。
查找这些文件中所有的测试用例:unittest.TestCase子类,并自动运行这些Case。
Ps:在Django中编写单测Case时,应该引用django.test.TestCase而不是unittest.TestCase。
接口层级的测试Case编写
Django中,提供了Client类可以用于进行接口级的测试。
- from django.test import Client
- c = Client()
- response = c.post('/login/', {'username': 'john', 'password': 'smith'})
- response.status_code
- # 200
- response = c.get('/customer/details/')
- print response.content
默认情况下CSRF检查是被禁用的,如果测试需要,可以用下面的方法:
- from django.test import Client
- csrf_client = Client(enforce_csrf_checks=True)
更常用的一种方法如下:
- from django.test import TestCase
- class SimpleTest(TestCase):
- def test_details(self):
- response = self.client.get('/customer/details/')
- self.assertEqual(response.status_code, 200)
- def test_index(self):
- response = self.client.get('/customer/index/')
- self.assertEqual(response.status_code, 200)
执行测试Case
当测试用例编写完成后,运行manage.py文件,参数为test即可执行测试用例:
- python manage.py test
执行该命令后,默认会在整个项目下查找test开头的文件并自动执行。
除了全局执行外,还可以指定特定文件或特定类进行运行,例如:
- ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak
- ./manage.py test animals.tests.AnimalTestCase
- ./manage.py test animals.tests
- ./manage.py test animals
此外,还可以支持通过正则匹配参数来选择文件执行:
- ./manage.py test --pattern="tests_*.py"
Ps:测试过程中,可以正常使用Ctrl+C来中断测试Case的运行。且不会影响数据销毁等功能。
添加-Wall参数可以在运行测试Case时将警告信息打印出来:
- python -Wall manage.py test
测试数据库
单测Case运行过程中,难免会造成各种脏数据的产生。
Django本身支持对于关系型数据库的数据回收。
但是对于非关系型数据库,例如MongoDB,Redis等,则需要利用额外的工具来实现。
推荐使用的库是:django-test-addons
安装方式如下:
- pip install django-test-addons
接下来,需要在配置文件中添加TEST_MONGO_DATABASE。
示例如下:
- TEST_MONGO_DATABASE = {
- 'db': 'test',
- 'host': ['localhost'],
- 'port': 27017,
- }
对于需要使用MongoDB数据的测试Case,编写Case的方式如下:
- import test_addons
- class TestSomething(test_addons.MongoTestCase):
- def test_instantiation(self):
- pass
与coverage.py集成
Django可以轻松地与coverage.py集成,这是一个用于测量Python程序代码覆盖率的工具。
首先,需要安装coverage.py。
接下来,在mange.py所在的文件夹下执行如下命令:
- coverage run --source='.' manage.py test myapp
这将运行您的测试并收集项目中已执行文件的coverage数据。
最后,您可以通过键入以下命令查看此数据的报告:
- coverage report
如果期望生成详细的html报告,可以执行如下命令:
- coverage html