鐵人賽第十六天,今天準備開始實作專案管理的後端功能。我先請 AI 同事了解現況,並讀取昨天我們討論的專案管理建構計畫,依照計畫進行建置。
開始建構後有點後悔,我考量一口氣建構比較不容易有漏,但整個計畫要建置的功能太多,AI同事直接觸發token 限制,看來下次還是該請他規劃順序去分開做可能比較好。
觸發限制之後被停止了,我就請他先整理目前做到哪裡。AI同事整理了他建置了哪些功能,解決了哪些問題,目前還有哪些問題未解決。
由於我們之前有做版本控制,不必擔心AI同事改過頭,我便請AI同事繼續嘗試解決出現的問題。
進行到某個階段時,發現測試陷入錯誤循環,我便暫停目前的自動測試,改成手動操作。我將 pytest 出現的錯誤訊息貼給除錯小幫手 ChatGPT,並提供相關原始碼,請他分析問題。這解決了部分錯誤。
後來,我指示 AI 同事不要直接執行 pytest 來讀取所有錯誤,而是由我手動執行,再將關鍵錯誤訊息提供給他。果然,這樣解錯更順利。正如我前幾天推論的,給太多錯誤訊息反而會讓 AI 難以處理,而只貼出關鍵訊息效果更好。
過程中有幾個特別棘手的問題,其中一個是路徑如下的 API 測試一直跳出 422:
@router.delete("/projects/bulk_delete", response_model=List[ProjectRead])
AI 同事一直嘗試各種方法,小幫手 ChatGPT 也幫忙分析,但未能立即解決。後來我換了 Claude 試試,他沒有直接給出解答,而是建議我在測試程式中輸出錯誤碼的詳細結果。結果一輸出,立刻就發現問題原因:
我有另一個 API 路徑:
@router.delete("/projects/{project_id}", response_model=ProjectRead)
而且它排在 bulk_delete
的上方,導致測試呼叫 /projects/bulk_delete
時,系統誤以為 bulk_delete
是 {project_id}
,因此一直出錯。將兩者順序對調後,測試順利通過。
專案功能測試完成後,我回去跑 user 與驗證相關測試。由於前面修改了程式,部分測試因訊息不一致而不通過,但都只是簡單訊息差異,修正後全部順利通過。
到目前為止,除了需下一階段任務管理功能才能完成的部分,其他功能測試皆已完成,並已請 AI 同事推送至 GitHub 做版本控制。
以下為今天的研究流程
首先開始前的老樣子,請AI同事了解應用現況。
我給AI的指令:
@ai_context.md @README.md @軟體核心架構規劃.md @功能需求總覽.md 了解目前現況
AI同事了解之後,由於我們今天要做專案管理功能,我請他先了解昨天討論的計劃。
我給AI的指令:
@專案管理計畫.md 了解專案管理建置計畫內容
AI同事了解所有需要的資訊之後,我請他開始建置功能。
我給AI的指令:
請根據計畫開始建置專案管理功能
AI同事開始依造昨天的計畫開始建構,不過這時有一個問題,功能太多AI同事直接一口氣完成,結果在最後在他自己pytest階段,一直出問題。
不過由於我們有做版本控制,不怕AI同事自己玩的太開心把專案弄壞,我就沒阻止他,讓他先根據計畫跑一遍,等AI同事卡住再來排除。
結果這時發生一個問題,我們一口氣實作的功能太多了,直接觸發模型的token limit。
我等了幾分鐘讓AI同事稍微喘口氣後,我請AI同事整理目前功能進度跟狀況:
我給AI的指令:
請整理目前做的功能跟遇到的狀況
AI同事將目前的狀況整理後的回應:
✦ 好的,這是我為您整理的目前功能進度與遇到的狀況:
已實作功能:
- 專案後端核心: 使用 FastAPI (Python)、PostgreSQL (SQLModel)、Redis 和 Celery。
- 使用者管理: 核心使用者管理功能(第一階段)已完成。
- 專案管理 (第二階段,積極建構中):
- 定義了 Project、ProjectMember、ProjectChecklistItem、ProjectMilestone、ProjectDependency等專案相關資料庫模型。
- 定義了 UserPreference 和 ActivityLog 模型。
- 為專案相關模型和 UserPreference 定義了 Pydantic schemas。
- 實作了所有專案相關的 API 端點,包括CRUD、成員管理、檢查清單、里程碑、依賴關係、儀表板資料、使用者偏好設定,以及一個基本的 WebSocket端點。
- 將專案邏輯重構至 ProjectService 中。
- 整合了基本的審計日誌功能。
- 認證與授權: 實作了 AuthService、token 建立與驗證、token 黑名單等功能。
- 測試: 使用 pytest 進行單元和整合測試,並為專案管理功能編寫了全面的測試。
遇到的狀況與解決方案:
- 循環依賴問題: 透過使用字串文字前向引用 (string literal forward references)解決了模型之間的循環引用問題。
- 資料庫索引: 在頻繁查詢的模型欄位上應用了 index=True 以優化查詢效能。
- Redis 客戶端存取: 實作了 get_redis_client() 函數,確保 Redis 客戶端的正確初始化和存取,解決了 NoneType錯誤。
- 測試資料唯一性: 確保測試夾具中的使用者名稱和電子郵件是唯一的,以避免 UniqueViolationError。
- 異步操作錯誤: 解決了 AttributeError: 'coroutine' object has no attribute 'is_deleted' 等錯誤,這是由於session.get() 和 session.exec() 等異步呼叫未正確使用 await 造成的。
- 測試客戶端請求: 更新了測試客戶端對 DELETE 請求的呼叫方式,以正確處理 JSON 請求體。
目前待處理事項:
- 繼續調試並通過 pytest backend/tests/test_projects.py 中的所有測試。
- 解決 backend/services/project_service.py 中所有剩餘的 AttributeError: 'coroutine' object has no attribute 'is_deleted' 和類似錯誤,確保所有 session.get() 和 session.exec() 呼叫都已正確 await。
- 重新運行測試以驗證所有修復。
我再度請AI同事進行測試,但遇到了無法修復的問題,因此我停止由AI同事這邊自動化執行修復。
一開始我改用貼問題給ChatGPT再把他給出的答案貼回去AI同事,但這樣做不是很順利。
想起之前遇到的狀況,錯誤訊息太多影響了AI同事的判斷跟修復,因此我改成我執行測試程式,將錯誤一個一個貼給AI同事請他修改,這樣突然就順利很多。
中間有一兩個問題由於要改的地方太多,導致AI同事replace沒辦法正常執行,我請AI同事告訴我要修改的地方,觀察了一下規則,直接使用文字編輯器內建的取代功能一口氣改完,就修正那個問題。
除了這種AI同事用的工具本身的問題,其他錯誤修復的非常順利。
就算遇到AI同事單獨無法解決的問題,找小幫手ChatGPT一起討論通常也可以解決。
大部分問題靠這兩位AI就可以解決了,不過其中有一個問題特別頑固。
@router.delete("/projects/bulk_delete", response_model=List[ProjectRead])
我在測試這支API的時候一直出現422錯誤碼,AI同事跟小幫手ChatGPT提出的解決方案都無法解決,實在沒辦法了,我把問題貼給Claude,他就沒有像AI同事跟小幫手一樣一開始就想解決,他提醒了我一件事。
我應該在出現錯誤前,去看詳細的回傳訊息,一看立刻找出問題。
由於我有另一隻API路徑跟他一樣,而且他的順序再bulk_delete前面,導致他誤判成這支API去呼叫。
@router.delete("/projects/{project_id}", response_model=ProjectRead)
因此最後將這兩隻的順序對調,成功解決這個問題。
解決了專案相關的錯誤後,我檢查其他例如使用者跟驗證方面的錯誤,由於在建構專案管理功能的時候,AI同事自己調整了許多錯誤訊息的回傳,造成在測試的時候蠻多因錯誤訊息不一致導致的錯誤,不過這些都很容易修正。
最後總算解決了所有測試內容。
到目前為止,除了需要下一階段任務管理功能才能做的功能外,其他功能都測試完成。請AI同事推送到github上做版本控制。
以下為我目前測試通過的功能:
測試檔案概覽
test_auth_tokens.py
此檔案包含認證和令牌管理的測試,涵蓋以下功能:
- 存取令牌 (Access Token) 和刷新令牌 (Refresh Token) 的建立。
- 令牌的過期機制。
- 用戶登入及令牌的獲取。
- 使用刷新令牌更新存取令牌。
- 處理無效和過期的刷新令牌。
- 用戶登出及存取令牌的黑名單機制。
test_projects.py
此檔案包含專案相關功能的測試,涵蓋以下功能:
- 專案的建立、讀取、更新和刪除(包括未經授權的存取和軟刪除)。
- 專案的批量刪除。
- 專案成員的管理(新增、移除及權限檢查)。
- 專案啟動清單的管理(獲取、新增、更新項目)。
- 專案里程碑的管理(獲取、新增、更新里程碑)。
- 專案依賴關係的管理(獲取、新增、刪除依賴關係)。
- 獲取專案活動日誌。
- 儀表板摘要計數(我的開放專案、總用戶數)。
- 專案任務摘要計數。
- 團隊工作負載摘要。
- 用戶偏好設定(獲取和更新)。
- 專案狀態、成員角色和任務優先級的配置端點。
test_users.py
此檔案包含用戶管理和認證的測試,涵蓋以下功能:
- 新用戶的建立,包括處理已存在的用戶名和電子郵件。
- 用戶登入及令牌的獲取。
- 登入時處理不正確的用戶名和密碼。
- 獲取當前用戶資訊 (
/users/me/
)。- 非活躍用戶的行為。
- 處理無效令牌。
- 超級用戶對所有用戶列表的存取權限。
- 普通用戶對所有用戶列表的存取限制。
- 未提供令牌時對用戶端點的未經授權存取。