Django 中的单元测试可以使用 Python 自带的 UnitTest,也可以使用 Django 自己的 TestCase
TestCase的基类
TestCase 的基类:
SimpleTestCase:继承自 Python 的 TestCase,可以发起 HTTP 请求,可以与页面模板做交互,禁止了与数据库的访问,如果要访问数据库的话就不使用这个类。
TransactionTestCase:在运行完测试用例之后,会把所有的表数据都清理掉。可以运行提交、回滚来管查中间状态。如果代码涉及到事务,可以基于该类实现测试用例
TestCase:大部分情况下使用此类,执行完后不清理表数据,在一个事务中执行用例,最后自动回滚事务。
LiveServerTestCase:在后台自动启动一个 Server,一遍使用外部工具如 Selenium 做测试
目录结构
Django 使用 UnitTest 模块的内置测试查找机制:在当前工作目录下,查找任何匹配 test.py 命名的文件作为 Test Case, 然后找所有以 test 开头的方法
app_name/
testcase/
__init__.py
test_forms.py
test_views.py
执行测试用例
运行项目下所有 test
python manage.py test
测试指定模块
python manage.py test jobs.testcase
测试单个模块中的文件
python manage.py test jobs.testcase.test_views
测试指定类
python manage.py test jobs.testcase.test_views.JobTests
测试指定方法
python manage.py test jobs.testcase.test_views.JobTests.test_detail
示例
test_views.py
from django.test import TestCase
from django.test import Client
from jobs.models import Job, JobTypes, Cities
class JobTests(TestCase):
@classmethod
def setUpTestData(cls):
cls.job = Job.objects.create(name='Java开发工程师', job_type=JobTypes.JAVA)
def test1(self):
pass
def test_index(self):
client = Client()
response = client.get('/joblist/')
self.assertEqual(response.status_code, 200)
def test_detail(self):
response = self.client.get('/job/1/')
self.assertEqual(response.status_code, 200)
job = response.context['job']
self.assertEqual(job.name, JobTests.job.name)