欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在Django下測試與調(diào)試REST API的方法詳解

 更新時間:2019年08月29日 16:20:04   作者:Mr-Bruce  
今天小編就為大家分享一篇在Django下測試與調(diào)試REST API的方法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

對于大多數(shù)研發(fā)人員來說,都期望能找到一個良好的測試/調(diào)試方法,來提高工作效率和快速解決問題。所謂調(diào)試,偏重于對某個bug的查找、定位、修復(fù);所謂測試,是檢驗?zāi)硞€功能是否達(dá)到預(yù)期效果。測試發(fā)現(xiàn)問題后進(jìn)行調(diào)試,從而解決問題。

對于后臺研發(fā)來說,往往沒有客戶端研發(fā)(Windows/Android等等)那樣簡單有效的DEBUG方法,比如Step by Step。雖然目前有很多IDE可以實現(xiàn)本地調(diào)試,但是因為后臺研發(fā)的環(huán)境復(fù)雜,你很難在一臺機器上模擬所有的環(huán)境,比如線上的數(shù)據(jù)庫只能在內(nèi)網(wǎng)訪問等等,所以很多時候需要在服務(wù)器(DEV/STG/PROD)上進(jìn)行調(diào)試和測試工作。本文嘗試介紹一些Django Web服務(wù)下調(diào)試/測試REST API的方法,因為是方法,那自然仁者見仁智者見智,所以也許你覺得會有用,也許會覺得毫無道理。

首先要說的是,在服務(wù)器環(huán)境,針對Django Web服務(wù),print log是最簡單有效的方法。python的語言特性決定了你可以隨時添加log,重新run一下就可以看到結(jié)果。本文接下來要說的,并不是什么超脫于pring log的超級技巧,而是如何編寫代碼、利用工具進(jìn)行有效的調(diào)試/測試工作,并盡量做到減少重復(fù)性工作。

對于任何一個REST API來說,需要進(jìn)行測試的內(nèi)容包括兩部分:請求中的各個功能模塊是否正常、整個請求是否正常。對于研發(fā)人員來說,寫完代碼后當(dāng)然要進(jìn)行一番測試來確認(rèn)代碼是否正常工作、是否符合需求。這時,有人選擇先測試一下整個請求是否正常,如果正常就萬事大吉,交付給測試同事測試了,如果不正常則進(jìn)一步查看是哪個功能模塊出現(xiàn)問題;有人選擇先逐一測試各個功能模塊是否正常,在確保各功能模塊正常后,再進(jìn)一步測試整個請求是否正常,然后交付測試。這兩種行事風(fēng)格并沒有特別的利弊之說,最好是在不同的情形下選擇使用,比如對于簡單的功能API,可以使用第一種,而對于復(fù)雜的功能API,選擇第二種。不管行事風(fēng)格如何,都會涉及都前面所述的兩部分測試內(nèi)容,即分與合的兩部分測試。Django下,常見的有這么兩種方法,或者說目前在我們項目組使用最廣泛的兩種方法:

1. 對于功能模塊,使用python manage.py shell來進(jìn)行調(diào)試與測試。該命令幫助我們啟動一個python 的shell環(huán)境,并自動加載了Django的上下文信息,我們可以在里面import任何函數(shù)和類,構(gòu)建參數(shù),調(diào)試/測試其相關(guān)的功能。如果需要定位問題,一種方法是在源文件中加入更多的log,一種方法是將該功能模塊逐行敲一遍,看看在哪邊出現(xiàn)了問題。

2. 對于整個請求,使用工具curl(linux下)或者Advanced REST Client(Windows下,Chome的一個插件)來構(gòu)建一個Request,發(fā)送給后臺服務(wù)。筆者使用更多的是第二個,其可以構(gòu)建各個Method的Request,并且可以保存相應(yīng)的請求,還可以分享你保存的列表給別人使用。發(fā)送請求后,通過后臺log來查看請求是否正常及相關(guān)的異常錯誤問題,你可以使用tail -f /var/log/test.log來查看動態(tài)log信息。

