最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 第一个Django项目 part5:测试

    正文概述    2020-08-04   316

    一、自动化测试概述

    什么是自动化测试

    测试是一种例行的、不可缺失的工作,用于检查你的程序是否符合预期。

    测试可以划分为不同的级别。一些测试可能专注于小细节(比如某一个模型的方法是否会返回预期的值?), 一些测试则专注于检查软件的整体运行是否正常(用户在对网站进行了一系列的输入后,是否返回了期望的结果?)。

    测试可以分为手动测试和自动测试。手动测试很常见,有时候print一个变量内容,都可以看做是测试的一部分。手动测试往往很零碎、不成体系、不够完整、耗时费力、效率低下,测试结果也不一定准确。

    第一个Django项目 part5:测试

    自动化测试则是系统地较为完整地对程序进行测试,效率高,准确性高,并且大部分共同的测试工作会由系统来帮你完成。一旦你创建了一组自动化测试程序,当你修改了你的应用,你就可以用这组测试程序来检查你的代码是否仍然同预期的那样运行,而无需执行耗时的手动测试。

    为什么需要测试?

    大家都明白:

    测试可以节省你的时间测试不仅仅可以发现问题,还能防止问题测试使你的代码更受欢迎测试有助于团队合作

    二、编写测试程序

    Django是一个全面、完善、严谨的Web框架,当然不会缺少测试功能。

    1.遇见BUG

    很巧,在我们的投票应用中有一个小bug需要修改:在Question.was_published_recently()方法的返回值中,当Qeustion在最近的一天发布的时候返回True(这是正确的),然而当Question在未来的日期内发布的时候也返回True(这是错误的)。

    相关推荐:《Python视频教程》

    我们可以在admin后台创建一个发布日期在未来的Question,然后在shell中验证这个bug:

    $ python manage.py shell

    >>> import datetime
    >>> from django.utils import timezone
    >>> from polls.models import Question
    >>> # 创建一个发布日期在30天后的问卷
    >>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
    >>> # 测试一下返回值
    >>> future_question.was_published_recently()True

    问题的核心在于我们允许创建在未来时间才发布的问卷,由于“未来”不等于“最近”,因此这显然是个bug。

    2.创建一个测试来暴露这个bug

    刚才我们是在shell中测试了这个bug,那如何通过自动化测试来发现这个bug呢?

    通常,我们会把测试代码放在应用的tests.py文件中,测试系统将自动地从任何名字以test开头的文件中查找测试程序。每个app在创建的时候,都会自动创建一个tests.py文件,就像views.py等文件一样。

    将下面的代码输入投票应用的polls/tests.py文件中:

    import datetimefrom django.utils import timezonefrom django.test import TestCasefrom .models import Questionclass QuestionMethodTests(TestCase):
        def test_was_published_recently_with_future_question(self):
            """        在将来发布的问卷应该返回False        """
            time = timezone.now() + datetime.timedelta(days=30)
            future_question = Question(pub_date=time)
            self.assertIs(future_question.was_published_recently(), False)

    我们在这里创建了一个django.test.TestCase的子类,它具有一个方法,该方法创建一个pub_date在未来的Question实例。最后我们检查was_published_recently()的输出,它应该是 False。

    3.运行测试程序

    在终端中,运行下面的命令,

    $ python manage.py test polls

    你将看到结果如下:

    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    F
    ======================================================================
    FAIL: test_was_published_recently_with_future_question (polls.tests.QuestionModelTests)
    ----------------------------------------------------------------------
    Traceback (most recent call last):
      File "/path/to/mysite/polls/tests.py", line 16, in test_was_published_recently_with_future_question
        self.assertIs(future_question.was_published_recently(), False)
    AssertionError: True is not False
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    FAILED (failures=1)
    Destroying test database for alias 'default'...

    这其中都发生了些什么?:

    python manage.py test polls命令会查找投票应用中所有的测试程序发现一个django.test.TestCase的子类为测试创建一个专用的数据库查找名字以test开头的测试方法在test_was_published_recently_with_future_question方法中,创建一个Question实例,该实例的pub_data字段的值是30天后的未来日期。然后利用assertIs()方法,它发现was_published_recently()返回了True,而不是我们希望的False。

    最后,测试程序会通知我们哪个测试失败了,错误出现在哪一行。

    整个测试用例基本上和Python内置的unittest非常相似,大家可以参考Python教程中测试相关的章节。

    4.修复bug

    我们已经知道了问题所在,现在可以去修复bug了。修改源代码,具体如下:

    # polls/models.pydef was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

    再次运行测试程序:

    Creating test database for alias 'default'...
    System check identified no issues (0 silenced).
    .
    ----------------------------------------------------------------------
    Ran 1 test in 0.001s
    OK
    Destroying test database for alias 'default'...

    可以看到bug已经没有了。

    5.更加全面的测试

    事实上,前面的测试用例还不够完整,为了使was_published_recently()方法更加可靠,我们在上面的测试类中再额外添加两个其它的方法,来更加全面地进行测试。

    # polls/tests.pydef test_was_published_recently_with_old_question(self):
        """    只要是超过1天的问卷,返回False    """
        time = timezone.now() - datetime.timedelta(days=1, seconds=1)
        old_question = Question(pub_date=time)
        self.assertIs(old_question.was_published_recently(), False)def test_was_published_recently_with_recent_question(self):
        """    最近一天内的问卷,返回True    """
        time = timezone.now() - datetime.timedelta(hours=23, minutes=59, seconds=59)
        recent_question = Question(pub_date=time)
        self.assertIs(recent_question.was_published_recently(), True)

    现在我们有三个测试来保证无论发布时间是在过去、现在还是未来Question.was_published_recently()都将返回正确的结果。

    相关推荐:

    第一个Django项目 part2:模型与管理后台


    起源地下载网 » 第一个Django项目 part5:测试

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元