编写程序的过程中,难免会出现各种各样的错误。
有的错误会导致程序无法运行,这种错误很快就可以发现。
有的错误就比较隐蔽,比如一些逻辑上的错误:求和运算不小心写成了乘法运算。这些错误依靠人力去测试,费时费力,这时候就可以编写自动化测试脚本
问题假设
现在假设我们在某个地方需要提取最近发布的Question(前一天之后发表的),因此我们在模型里添加了一个方法
添加was_published_recently()方法
......
import datetime
class Question(models.Model):
......
def was_published_recently(self):
return self.pub_date >= timezone.now() - datetime.timedelta(days=1)
该方法通过判断发布日期是否在当前时间-1天
以后,如果是就返回True,否则返回False
逻辑漏洞
was_published_recently()
如果仅仅从正常的逻辑上来讲,并没有问题,但是考虑到我们添加Question的时候,并没有对pub_date进行约束,因此有可能发生发布日期被设置为一个未来的日子
运行 python manage.py shell
进入交互式环境
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
现在future_question的发布时间被设置为了30天之后
然后我们使用was_published_recently()
方法对他验证
>>> future_question.was_published_recently()
True
判断结果返回True,但是事实上这个日子还没有到,所以这个是个BUG,我们通过人力测试,找到了这个漏洞,接下来要写一个测试脚本来测试
测试用例
打开polls/test.py,我们将测试用例写在这里
import datetime
from django.test import TestCase
from django.utils import timezone
from .models import Question
class QuestionModelTests(TestCase):
def test_was_published_recently(self):
time = timezone.now() + datetime.timedelta(days=30)
future_question = Question(pub_date=time)
self.assertIs(future_question.was_published_recently(), False)
在上面这段代码中,我们首先导入了
from django.test import TestCase
所有测试用例都是TestCase
的子类,在这里我们创建了QuestionModelTests
子类。
在QuestionModelTests
子类里面定义了一个测试方法test_was_published_recently
进行测试
在shell中 运行命令 python manage.py test polls
# python manage.py test polls
.....
AssertionError: True is not False
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
可以发现运行测试后,会执行QuestionModelTests
内的测试方法,现在表示测试没有通过(Failed)
修复BUG
现在修改 was_published_recently()
def was_published_recently(self):
now = timezone.now()
return now - datetime.timedelta(days=1) <= self.pub_date <= now
最近的时间限制为在前一天与当前时间之间
然后重新运行测试命令
# python manage.py test polls
Creating test database for alias 'default'...
System check identified no issues (0 silenced).
.
----------------------------------------------------------------------
Ran 1 test in 0.001s
OK
现在由于修复了bug,测试就通过了
测试总结
什么是测试用例?
所谓测试用例,根据软件产品设计要求,通常都会有相关的需求文档或者设计文档,会对软件的输入输出做一些约束规定,比如例子中的最近发布日期的定义。根据这些约束编写方法测试。
在测试方法中,我们会模拟用户的输入得到一个结果,比如例子中我们创建一个具有未来日期的Question对象,所以这个称为用例,就是模仿真实的情形用于测试
最后,会对这个对象按照约束进行检测,如果检测出来不符合约束规定,就表示测试没有通过
测试用例规范
1. 测试用例必须继承自Django.test.TestCase
,Django还提供了其他的一些Case,我们会在后面课程讲解,TestCase
是用的最多的
2. 测试用例定义的测试方法命名必须以test_
开始
讨论区