请稍候,加载中....

No.15 自动化测试

编写程序的过程中,难免会出现各种各样的错误。

有的错误会导致程序无法运行,这种错误很快就可以发现。

有的错误就比较隐蔽,比如一些逻辑上的错误:求和运算不小心写成了乘法运算。这些错误依靠人力去测试,费时费力,这时候就可以编写自动化测试脚本

问题假设

现在假设我们在某个地方需要提取最近发布的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_开始

 

 

 


Python学习手册-