前端小技巧之debug與測試網絡請求負載

需求:更改前端的某個ajax網絡請求的負載(payload)並測試保證功能正常

假如此次的修改改動較大,或者原本的構建 payload 的邏輯比較複雜,我們可能需要反覆地修改和測試。

如果這個 ajax request發送後對後端資源造成的影響很小的話 —— 比如 創建一本書籍記錄,更新一篇文章的標籤,其實我們也不需要考慮太多,直接一邊修改一邊測試就可以了。

因爲這些不痛不癢的資源即使在測試過程中被創建或者修改了,測試結束後也可以輕鬆地刪掉,不會造成大影響。


但是,假如這個ajax request 在後端會觸發比較重的操作 —— 比如創建某個服務集羣,重新部署某個服務節點,我們就得謹慎考慮了。

這類比較重的操作一方面會花費比較長的時間,另一方面會真實地修改或消耗線上資源,隨意且頻繁地測試並不合適。

這種情形要求我們除了最後的一兩次驗收,其餘的測試都不該真的發請求到後端.

那應該怎麼做呢?


方案一:修改並註釋請求發送的代碼

假如以下是原本的代碼

getFormData = ()=> {
  // construct the payload from form data
}

onSubmit = () => {
    const payload = getFormData();
    httpClient.postRequest(payload);    
};

測試時期的代碼

getFormData = ()=> {
  // construct the payload from form data - updated some code and logic
}

onSubmit = () => {
    const payload = getFormData();
    console.log(payload); 
    //httpClient.postRequest(payload);     
};

我們把 httpClient.postRequest(payload); 這行代碼註釋掉,並增加 console.log(payload); 把payload 打到 console 裏查看。確認修改後的payload完全正確後(這個過程可能會反覆多次),再去掉註釋代碼。


這種方案的確避免了真正的網絡請求的發起,代碼邏輯也清晰簡單。

但這種方案的缺點也很明顯,我們修改了原本能工作的代碼——即註釋了httpClient.postRequest(payload); 在開發結束後,假如我們忘記了去掉這行註釋,把代碼推到線上,就會導致這個表單功能失效。


方案二:在表單提交的代碼設置斷點

同樣用上面的代碼爲例

getFormData = ()=> {
  // construct the payload from form data
}

onSubmit = () => {
    const payload = getFormData();
    httpClient.postRequest(payload); // set breakpoint here
};

我們需要在 httpClient.postRequest(payload); 這行打斷點

具體怎麼做呢?

打開Chrome 開發者工具,然後看下圖(注意各個箭頭)

ebbf919f2ffe52701c2258f651ecca82.jpeg

觸發網絡請求前,代碼會被斷點攔截,此時我們就能在右邊欄裏看到ajax request的payload了。

由於斷點阻斷了代碼的執行,這個ajax request不會發送到服務器。

假如發現payload不對,繼續修改代碼後,只需要刷新頁面就可以重置當前頁面的js代碼運行狀態(脫離斷點)。

這種方案解決了方案一的問題 —— 不修改任何原本能正常工作的代碼

但是這種方案的缺陷也很明顯:假如打斷點的js文件正是正在被修改的代碼文件,一旦增加或減少代碼行數,斷點的位置卻仍然打在原本的那行上(或最靠近的可執行代碼上)

舉個例子:上面截圖的23行代碼現在是 httpClient.postRequest(payload) 但是這個文件的其他地方增加或減少了代碼,導致 httpClient.postRequest(payload) 現在在 27行,而斷點偏移到了 25 行上(因爲 23行不可執行)

a2f9b6124f4350652095e5ae12312bca.jpeg

爲了避免這種情況,我們可以在 httpClient.postRequest(payload); 前加 debugger —— 可以起到一樣的斷點效果 (前提是打開 Chrome 開發工具欄)且不會隨意偏移,代碼如下:

getFormData = ()=> {
  // construct the payload from form data
}

onSubmit = () => {
    const payload = getFormData();
    debugger;
    httpClient.postRequest(payload); 
}


但使用 debugger 會帶來類似方案一的缺點 —— 在開發完成後,記得清理 debugger 這行代碼。

另一個避免斷點偏移的方案是把斷點打到非修改的js文件上 ,但這種方案有前提條件——上述的 httpClient代碼 是在另一個js 文件內。

總之,方案二使用 Chrome 開發者工具打斷點 或者 加入 debbuger 仍然有侷限性,有些情況下不是非常方便。


方案三:巧用Chrome開發者工具使網頁離線

阻止請求發送到後端的最快辦法是什麼——拔網線斷網!

當然,有了chrome開發者工具幫助,我們不用拔網線也能使網頁離線,具體做法如下圖(注意箭頭)

79a0c5c2cea306c61421ae077cacca68.jpeg

點擊第三個箭頭所指可以看到 request 的 payload 和其他信息

23403a95a10e8cf13e24566db4b08b3d.jpeg

雖然網頁離線了,但是ajax request的所有信息都能看到。

這種方案既不會像方案一那樣影響其他代碼,也不會像方案二那樣因爲js文件的修改產生影響。

現代前端框架如 React 或者 vue 都可以熱部署——修改完代碼,界面就會自動刷新,但其實熱部署的底層原理藉助了網絡請求,因此網頁離線會導致熱部署失敗。所以,一旦修改完代碼,記得重新打開網絡讓頁面刷新,測試之前再離線。

這就是方案三的缺點——得重複地打開或關閉網絡,操作略繁瑣。




前端小技巧之debug與測試網絡請求負載到此就介紹完了,三種方案各有利弊,你最喜歡哪個方案?


拓展:

本文其實只是拋磚引玉,Chrome 開發者工具是所有前端開發者日常開發的好幫手,推薦大家找時間認真閱讀官方文檔,學習更詳細的使用技巧

https://developers.google.com/web/tools/chrome-devtoolsdevelopers.google.com



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章