測試平台系列(92) 讓http請求支援文件上傳
大家好~我是
米洛!我正在從0到1打造一個開源的介面測試平台, 也在編寫一套與之對應的
教程,希望大家多多支援。歡迎關注我的公眾號
米洛的測開日記,獲取最新文章教程!
回顧
上一節呢,我們編寫了oss的客戶端這塊內容。但其實我們是有目的的,我們知道,我們有時候測試一些介面,比方說: 批量導入商品,這種情況下,我們是要給介面發送一個文件(excel或者csv)。
那怎麼保管我們的測試數據呢,那就該oss發揮它的作用了。以往我們做測試,都會放一個目錄保存測試數據,現在只不過是把數據放到了oss之中,其實道理都一樣。
今天我們就來實現http請求支援oss文件上傳。在此之前我們先得修復幾個bug(還挺多的,但只列一個典型)
bug警示
- 沒有斷言數據的時候報錯

需要2個返回值,但是咱在沒有斷言的時候只給了一個,屬實馬虎。
效果圖


思路
我們之前為了圖方便,在有body的http請求裡面,強行讓http請求二選一:
-
要麼json
-
要麼form表單
針對這樣文件的形式,就沒法二選一了,所以我們必須要存儲一個欄位:
body_type,這個欄位用來告訴我們body是什麼類型的,也就對應這裡的數據:

0代表none, 2代表form-data 1代表raw(json) 3代表x-www-form-urlencoded, 後續的依次排列。
所以我們要去用例加個body_type,並且默認為1(因為目前我們的介面類型大部分json的).
接著我們在http請求的時候,根據不同的數據類型返回不同的body即可。
新增欄位body_type

修改app/models/test_case.py,新增body_type欄位,修改處我已經紅框標註。
調整pydantic

之前我們的schema數據都存放在router下面,後來存在一些循環引入問題。所以我把請求入參這些數據都放到了models下面,特此說明一下。
添加配置
以往啊,我們很喜歡寫1,2,3,4:
if case_type == 1:
這種程式碼,但其實這種東西完全可以放到config裡面,這樣的話我們如果要變換對應的規則,就很方便,而且看1,2,3,4還不好回憶這是什麼類型。
今次,我一定要換。
在class Config下面新增子類: class BodyType:

改造Http請求客戶端
由於我們發json也好,form也好,改變的一般是這個方法:

類似這樣的,如今我們多了一個新的參數,我打算封裝一個新的方法,因為這塊http在線請求需要用到,而case的執行也得用到。
話不多說,我們直接上程式碼:

這邊普通form的話,data接收的是一個dict,json的話採用json去接收數據,而文件這種,則採用FormData:
由於我們存儲body裡面帶有oss的文件資訊,我們需要先解析一下數據,也就是先反序列化,接著取對應的文件或者文本,組成FormData。
- 運行case相關改動

之前我們有為json類型請求添加header的操作,如今都放到http client裡面去做了,所以這邊可以稍微簡化下。
- replace_body改動

這裡需要稍微改動下,只有json類型的時候才替換body的數據,因為目前這個替換隻支援字典類型。
前端部分
前端部分我寫的太爛了,有興趣去看下源碼吧(我自己都看不下去),活生生的屎山,真的。
不過我還是各種土方法給解決了,http那塊我打算就到此為止了。
我加了一個可編輯表格的組件,這個與之前的有不同,因為這個組件需要根據選擇的是FILE還是TEXT來決定VALUE單元格的輸入控制項:

這裡切換為TEXT後,右側的選擇框會變成輸入框。

可以看到,我們調用自己的http上傳文件方法(upload),完成了文件上傳的測試功能(如果能重來,我肯定不肝這個,太累了,bug小王子。)


