日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
創(chuàng)新互聯(lián)Django4.0教程:Django4.0測試-編寫并運(yùn)行測試

編寫測試

Django 的單元測試采用 Python 的標(biāo)準(zhǔn)模塊: ?unittest?。該模塊以類的形式定義測試。
下面是一個(gè)例子,它是 ?django.test.TestCase? 的子類,同時(shí)父類也是 ?unittest.TestCase? 的子類,在事務(wù)內(nèi)部運(yùn)行每個(gè)測試以提供隔離:

我們提供的服務(wù)有:成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、微信公眾號(hào)開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、宣恩ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的宣恩網(wǎng)站制作公司

from django.test import TestCase
from myapp.models import Animal

class AnimalTestCase(TestCase):
    def setUp(self):
        Animal.objects.create(name="lion", sound="roar")
        Animal.objects.create(name="cat", sound="meow")

    def test_animals_can_speak(self):
        """Animals that can speak are correctly identified"""
        lion = Animal.objects.get(name="lion")
        cat = Animal.objects.get(name="cat")
        self.assertEqual(lion.speak(), 'The lion says "roar"')
        self.assertEqual(cat.speak(), 'The cat says "meow"')

當(dāng)你 運(yùn)行你的測試 時(shí),測試工具的默認(rèn)行為是在任何名字以 ?test? 開頭的文件中找到所有的測試用例(也就是 ?unittest.TestCase? 的子類),從這些測試用例中自動(dòng)構(gòu)建一個(gè)測試套件,然后運(yùn)行該套件。

默認(rèn)的 ?startapp ?會(huì)在新的應(yīng)用程序中創(chuàng)建一個(gè) ?tests.py? 文件。如果你只有幾個(gè)測試,這可能是好的,但隨著你的測試套件的增長,你可能會(huì)想把它重組為一個(gè)測試包,這樣你就可以把你的測試分成不同的子模塊,如 ?test_models.py?、?test_views.py?、?test_forms.py? 等。你可以自由選擇任何你喜歡的組織方案。

如果您的測試依賴于數(shù)據(jù)庫訪問,例如創(chuàng)建或查詢模型,請確保將您的測試類創(chuàng)建為 ?django.test.TestCase? 的子類,而不是 ?unittest.TestCase?。

使用 ?unittest.TestCase? 避免了在事務(wù)中運(yùn)行每個(gè)測試并刷新數(shù)據(jù)庫的成本,但是如果您的測試與數(shù)據(jù)庫交互,它們的行為將根據(jù)測試運(yùn)行器執(zhí)行它們的順序而有所不同。 這可能導(dǎo)致單元測試在單獨(dú)運(yùn)行時(shí)通過,但在套件中運(yùn)行時(shí)失敗。

運(yùn)行測試

編寫完測試后,使用項(xiàng)目的 ?manage.py? 實(shí)用程序的 ?test ?命令運(yùn)行它們:

$ ./manage.py test

測試發(fā)現(xiàn)是基于 unittest 模塊的 內(nèi)建測試發(fā)現(xiàn)。默認(rèn)情況下,這將發(fā)現(xiàn)當(dāng)前工作目錄下任何名為“test*.py”的文件中的測試。
你可以通過向 ?./manage.py test? 提供任意數(shù)量的測試標(biāo)簽來指定要運(yùn)行的特定測試。每個(gè)測試標(biāo)簽可以是指向包、模塊、TestCase 子類或測試方法的點(diǎn)分隔 Python 路徑。例如:

# Run all the tests in the animals.tests module
$ ./manage.py test animals.tests

# Run all the tests found within the 'animals' package
$ ./manage.py test animals

# Run just one test case
$ ./manage.py test animals.tests.AnimalTestCase

# Run just one test method
$ ./manage.py test animals.tests.AnimalTestCase.test_animals_can_speak

你還可以提供目錄路徑,以發(fā)現(xiàn)該目錄下的測試:

$ ./manage.py test animals/

如果你的測試文件的命名與 ?test*.py? 模式不同,你可以使用 ?-p? (或 ?--pattern?)選項(xiàng)指定一個(gè)自定義文件名模式匹配:

$ ./manage.py test --pattern="tests_*.py"

如果你在測試運(yùn)行時(shí)按 ?Ctrl+C?,測試運(yùn)行器將等待當(dāng)前運(yùn)行的測試完成,然后優(yōu)雅地退出。在優(yōu)雅退出過程中,測試運(yùn)行器將輸出任何測試失敗的細(xì)節(jié),報(bào)告運(yùn)行了多少次測試,遇到了多少次錯(cuò)誤和失敗,并像往常一樣銷毀任何測試數(shù)據(jù)庫。因此,如果你忘記了傳入 ?--failfast? 選項(xiàng),注意到一些測試意外地失敗了,并且想在不等待整個(gè)測試運(yùn)行完成的情況下獲得失敗的細(xì)節(jié),那么按下 ?Ctrl+C? 就會(huì)非常有用。
如果你不想等待當(dāng)前正在進(jìn)行的測試結(jié)束,你可以按兩次 ?Ctrl+C?,測試運(yùn)行將立即停止,但不會(huì)優(yōu)雅地停止。不會(huì)報(bào)告中斷前運(yùn)行的測試細(xì)節(jié),也不會(huì)銷毀運(yùn)行中創(chuàng)建的任何測試數(shù)據(jù)庫。

