Writing your first Django app, part 5
自动化测试入门
什么是自动化测试?
测试时检查你代码运行状况的常规手段。
测试操作层次有很大区别,有些可能需要处理一些极小的细节(比如特定model方法是否返回期待值?),或是检查软件的所有操作途径(一连串的用户输入是否会返还正确的值?),你可以手动在shell里面检测,输出数据看它是否按相应情况做出更改。
自动化测试有哪些不同呢?你创造一组测试,当你改变你的应用时,你可以检查一下代码是不是像你最初想的一样运行,不需要浪费时间去手动测试。
为什么你需要创建测试?
你可能觉得这不太重要,反正我们的投票应用运行的很好。如果这个应用是你做的最后一个Django程序,那么你可以不学做测试,反之现在是个学习的好机会。
测试能节省你的时间
现在的测试都很简单,大抵是’检查xx是否工作‘之类的。但是在一个复杂的应用里,它的组件间会有很多复杂的交互影响。
对一个组件进行变更会发生一连串意想不到的影响。这时候测试代码可能要测试多大20个不同的变量和返回值看它们是否没有奔溃。
自动化测试更适合这个工作,当哪个玩意发生故障了,自动化测试会协助你找出代码。
有时候测试像个零工琐事,把你从创造力十足的编程工作中拉开去写噪杂和无聊的测试,特别是你的代码运行良好时。
然而,写测试这个任务可比你自己手动测试问题出在哪里要好得多。。。
测试不只是识别问题,更能预防它们
仅仅思考测试的负面是一个大错误
没有测试的话,应用的作用可能会更加晦涩。即使是你自己写的代码,有时你也会不明白它在做什么。
测试可以从内部阐明你的代码,当发生错误时,这部分代码的测试就会报错。
测试能让你的代码更具吸引力
你可能创造了一个很棒的软件,但是如果没有测试的话,你会发现其它的开发者都懒得去它。没有测试,他们不会相信它。‘Jacob Kaplan-Moss’-Django创始人之一 - 曾经说过‘ 没有测试的代码是设计上的败笔 ‘
测试能有助于团队工作
复杂的应用通常是由团队维护的,测试能让你的同僚不会因为疏忽而去破坏你的代码。如果你想靠Django谋一份工作,你必须善于写测试
基础的测试策略
有很多写测试的方法途径。
一些程序员遵循“test-driven development”原则;他们在写代码之前就先写好了测试。
多数情况下,一个新手会先写些代码再决定写些测试。
很多时候,测试都不知道从哪里下手。当然如果你写过几千行的Python代码,做出这个选择会很容易。在这个应用里,可以改变一点东西,然后你就会发现一个bug。
写你的首个测试
我们发现一个bug
在Question.was_published_recently()方法里,它判断Question是否是一天之内发布的,如果是就返回True。但是如果Question的pub_date值是未来的某一天呢?
$ python manage.py shell
>>> # 我们创建一个Question实例,把它的pub_date设为30天后
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # 还回是最近发布吗?
>>> future_question.was_published_recently()
True
创建一个测试来暴露这个bug
惯例是把应用的测试放在各自应用目录下的tests.ph文件里;测试系统会自动寻找以test开头的文件。
polls/tests.py:
import datetime
from django.utils import timezone
from django.test import TestCase
from .models import Question
class QuestionMethodTests(TestCase):
def test_was_published_recently_with_future_question(self):
"""
was_published_recently() 当使用未来日期对象的时候,

本文介绍了Django应用的自动化测试,强调了测试的重要性和基础策略。通过编写测试暴露并修复bug,如Question模型中关于未来日期的问题。接着探讨了如何测试View,使用Django的test client模拟用户交互,并展示了如何改进视图以处理未来日期的Question。最后提到了更多测试思路和最佳实践,鼓励开发者深入学习和理解Django测试。
1564

被折叠的 条评论
为什么被折叠?