在合適的位置增加規(guī)范化的log對于后臺服務(wù)來說,是一件非常重要的事情,能幫助我們在線上環(huán)境及時發(fā)現(xiàn)問題,log的書寫應(yīng)該包括相應(yīng)的Tag,ErrorCode等等信息,方便查找。

上述兩個方法,可以很好的對Django下的Web服務(wù)進(jìn)行調(diào)試/測試,但是卻有著一些缺憾。對應(yīng)第一種方法,通過python manage.py shell進(jìn)行功能測試,意味著每次都需要啟動一個shell,每次都需要將相應(yīng)的代碼敲一遍,存在著重復(fù)性的工作,其實這種方法更適用于應(yīng)對特殊的CASE,而不是針對Common的功能進(jìn)行調(diào)試/測試。對于第二種方法,首先,當(dāng)你想增加一些log時,你需要重啟一下服務(wù)才能生效,而這種情況在生產(chǎn)環(huán)境就比較棘手;其次,通過這種方法進(jìn)行測試,你沒有辦法在程序中處理一些Response的結(jié)果。

Python和Django自帶了一些測試框架和工具,而充分利用這些,正好可以解決上述兩種方法的缺憾。常用的一些測試框架和工具有:

1)單元測試框架TestCase;

2)Django的Test Client,類似curl的工具,是一個類似內(nèi)置瀏覽器的工具,可以發(fā)起一個請求,并拿到對應(yīng)的response內(nèi)容;

3)RequestFactory,允許構(gòu)建一個request參數(shù),實現(xiàn)象調(diào)用函數(shù)一樣調(diào)用一個view的請求函數(shù),可以繞過middleware。

結(jié)合前面兩種方法的缺憾和上述的測試框架/工具,下面介紹兩種筆者常用的兩種調(diào)試/測試方法:

1. 對于功能模塊,采用單元測試的方法。單元測試常見于TDD的研發(fā)流程中,一方面可以驗證所寫的程序模塊運行后的行為是否符合設(shè)計的測試用例,另一方面可以在修改代碼后,快速驗證是否改出了問題,是否與原有行為保持一致。采用單元測試的方法,既可以實現(xiàn)功能模塊的調(diào)試/測試功能,也能有效的避免重復(fù)性工作,有效的彌補了前面所述的第一種方法的缺點。

python本身自帶了一套unittest框架,而diango對于它又做了一層封裝,可以根據(jù)喜好選擇使用,筆者通常還是習(xí)慣使用python自帶的單元測試框架。一個簡單的單元測試代碼如下:

import unittest
 
class TestStringMethods(unittest.TestCase):
 
 def test_upper(self):
  self.assertEqual('foo'.upper(), 'FOO')
 
 def test_isupper(self):
  self.assertTrue('FOO'.isupper())
  self.assertFalse('Foo'.isupper())
 
 def test_split(self):
  s = 'hello world'
  self.assertEqual(s.split(), ['hello', 'world'])
  # check that s.split fails when the separator is not a string
  with self.assertRaises(TypeError):
   s.split(2)
 
if __name__ == '__main__':
 unittest.main()

2. 對于整個請求,采用RequestFactory來實現(xiàn)類函數(shù)式調(diào)用的方法,從而可以實現(xiàn)調(diào)用view的請求函數(shù)。采用這個方法,可以有效避免前面第二種方法中需要重啟服務(wù)的缺陷,當(dāng)你修改了代碼后,只要重新reload一下模塊,即可實現(xiàn)新的調(diào)用;同時,你也可以在代碼中拿到對應(yīng)的response內(nèi)容,做必要的校驗處理。

然而,對于我們使用rest framework 框架來做REST API開發(fā)來說,Django原生的RequestFactory還是有一點缺陷,就是不能做authenticate。因為rest framework中的authenticate是做在request前面的,而不是在middleware中,所以采用原生的RequestFactory無法繞過authenticate。不過,rest framework又重新封裝了一個APIRequestFactory類,提供了相關(guān)的模擬鑒權(quán)功能,常見的用法如下:

from rest_framework.test import APIRequestFactory
from rest_framework.test import force_authenticate
 