測試數(shù)據(jù)庫

需要數(shù)據(jù)庫的測試(即模型測試)將不會(huì)使用“實(shí)際”(生產(chǎn))數(shù)據(jù)庫。 將為測試創(chuàng)建單獨(dú)的空白數(shù)據(jù)庫。
無論測試是通過還是失敗,當(dāng)所有測試執(zhí)行完畢后,測試數(shù)據(jù)庫都會(huì)被銷毀。
你可以通過使用 ?test --keepdb? 選項(xiàng)來防止測試數(shù)據(jù)庫被破壞。 這將在兩次運(yùn)行之間保留測試數(shù)據(jù)庫。 如果數(shù)據(jù)庫不存在,將首先創(chuàng)建它。 任何遷移都將被應(yīng)用,以使其保持最新狀態(tài)。
如上一節(jié)所述,如果測試運(yùn)行被強(qiáng)行中斷,測試數(shù)據(jù)庫可能不會(huì)被銷毀。在下一次運(yùn)行時(shí),你會(huì)被問到是要重新使用還是銷毀數(shù)據(jù)庫。使用 ?test --noinput? 選項(xiàng)禁止顯示該提示并自動(dòng)銷毀數(shù)據(jù)庫。 例如,在持續(xù)集成服務(wù)器上運(yùn)行測試時(shí)這很有用,該測試可能會(huì)因超時(shí)而中斷。
默認(rèn)的測試數(shù)據(jù)庫名稱是通過在 DATABASES 中每個(gè) ?NAME ?的值前加上 ?test_? 來創(chuàng)建的。當(dāng)使用 SQLite時(shí),默認(rèn)情況下測試將使用內(nèi)存數(shù)據(jù)庫(即數(shù)據(jù)庫將在內(nèi)存中創(chuàng)建,完全繞開文件系統(tǒng)?。?。DATABASES 中的 ?TEST ?字典提供了許多設(shè)置來配置你的測試數(shù)據(jù)庫。例如,如果你想使用不同的數(shù)據(jù)庫名稱,給 DATABASES 中的每個(gè)數(shù)據(jù)庫在 ?TEST ?字典中指定 ?NAME?。
在 PostgreSQL 上,?USER ?也需要對內(nèi)置的 postgres 數(shù)據(jù)庫進(jìn)行讀取訪問。
除了使用單獨(dú)的數(shù)據(jù)庫外,測試運(yùn)行器還將使用你在配置文件中的所有相同的數(shù)據(jù)庫設(shè)置: ?ENGINE?、?USER?、?HOST ?等。測試數(shù)據(jù)庫是由 ?USER ?指定的用戶創(chuàng)建的,所以你需要確保給定的用戶賬戶有足夠的權(quán)限在系統(tǒng)上創(chuàng)建一個(gè)新的數(shù)據(jù)庫。
為了對測試數(shù)據(jù)庫的字符編碼進(jìn)行精細(xì)控制,請使用 ?CHARSET ?TEST 選項(xiàng)。如果你使用的是 MySQL,你也可以使用 ?COLLATION ?選項(xiàng)來控制測試數(shù)據(jù)庫使用的特定字符序。
如果使用 SQLite 內(nèi)存數(shù)據(jù)庫,啟用了 共享緩存,你就可以編寫線程之間共享數(shù)據(jù)庫的測試。

執(zhí)行測試的順序

為了保證所有的 ?TestCase ?代碼都從干凈的數(shù)據(jù)庫開始,Django 測試運(yùn)行器以如下方式重新排序測試:

  • 所有 ?TestCase ?的子類首先運(yùn)行。
  • 然后,所有其他基于Django的測試(基于 ?SimpleTestCase ?的測試用例,包括 ?TransactionTestCase?)都會(huì)被運(yùn)行,它們之間不保證也不強(qiáng)制執(zhí)行特定的順序。
  • 然后運(yùn)行任何其他的 ?unittest.TestCase? 測試(包括 doctests),這些測試可能會(huì)改變數(shù)據(jù)庫而不將其恢復(fù)到原始狀態(tài)。

回滾模擬

任何在遷移中加載的初始數(shù)據(jù)將只能在 ?TestCase ?測試中使用,而不能在 ?TransactionTestCase ?測試中使用,此外,只有在支持事務(wù)的后端(最重要的例外是 MyISAM)上才能使用。對于依賴 ?TransactionTestCase ?的測試也是如此,比如 ?LiveServerTestCase ?和 ?StaticLiveServerTestCase?。
Django 可以通過在 ?TestCase ?或 ?TransactionTestCase ?中設(shè)置 ?serialized_rollback ?選項(xiàng)為 ?True ?來為你重新加載每個(gè)測試用例的數(shù)據(jù),但請注意,這將使測試套件的速度降低約 3 倍。
第三方應(yīng)用程序或那些針對 MyISAM 開發(fā)的應(yīng)用程序?qū)⑿枰O(shè)置這個(gè)功能;但是,一般來說,你應(yīng)該針對事務(wù)性數(shù)據(jù)庫開發(fā)你自己的項(xiàng)目,并在大多數(shù)測試中使用 ?TestCase?,因此不需要這個(gè)設(shè)置。
初始序列化通常是非??斓模绻阆M麖倪@個(gè)過程中排除一些應(yīng)用程序(并稍微加快測試運(yùn)行速度),你可以將這些應(yīng)用程序添加到 ?TEST_NON_SERIALIZED_APPS?。
為了防止序列化數(shù)據(jù)被加載兩次,設(shè)置 ?serialized_rollback=True? 在刷新測試數(shù)據(jù)庫時(shí)禁用 ?post_migrate ?信號(hào)。

