Django 中的单元测试可以使用 Python 自带的 UnitTest,也可以使用 Django 自己的 TestCase

TestCase的基类

image.png
TestCase 的基类:
SimpleTestCase:继承自 Python 的 TestCase,可以发起 HTTP 请求,可以与页面模板做交互,禁止了与数据库的访问,如果要访问数据库的话就不使用这个类。

TransactionTestCase:在运行完测试用例之后,会把所有的表数据都清理掉。可以运行提交、回滚来管查中间状态。如果代码涉及到事务,可以基于该类实现测试用例

TestCase:大部分情况下使用此类,执行完后不清理表数据,在一个事务中执行用例,最后自动回滚事务。

LiveServerTestCase:在后台自动启动一个 Server,一遍使用外部工具如 Selenium 做测试

目录结构

Django 使用 UnitTest 模块的内置测试查找机制:在当前工作目录下,查找任何匹配 test.py 命名的文件作为 Test Case, 然后找所有以 test 开头的方法

  1. app_name/
  2. testcase/
  3. __init__.py
  4. test_forms.py
  5. test_views.py

执行测试用例

运行项目下所有 test

  1. python manage.py test

测试指定模块

  1. python manage.py test jobs.testcase

测试单个模块中的文件

  1. python manage.py test jobs.testcase.test_views

测试指定类

  1. python manage.py test jobs.testcase.test_views.JobTests

测试指定方法

  1. python manage.py test jobs.testcase.test_views.JobTests.test_detail

示例

test_views.py

  1. from django.test import TestCase
  2. from django.test import Client
  3. from jobs.models import Job, JobTypes, Cities
  4. class JobTests(TestCase):
  5. @classmethod
  6. def setUpTestData(cls):
  7. cls.job = Job.objects.create(name='Java开发工程师', job_type=JobTypes.JAVA)
  8. def test1(self):
  9. pass
  10. def test_index(self):
  11. client = Client()
  12. response = client.get('/joblist/')
  13. self.assertEqual(response.status_code, 200)
  14. def test_detail(self):
  15. response = self.client.get('/job/1/')
  16. self.assertEqual(response.status_code, 200)
  17. job = response.context['job']
  18. self.assertEqual(job.name, JobTests.job.name)