测试相关
自动化测试是由某个系统帮你自动完成的。当你创建好了一系列测试,每次修改应用代码后,就可以自动检查出修改后的代码是否还像你曾经预期的那样正常工作。你不需要话费大量时间来进行手动测试。
实例
在这个系列文章的第一部分,我们在poll投票应用中定义了一个Question model方法,返回当前投票问题是否是最近创建的,如果创建时间与当前时间相差不到24小时,则返回True.
1 | def was_published_recently(self): |
很明显,这里有一个Bug,就是当我们手动修改问题的创建时间(实际操作可以在创建问题的构造函数修改,或者直接在项目后台修改)为未来时间,即timezone.now+的情况,方法依然会返回True.
1 | 'debug') p=Question.objects.get(question_text= |
手动将question_text为debug的Question对象pub_date时间修改为当前时间往后数5天,当我们测试was_published_recently()方法时,依然会反悔True.明显,这与我们的设计初衷不符合。
使用代码检测漏洞
Django应用的额测试写在应用的test.py文件中,测试系统自动在所有以test开开头的文件中寻找bong执行测试代码。
测试初体验
下面我们就在头片应用polls/目录下的test.py文件中尝试test:
1 | import datetime |
在网站项目的根目录下启动终端:
1 | $ winpty python manage.py test polls |
python manage.py test polls 将会寻找 poll 应用里的测试代码
它找到了一个 django.test.TestCase 的子类
它创建一个特殊的数据库供测试使用,与我们正常使用的数据库不同,在测试完成之后,数据将会自动销毁
它在类中寻找测试方法——以 test 开头的方法。
在 test_was_published_recently_with_future_question 方法中,它创建了一个 pub_date 值为未来第 30 天的 Question 实例。
然后使用 assertEqual() 方法,发现 was_published_recently() 返回了 True,而我们希望它返回 False
为了做对比,我使用离当前时间前30小时作为问题发布时间:
1 | def test_was_published_recently_with_future_question(self): |
同时,我们应该修改views.py文件,将显示的返回集合修改。
1 | def get_queryset(self): |
更全面的测试
实际上,光是问题发布时间方面,如果想要更全面的测试,以上的测试还是不够的,我们需要未来时间的测试,一天之前时间的测试,以及一天之内时间的测试。
我们在上面实现了未来时间的测试,下面是剩余两项的测试:
1 | from django.test import TestCase |