其他測試條件

無論配置文件中的 ?DEBUG ?設(shè)置值是多少,所有的 Django 測試都以 ?DEBUG=False? 運(yùn)行。這是為了確保你的代碼觀察到的輸出與生產(chǎn)環(huán)境下的輸出一致。
每次測試后都不會(huì)清除緩存,如果在生產(chǎn)環(huán)境中運(yùn)行測試,則運(yùn)行 ?manage.py test fooapp ?可以將測試中的數(shù)據(jù)插入實(shí)時(shí)系統(tǒng)的緩存中,因?yàn)榕c數(shù)據(jù)庫不同的是,沒有使用單獨(dú)的測試緩存。這種行為在未來可能改變。

了解測試輸出

當(dāng)你運(yùn)行測試時(shí),你會(huì)看到一些消息,因?yàn)闇y試運(yùn)行器正在做準(zhǔn)備。你可以通過命令行上的 ?verbosity ?選項(xiàng)來控制這些消息的詳細(xì)程度:

Creating test database...
Creating table myapp_animal
Creating table myapp_mineral

這告訴你測試運(yùn)行程序正在創(chuàng)建測試數(shù)據(jù)庫,如上一節(jié)所述。
創(chuàng)建測試數(shù)據(jù)庫后,Django 將運(yùn)行你的測試。 如果一切順利,你會(huì)看到類似以下內(nèi)容的信息:

----------------------------------------------------------------------
Ran 22 tests in 0.221s

OK

但是,如果有測試失敗,你會(huì)看到關(guān)于哪些測試失敗的完整細(xì)節(jié):

======================================================================
FAIL: test_was_published_recently_with_future_poll (polls.tests.PollMethodTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/dev/mysite/polls/tests.py", line 16, in test_was_published_recently_with_future_poll
    self.assertIs(future_poll.was_published_recently(), False)
AssertionError: True is not False

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (failures=1)

對這個(gè)錯(cuò)誤輸出的完整解釋超出了本文的范圍,但它非常直觀。
請注意,對于任何數(shù)量的失敗和錯(cuò)誤測試,?test-runner? 腳本的返回碼均為 1。 如果所有測試均通過,則返回碼為 0。如果你在 shell 腳本中使用 ?test-runner? 腳本,并且需要在該級(jí)別上測試成功或失敗,則此功能很有用。

加快測試

并行運(yùn)行測試

只要測試正確隔離,你就可以并行運(yùn)行它們以加快多核硬件的運(yùn)行速度。

密碼哈希

默認(rèn)密碼哈希器在設(shè)計(jì)上相當(dāng)慢。 如果要在測試中對許多用戶進(jìn)行身份驗(yàn)證,則可能需要使用自定義設(shè)置文件,并將 ?PASSWORD_HASHERS ?設(shè)置為更快的哈希算法:

PASSWORD_HASHERS = [
    'django.contrib.auth.hashers.MD5PasswordHasher',
]

不要忘記在 ?PASSWORD_HASHERS ?中包含在輔助工具中使用的任何哈希算法,如果有的話。

保留測試數(shù)據(jù)庫

?test --keepdb? 選項(xiàng)在兩次測試運(yùn)行之間保留測試數(shù)據(jù)庫。 它跳過了創(chuàng)建和銷毀操作,這可以大大減少運(yùn)行測試的時(shí)間。


當(dāng)前標(biāo)題:創(chuàng)新互聯(lián)Django4.0教程:Django4.0測試-編寫并運(yùn)行測試
本文鏈接:http://www.5511xx.com/article/cdhcoos.html