1. 什么是自动化测试

检查代码正确性的一些简单的程序。

运行自动化测试 $ python manage.py test FirstApp

1.1. 测试建议:

  1. 对每个模型/视图都建立单独的 TestClass
  2. 每个测试方法只测试一个功能
  3. 测试方法命名能描述其功能
  4. 如果你无法测试一段代码,通常说明这段代码需要被重构或者删除

拓展:深入代码测试

2. 创建一个自动化测试

  1. import datetime
  2. from django.test import TestCase
  3. from django.urls import reverse
  4. from django.utils import timezone
  5. from .models import Question # 引入需要测试的模型
  6. # 测试模型
  7. class QuestionModelTest(TestCase): # 每个测试类都是 TestCase 子类
  8. def test_was_recently_published_with_future_question(self):
  9. """
  10. 未来发布的问题,不应该属于近期发布
  11. """
  12. time = timezone.now() + datetime.timedelta(days=30)
  13. future_question = Question(pub_date=time) # 创建一个 pub_date 时 Question 实例
  14. # 检查实例的 was_recently_published() 返回值是否为 False
  15. self.assertIs(future_question.was_recently_published(), False)
  16. # 不属于测试的函数
  17. def create_question(question_text, days):
  18. """
  19. 创建问题:根据给定的问题文字,和距离现在的天数(负数为过去,正数为将来)
  20. 封装了创建投票的流程,减少重复代码
  21. """
  22. time = timezone.now() + datetime.timedelta(days=days)
  23. return Question.objects.create(question_text=question_text, pub_date=time)
  24. # 测试视图
  25. class QuestionIndexViewTest(TestCase):
  26. """
  27. 测试首页视图运行
  28. """
  29. def test_no_questions(self):
  30. """
  31. 如果没有问题存在,需要返回合适的信息
  32. """
  33. response = self.client.get(reverse('firstapp:index'))
  34. self.assertEqual(response.status_code, 200)
  35. self.assertContains(response, '暂无问题')
  36. self.assertQuerysetEqual(response.context['latest_question_list'], [])
  37. def test_future_question_and_past_question(self):
  38. """
  39. 如果过去和将来问题都有,只有过去的能显示在首页上
  40. """
  41. create_question(question_text='过去的问题', days=-30)
  42. create_question(question_text='将来的问题', days=30)
  43. response = self.client.get(reverse('firstapp:index'))
  44. self.assertQuerysetEqual(response.context['latest_question_list'], ['<Question: 过去的问题>'])