# Using the standard RequestFactory API to create a form POST request
factory = APIRequestFactory()
request = factory.post('/notes/', {'title': 'new idea'}, format='json')
 
# force authenticate
user = User.objects.get(username='olivia')
force_authenticate(request, user=user)
 
# call the view request
view = AccountDetail.as_view()
response = view(request)

上面所述的方法,只是筆者目前常用的四種方法,在實際工作中根據(jù)需要進(jìn)行選擇使用。當(dāng)然,我相信還有更多更好的其他方法。

這篇在Django下測試與調(diào)試REST API的方法詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python爬蟲爬取屬于自己的地鐵線路圖

    Python爬蟲爬取屬于自己的地鐵線路圖

    這篇文章主要介紹了Python爬蟲爬取屬于自己的地鐵線路圖,下面文章主要事根據(jù)自己需要對地鐵路線進(jìn)行爬取的實現(xiàn)過程,需要的小伙伴可以參考一下,希望對你有所幫助
    2021-12-12
  • PyQt 5 設(shè)置Logo圖標(biāo)和Title標(biāo)題的操作

    PyQt 5 設(shè)置Logo圖標(biāo)和Title標(biāo)題的操作

    這篇文章主要介紹了PyQt 5 設(shè)置Logo圖標(biāo)和Title標(biāo)題的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • Python中單引號、雙引號和三引號具體的用法及注意點

    Python中單引號、雙引號和三引號具體的用法及注意點

    這篇文章主要給大家介紹了關(guān)于Python中單引號、雙引號和三引號具體的用法及注意點的相關(guān)資料,Python中單引號、雙引號、三引號中使用常常困惑,想弄明白這三者相同點和不同點,需要的朋友可以參考下
    2023-07-07
  • Python3正則匹配re.split,re.finditer及re.findall函數(shù)用法詳解

    Python3正則匹配re.split,re.finditer及re.findall函數(shù)用法詳解

    這篇文章主要介紹了Python3正則匹配re.split,re.finditer及re.findall函數(shù)用法,結(jié)合實例形式詳細(xì)分析了正則匹配re.split,re.finditer及re.findall函數(shù)的概念、參數(shù)、用法及操作注意事項,需要的朋友可以參考下
    2018-06-06
  • Python高級特性——詳解多維數(shù)組切片(Slice)

    Python高級特性——詳解多維數(shù)組切片(Slice)

    今天小編就為大家分享一篇Python高級特性——詳解多維數(shù)組切片(Slice),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python scrapy框架中Request對象和Response對象的介紹

    python scrapy框架中Request對象和Response對象的介紹

    本文介紹了python基礎(chǔ)之scrapy框架中Request對象和Response對象的介紹,Request對象主要是用來請求數(shù)據(jù),爬取一頁的數(shù)據(jù)重新發(fā)送一個請求的時候調(diào)用,Response對象一般是由scrapy給你自動構(gòu)建的,因此開發(fā)者不需要關(guān)心如何創(chuàng)建Response對象,下面來一起來了解更多內(nèi)容吧
    2022-02-02
  • python定時任務(wù)timeloop庫用法實例詳解

    python定時任務(wù)timeloop庫用法實例詳解

    有些時候我們需要每隔一段時間就要執(zhí)行一段程序,或者是往復(fù)循環(huán)執(zhí)行某一個任務(wù),下面這篇文章主要給大家介紹了關(guān)于python定時任務(wù)timeloop庫用法的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • python 獲取文件下所有文件或目錄os.walk()的實例

    python 獲取文件下所有文件或目錄os.walk()的實例

    下面小編就為大家分享一篇python 獲取文件下所有文件或目錄os.walk()的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • 使用Keras 實現(xiàn)查看model weights .h5 文件的內(nèi)容

    使用Keras 實現(xiàn)查看model weights .h5 文件的內(nèi)容

    這篇文章主要介紹了使用Keras 實現(xiàn)查看model weights .h5 文件的內(nèi)容,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python 使用folium繪制leaflet地圖的實現(xiàn)方法

    Python 使用folium繪制leaflet地圖的實現(xiàn)方法

    今天小編就為大家分享一篇Python 使用folium繪制leaflet地圖的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論