django提供了一小系列工具在你寫測(cè)試工具
測(cè)試客戶端client
? ? ? ?測(cè)試客戶端client是個(gè)可以充當(dāng)虛擬web瀏覽器的python類巴粪,可以讓你測(cè)試你的視圖層肴沫, 以編程的方式與你的django應(yīng)用互動(dòng)澎胡。
? ? ? ?你可以使用測(cè)試客戶端做一些事情
模擬url的get和post請(qǐng)求和觀察返回結(jié)果槐臀, 包括返回的請(qǐng)求頭和響應(yīng)的狀態(tài)碼以及頁(yè)面內(nèi)容
查看跳轉(zhuǎn)鏈接并檢查重定向和狀態(tài)碼
測(cè)試給定請(qǐng)求是否呈現(xiàn)的是給定的模板
請(qǐng)注意抒钱, 測(cè)試客戶端并非要帶帶slecuium或者其他瀏覽器框架瞬欧, django的測(cè)試客戶端有一個(gè)不公的關(guān)注點(diǎn), 簡(jiǎn)而言之
使用django測(cè)試客戶端是為建立正確的樣例呈現(xiàn)晦鞋, 并且該樣例能正確的通過(guò)上下文測(cè)試數(shù)據(jù)
使用像selenium這樣內(nèi)置瀏覽器的框架測(cè)試呈現(xiàn)的html和頁(yè)面行為蹲缠, 也就是javascript函數(shù)。django對(duì)這個(gè)這些框架進(jìn)行了特別的支持悠垛;看LiverServerTestCase部分了解更多的詳情
一個(gè)全面的測(cè)試套裝應(yīng)該兩種測(cè)試的的組合
概況及簡(jiǎn)單樣例
要使用測(cè)試客戶端线定, 先實(shí)例一個(gè)django.test.Client,然后獲取頁(yè)面
>>> from django.test import Client
>>> c = Client()
>>> response = c.post('/login/', {'username': 'john', 'password': 'smith'})>>> response.status_code200
>>> response = c.get('/customer/details/')
>>> response.contentb'<!DOCTYPE html...'
這是個(gè)示例鼎文, 你當(dāng)然也可以在python交互式回話中實(shí)例化Client
在測(cè)試工作時(shí)有一些重要的事情值得注意
? ? 測(cè)試客戶端不需要web服務(wù)器運(yùn)行渔肩, 實(shí)際上在沒(méi)有web服務(wù)器運(yùn)行的情況下將運(yùn)行的更好
? ? 當(dāng)你請(qǐng)求頁(yè)面時(shí),請(qǐng)不要填寫全部域名拇惋,而是指定路徑
例子周偎, 正確形式
>>> c.get('/login/')
錯(cuò)誤形式
>>> c.get('https://www.example.com/login/')?
測(cè)試客戶端對(duì)不是你的django項(xiàng)目web頁(yè)面是無(wú)能為力的, 如果你需要請(qǐng)求其他的web頁(yè)面撑帖,可以使用python的標(biāo)準(zhǔn)庫(kù)urlllib
? ? ? ?對(duì)于解釋urls蓉坎, 測(cè)試客戶端可以使用任何由你的ROOT_URLCONF設(shè)置的URLconf
? ? ? ?即使以上的樣例都能工作在python的交互性解釋器上, 但是像模板相關(guān)功能只能在測(cè)試運(yùn)行的時(shí)候才能測(cè)試
這是測(cè)試runner的一點(diǎn)黑魔法胡嘿, 為了確定view已經(jīng)加載了給定的模板
默認(rèn)在你自己的站點(diǎn)測(cè)試端將取消所有CSRF檢查動(dòng)作
在某些情況下蛉艾,你想要測(cè)試CSRF, 你可以實(shí)例化一個(gè)強(qiáng)制執(zhí)行CSRF檢查的測(cè)試客戶端衷敌, 你可以使用enforce_csrf_checks參數(shù)構(gòu)建一個(gè)測(cè)試客戶端
>>> from django.test import Client >>> csrf_client = Client(enforce_csrf_checks=True)
發(fā)出請(qǐng)求
使用django.test.Client類發(fā)送請(qǐng)求
class?Client(enforce_csrf_checks=False,?json_encoder=DjangoJSONEncoder,?**defaults)
測(cè)試客戶端構(gòu)建不需要參數(shù)勿侯, 然后你可以使用關(guān)鍵值指定某些默認(rèn)的請(qǐng)求頭, 例如缴罗, 你可以發(fā)送User-Agent請(qǐng)求頭在每次http請(qǐng)求中
c=Client(HTTP_USER_AGENT='Mozilla/5.0')
傳遞給get助琐, post請(qǐng)求的額外參數(shù)有先有構(gòu)造測(cè)試客戶端的默認(rèn)參數(shù)
enforce_csrf_checks參數(shù)被用測(cè)試CSRF保護(hù)機(jī)制
json_encoder參數(shù)允許在post請(qǐng)求中設(shè)置一個(gè)定制的json編碼器來(lái)序列化json
json_encoder 是在django2.1中加入
一旦你有一個(gè)測(cè)試客戶端, 你可以請(qǐng)求下面任意一個(gè)方法