鐵人賽第20天
今天有調整一下路由路徑,在建置API的時候我們會設置路徑給別人呼叫,範例如下:
@router.post("/token")
這樣我的路徑就會試 http://localhost:XXXX/toekn ,這次AI同事踩到一個地雷是他API路徑設定了兩種:
client.get(f"/token")
這種方式,但假如你的router是"/token/
"但你呼叫是client.get(f"/token")
,還是可以呼叫成功取得資料,不過程式這時不會回傳200狀態碼而是回傳307去告訴你呼叫到舊的路徑,導致在測試時會跳出錯誤,因為我們預期是取得200狀態碼,這導致假如你有寫判斷回傳200才做什麼事的程式會出錯導致沒有執行。調整完後就開始繼續昨天的BUG修復,其中幾個AI同事容易卡住的BUG:
最終,終於132項測試全數通過,雖然還有一些想測的地方跟想做的後端功能,但後端還是先告一段落。
接下來會開始建構前端功能,建構完如果還有時間會在回來補充後端功能跟測試範圍~
以下為今天的研究流程
今天主要是修BUG,就不先請AI同事了解現況。
首先發現AI同事建置的AP規格不一,有些路由有加prefix有些沒有,命名規則也有些不同,還有一些末端有加斜線有些沒有,所以今天先把這些處理掉,避免AI同事出錯。
當然調整之後,測試程式那邊也需要做調整。
花了一些時間整理之後,就開始處理昨天沒處理完的問題。
有些問題好解決,都是其他功能也出現過的同步非同步的問題。
不過有個問題有點難搞,在meeting_note中,我有一個action_item,AI同事是把他設計成,之後如果要去做,是可以直接轉成任務,所以將他跟任務去做一對一關聯。
但出現了刪除在meeting_note無法正常刪除,他讓我嘗試去調整 action_item 與 task 的關聯。
在處理時,程式寫成兩邊都是多對一導致出錯。
在處理notes的測試時,出現了422錯誤,AI同事想嘗試修改,不過由於修改幾次還是有同樣錯誤,我請AI同事先分析。
我給AI的指令:
FAILED test_notes.py::test_get_my_notes - assert 422 == 200 @backend/schemas/note.py @backend/models/note.py 先來分析一下可能出錯的地方
分析功能意外的好用,AI同事立刻就推導可能是路由順序的問題,把me誤判成note_id,修改後就修復了。
再來常見的問題是MissingGreenlet: can't call await_only() here。
這個主要是同步與非同步的混淆。
由於沒有事先載入查詢的資料,FastAPI 在序列化 response 時會 試圖去資料庫查詢 → async session 外觸發 IO 導致出錯。
所以要先用selectinload先把資料抓起來才能使用。
還有請AI同事在修BUG時要注意,他有時候為了通過會把測試案例改掉。
我在看其中一個測試案例,想說看起來邏輯都對,怎麼會沒測過,後來跑去git看歷史紀錄。
結果他中間為了想通過,直接把例子改掉,導致後來就算程式對了,但因為例子改成錯的,反而過不了。
還有幾次原本測試過的地方突然沒過,我仔細看AI同事做了什麼,結果他原本想再200多行插入程式碼,結果插到了第48行,當然就噴錯了。
總之,這次的debug之旅,到此暫時告一段落~
接下來,會開始建構前端功能,等前面有個頁面之後,如果還有時間,
會再來做剩下的後端功能與檢查測試資料,增加測試的範圍。