关于django的单元测试,需要知道的是
- 对于每一个测试方法都会将setUp()和tearDown()方法执行一遍
- 会单独新建一个测试数据库来进行数据库的操作方面的测试,默认在测试完成后销毁。
- 在测试方法中对数据库进行增删操作,最后都会被清除。也就是说,在test_add中插入的数据,在test_add测试结束后插入的数据会被清除。
- django单元测试时为了模拟生产环境,会修改settings中的变量,例如, 把DEBUG变量修改为True, 把ALLOWED_HOSTS修改为[*]。
简单的例子
from django.test import TestCase
from myapp.models import Animal
# Django的单元测试基于unittest库
class StudentTestCase(TestCase):
# 测试函数执行前执行
def setUp(self):
print("======in setUp")
# 需要测试的内容
def test_add(self):
student = Student(name='aaa')
student.save()
self.assertEqual(student.name, 'aaa')
# 需要测试的内容
def test_check_exit(self):
self.assertEqual(0, Student.objects.count())
# 测试函数执行后执行
def tearDown(self):
print("======in tearDown")
运行单元测试
# 测试整一个工程
$ ./manage.py test
# 只测试某个应用
$ ./manage.py test app --keepdb
# 只测试一个Case
$ ./manage.py test animals.tests.StudentTestCase
# 只测试一个方法
$ ./manage.py test animals.tests.StudentTestCase.test_add
settings变量的修改
若干需要在单元测试时修改,setting命令。例如,django在单元测试时会将settings.DEBUG 设置为True, 而我们需要将其设置为False
方式1: 直接在修改
class BaseApiTest(TestCase):
def setUp(self):
#testcase DEBUG = False
settings.DEBUG = False
def test_b(self):
self.assertEqual(2, 1+1)
def tearDown(self):
pass
方式2: 通过装饰器修改
from django.test.utils import override_settings
class BaseTest(TestCase):
def setUp(self):
pass
# 利用该装饰器,可以在但个测试函数内修改settings变量, 而不影响
@override_settings(DEBUG=False)
def test_b(self):
self.assertEqual(2, 1+1)
def tearDown(self):
pass