Django 自动化测试,任何软件产品在发布之前都应该完成测试工作,充分合理的测试工作可以保证产品中的缺陷能够在产品发布前被发现并得到解决,继而提高产品质量。现代软件产品的规模越来越庞大、业务逻辑越来越复杂、发布周期越来越短,如果仅仅使用人工测试的话,会带来巨大的工作量以及人工成本。自动化测试就是通过编写自动化测试脚本的方式,让机器完成简单、常规的测试工作,而测试人员只需要关注于产品中的新功能即可。
编写第一个测试用例
Question模型包含一个方法was_published_recently()用于判断问卷是不是最近一天发布的,如果问卷是一天内发布的,该方法返回True,但是如果问卷的发布日期是未来的某一个日期的话,was_published_recently()仍然会返回True,这是不正确的。下面我们就来编写一个测试用例来验证发布日期是否正确。
Django的自动化测试代码通常会放在一个以test开头的Python脚本文件中,Django系统也会根据文件名来查找测试代码。在使用Django命令行创建应用程序的时候,系统已经为我们创建了一个叫作tests.py的自动化测试脚本文件。
将以下测试代码复制到polls\tests.py
脚本中:
# www.coolcou.com
import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question
class QuestionModelTests(TestCase):
def test_was_published_recently_with_future_question(self):
"""
当问卷的发布日期是未来的某一天,was_published_recently()方法将会返回False
"""
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
命令执行结果如图所示:
python manage.py test polls
检索应用程序polls中的全部测试用例;- 如果发现自动化测试类(
django.test.TestCase
的子类),创建一个测试数据库; - 检索测试方法(测试方法名以test开头);
- 执行测试方法并输出测试结果;
- 删除测试数据库。
修改代码中的bug
我们需要修改已经找到的代码中存在的bug,在前面代码中如果问卷的发布日期是将来的某一天,was_published_recently()方法会返回False,对其修改如下:只有一天内发布的问卷才属于“最近发布的问卷”,此时was_published_recently()方法返回True:
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
重新执行测试用例,如图所示。
边界值测试
边界值测试是用来测试用户输入边界值时代码功能是否正常的一种测试方式,边界值也是最经常出现软件执行异常的情况。
前面我们将当前时间与前一天之间所发布的问卷定义为“最近发布的问卷”,那么它的边界值就是“比前一天早一秒钟”和“比前一天晚一秒钟”,据此添加两个新的测试用例:
测试自定义视图
目前polls应用程序可以使用任何pub_date来发布问卷,甚至使用未来的某一天。为了解决这一问题,将问卷的显示逻辑修改为:如果问卷的发布日期还没到,则问卷不可见。修改IndexView视图的get_queryset()方法。
添加timezone引用:
from django.utils import timezone
根据发布日期过滤Question:
为了对新视图进行测试,我们需要分别创建:发布日期早于当前时间的问卷、发布日期晚于当前时间的问卷、多种发表时间混合的问卷。
修改polls\ tests.py
脚本,添加create_question()用于创建测试问卷:
添加测试用例,为了模拟浏览器访问引用程序,我们使用Django控制台(shell)中的client对象完成测试代码:
测试DetailView
虽然在index视图中限制了问卷的显示规则,但是如果用户知道或者根据一定的规律猜到了问卷的ID,那么就可以通过这个ID访问问卷的详细信息。为了解决这个问题,可以按照下面方式修改DetailView。
与DetailView相似,ResultsView也可以按照上面方法添加get_queryset()和测试类。另外,对于还没有选项的问卷,不应该显示在index页面和result页面。针对这些规则可以添加更多的测试用例。
对于不同权限的用户,index页面所显示的信息也可能不同,这些都可以编写自动化测试用例。
建议开发人员每完成一个新的功能都要编写相应的自动化测试用例。
下面是一些测试用例的最佳实践:
- 为每一个模型或视图单独创建测试类。
- 每一个测试用例只用来测试一种情况。
- 测试用例名要能够解释用例。
酷客教程相关文章:
评论前必须登录!
注册