测试用例
import datetime from django.test import TestCase from django.utils import timezone from .models import Question class QuestionModelTests(TestCase): def test_was_published_recently_with_future_question(self): """ was_published_recently() returns False for questions whose pub_date is in the future. """ time = timezone.now() + datetime.timedelta(days=30) future_question = Question(pub_date=time) self.assertIs(future_question.was_published_recently(), False)
执行python manage.py test polls,会进行如下操作
1 寻找 polls应用里的测试代码
2 找django.test.TestCase 的子类,如QuestionModelTests
3 创建一个特殊的数据库供测试使用,如,创建future_question,并不是在用户数据库创建,而是在一个测试数据库创建的
4 在类中寻找测试方法—以 test 开头的方法
5 使用assertls()方法,确认函数是否返回期望值
Client
Django 提供了一个供测试使用的 Client 来模拟用户和视图层代码的交互
python shell UI
from django.test import Client from django.urls import reverse client = Client() response = client.get('/') response.status_code response = client.get(reverse('polls:index')) #请求应用polls的视图index response.status_code #输出:200 response.content #输出:index视图对应html的内容 response.context['latest_question_list'] #输出:<QuerySet [<Question: What's up?>]>
关于测试例
先写代码或先写测试用例,可根据实际情况来决定
每增加一项功能,都要追加相应的测试用例,并且测试用例越多越好
测试例过多,可能会失去控制,可在整体进行规划,可参考以下原则:
对于每个模型和视图都建立单独的TestClass
每个测试方法只测试一个功能
给每个测试方法起个能描述其功能的名字
当写完测试用例并通过后,可将其永远保留
因为该测试用例的作用,实际上就是在监控对应的代码
比如,将来修改其他代码时,可能无意间造成这段代码没有返回期望值
则在修改后执行测试用例时,就会发现该bug
Selenium
Selenium是一款浏览器自动化测试工具
它假装成是浏览器正在和站点进行交互,就像真人在访问网站一样
Django提供了LiveServerTestCase与Selenium这样的工具进行交互
代码覆盖率
找出代码中未被测试部分的方法是检查代码覆盖率
它有助于找出代码中的薄弱部分和无用部分
如果无法测试一段代码,通常说明这段代码需要被重构或者删除
持续集成
对源代码进行自动化编译、测试、代码检查,以及打包程序、部署(发布)到应用服务器上