Django項(xiàng)目怎么實(shí)現(xiàn)測(cè)試-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買多久送多久,劃算不套路!

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、重慶小程序開發(fā)公司、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了桑珠孜免費(fèi)建站歡迎大家使用!

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)碛嘘P(guān)Django項(xiàng)目怎么實(shí)現(xiàn)測(cè)試,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

一、自動(dòng)化測(cè)試概述

什么是自動(dòng)化測(cè)試

測(cè)試是一種例行的、不可缺失的工作,用于檢查你的程序是否符合預(yù)期。

測(cè)試可以劃分為不同的級(jí)別。一些測(cè)試可能專注于小細(xì)節(jié)(比如某一個(gè)模型的方法是否會(huì)返回預(yù)期的值?), 一些測(cè)試則專注于檢查軟件的整體運(yùn)行是否正常(用戶在對(duì)網(wǎng)站進(jìn)行了一系列的輸入后,是否返回了期望的結(jié)果?)。

測(cè)試可以分為手動(dòng)測(cè)試和自動(dòng)測(cè)試。手動(dòng)測(cè)試很常見,有時(shí)候print一個(gè)變量?jī)?nèi)容,都可以看做是測(cè)試的一部分。手動(dòng)測(cè)試往往很零碎、不成體系、不夠完整、耗時(shí)費(fèi)力、效率低下,測(cè)試結(jié)果也不一定準(zhǔn)確。

自動(dòng)化測(cè)試則是系統(tǒng)地較為完整地對(duì)程序進(jìn)行測(cè)試,效率高,準(zhǔn)確性高,并且大部分共同的測(cè)試工作會(huì)由系統(tǒng)來幫你完成。一旦你創(chuàng)建了一組自動(dòng)化測(cè)試程序,當(dāng)你修改了你的應(yīng)用,你就可以用這組測(cè)試程序來檢查你的代碼是否仍然同預(yù)期的那樣運(yùn)行,而無需執(zhí)行耗時(shí)的手動(dòng)測(cè)試。

為什么需要測(cè)試?

大家都明白:

測(cè)試可以節(jié)省你的時(shí)間測(cè)試不僅僅可以發(fā)現(xiàn)問題,還能防止問題測(cè)試使你的代碼更受歡迎測(cè)試有助于團(tuán)隊(duì)合作

二、編寫測(cè)試程序

Django是一個(gè)全面、完善、嚴(yán)謹(jǐn)?shù)腤eb框架,當(dāng)然不會(huì)缺少測(cè)試功能。

1.遇見BUG

很巧,在我們的投票應(yīng)用中有一個(gè)小bug需要修改:在Question.was_published_recently()方法的返回值中,當(dāng)Qeustion在最近的一天發(fā)布的時(shí)候返回True(這是正確的),然而當(dāng)Question在未來的日期內(nèi)發(fā)布的時(shí)候也返回True(這是錯(cuò)誤的)。

我們可以在admin后臺(tái)創(chuàng)建一個(gè)發(fā)布日期在未來的Question,然后在shell中驗(yàn)證這個(gè)bug:

$ python manage.py shell

>>> import datetime
>>> from django.utils import timezone
>>> from polls.models import Question
>>> # 創(chuàng)建一個(gè)發(fā)布日期在30天后的問卷
>>> future_question = Question(pub_date=timezone.now() + datetime.timedelta(days=30))
>>> # 測(cè)試一下返回值
>>> future_question.was_published_recently()True

問題的核心在于我們?cè)试S創(chuàng)建在未來時(shí)間才發(fā)布的問卷,由于“未來”不等于“最近”,因此這顯然是個(gè)bug。

2.創(chuàng)建一個(gè)測(cè)試來暴露這個(gè)bug

剛才我們是在shell中測(cè)試了這個(gè)bug,那如何通過自動(dòng)化測(cè)試來發(fā)現(xiàn)這個(gè)bug呢?

通常,我們會(huì)把測(cè)試代碼放在應(yīng)用的tests.py文件中,測(cè)試系統(tǒng)將自動(dòng)地從任何名字以test開頭的文件中查找測(cè)試程序。每個(gè)app在創(chuàng)建的時(shí)候,都會(huì)自動(dòng)創(chuàng)建一個(gè)tests.py文件,就像views.py等文件一樣。

將下面的代碼輸入投票應(yīng)用的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):
        """        在將來發(fā)布的問卷應(yīng)該返回False        """
        time = timezone.now() + datetime.timedelta(days=30)
        future_question = Question(pub_date=time)
        self.assertIs(future_question.was_published_recently(), False)

我們?cè)谶@里創(chuàng)建了一個(gè)django.test.TestCase的子類,它具有一個(gè)方法,該方法創(chuàng)建一個(gè)pub_date在未來的Question實(shí)例。最后我們檢查was_published_recently()的輸出,它應(yīng)該是 False。

3.運(yùn)行測(cè)試程序

在終端中,運(yùn)行下面的命令,

$ python manage.py test polls

你將看到結(jié)果如下:

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'...

這其中都發(fā)生了些什么?:

python manage.py test polls命令會(huì)查找投票應(yīng)用中所有的測(cè)試程序發(fā)現(xiàn)一個(gè)django.test.TestCase的子類為測(cè)試創(chuàng)建一個(gè)專用的數(shù)據(jù)庫查找名字以test開頭的測(cè)試方法在test_was_published_recently_with_future_question方法中,創(chuàng)建一個(gè)Question實(shí)例,該實(shí)例的pub_data字段的值是30天后的未來日期。然后利用assertIs()方法,它發(fā)現(xiàn)was_published_recently()返回了True,而不是我們希望的False。

最后,測(cè)試程序會(huì)通知我們哪個(gè)測(cè)試失敗了,錯(cuò)誤出現(xiàn)在哪一行。

整個(gè)測(cè)試用例基本上和Python內(nèi)置的unittest非常相似,大家可以參考Python教程中測(cè)試相關(guān)的章節(jié)。

4.修復(fù)bug

我們已經(jīng)知道了問題所在,現(xiàn)在可以去修復(fù)bug了。修改源代碼,具體如下:

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

再次運(yùn)行測(cè)試程序:

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已經(jīng)沒有了。

5.更加全面的測(cè)試

事實(shí)上,前面的測(cè)試用例還不夠完整,為了使was_published_recently()方法更加可靠,我們?cè)谏厦娴臏y(cè)試類中再額外添加兩個(gè)其它的方法,來更加全面地進(jìn)行測(cè)試。

# 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):
    """    最近一天內(nèi)的問卷,返回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)

現(xiàn)在我們有三個(gè)測(cè)試來保證無論發(fā)布時(shí)間是在過去、現(xiàn)在還是未來Question.was_published_recently()都將返回正確的結(jié)果。

上述就是小編為大家分享的Django項(xiàng)目怎么實(shí)現(xiàn)測(cè)試了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道。

新聞名稱:Django項(xiàng)目怎么實(shí)現(xiàn)測(cè)試-創(chuàng)新互聯(lián)
URL分享:http://www.muchs.cn/article44/depdhe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、網(wǎng)站排名建站公司、網(wǎng)站改版、微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計(jì)