前情提要
有幸參與了一個跨國的專案,
為了快速上線,決定將整套原本在台灣程式碼搬移到跨國專案上,
上線後再依使用者的需求調整開發功能,
而在搬移的過程中,有需多模組並未開啟。
…
現況
遺留代碼 → 跨國遇到的問題,
主管要求用複制整個台灣的環境、流程與代碼到國外的環境之上,
但是要求 One Code Base:
- 台灣的情境不一定適合國外環境
- 修改功能與台灣邏輯抵觸時,台灣 PM 不一定允許修改
- 到處寫例外 if、switch 處理
台灣
、其它國
的問題 - 完整重建整套系統非常費功,沒有資源時會犧牲子系統,導致國外環境部份功能無法使用或是必須與台灣共用
用明朝的劍,斬清朝的官
實務需求
將本來跨國未開啟的折扣活動模組打開,
簡單的流程大致如下:
購物車 → 取得購物車資料 → 折扣活動 → 計算
實務上,整個流程作了許多事
應該說作了太多事.
程式碼有壞味道,卻不能修改(重構).
因為沒有單元測試保護.
單一的 Process,複雜度過高的方法(12)
CalculateShoppingCartPromotionDiscountV2Processor.Process()
目標與執行順序
- 由 PM 或 QA 補足整合測試情境到足夠
- 由實務上的需求來認定
- 刪除台灣的測試
- 解析
CalculateShoppingCartPromotionDiscountV2Processor
- 補上單元測試
- Code Coverage(測試覆蓋率)
- 重構
最終的目標是重構
- 心態:沒有時間,完美的借口
- 重構前要先作整合測試
- 現有的整合測試的缺陷
- 測試項目不符合馬來西亞現狀
- 測試項目未處理多語系
- 測試項目未處理小數點
- 測試項目難以閱讀
- 測試項目有重覆的覆蓋範圍
- RD 與 PM 與 QA 合作
UAT 讓「人」讀得懂
原本的 UAT (RD)
1 | 場景: case37:商品活動+全店活動(有排除);宅配,運費50元,滿350免運 |
「人」寫的 UAT
1 | 場景: 商品有兩檔活動,全店活動與商品活動; |
與 PM 及 QA 討論後 , 寫的 UAT 可閱讀性提高了
這裡用到了一些小技巧 , 讓 Cucumber 文件的可讀性更高
而不會有太多的重複方法 , 比如說把描述性的文字當作參數傳遞
實際上測試不會使用到這些變數 ,但是可以增加可讀性 .
Skip 台灣測試
因為已經有了跨國所需要的測試 ,
台灣的測試便可以退場了.
實際上也不符合現況, 如多語系、時差與小數點等問題
解析 CalculateShoppingCartPromotionDiscountV2Processor
- 無折扣的情境
- 新舊相容的情境
- 排序
- 計算折扣金額
- 看見相依
- 程式碼中有 new 別的 class 的部份
- 程式碼中有使用靜態方法的部份
補上單元測試
最簡單的重構,就是將整個方法內的四個邏輯
拆成四塊個子方法,並為他們加上單元測試.
修改的過程,如果有紅燈就要修改成綠燈,
而整個成品要保證整合測試與單元測試都是綠燈.
此外,重構的過程中如果過到靜態方法,
或是 new 新物件, 都很有可能是種相依,
可以透過一些方法作解耦,
參考之前的文章單元測試這樣玩就對了
重構
最後一步就是大膽的重構了,
有了測試作保護,
可以作更大範圍的重構,
如下圖示,這裡揭露了在台灣原有的繼承結構,
而紅色的部份是在跨國用不到的類別.
下一步,待續…
(fin)