
109、ABAP單元測試初探上周五晚上,生產系統一個報表突然跑出重復數據,我遠程連上去看,發現是某個內部類的方法在特定輸入下返回了不該返回的值。當時我第一反應是打開這個類,往下翻,找到那個方法,盯著屏幕看了五分鐘,愣是沒看出問題。后來手動在SE38里拼了一段測試代碼,造了幾條數據,調了好幾次,才發現是MOVE-CORRESPONDING把某個不該覆蓋的字段給覆蓋了。那一瞬間我就想,要是這個類當初寫了單元測試,這種低級錯誤根本不會流到生產。其實ABAP里的單元測試不是什么新東西,SE24創建類的時候就能勾選“Test Class”,ABAP Development Tools里也可以直接建測試類。但很多從ECC時代過來的老伙計,習慣寫完代碼直接激活、直接跑事務碼,根本不知道還有個ABAP Unit這回事。我今天想聊的,就是怎么用最土的方式把單元測試跑起來,讓代碼在進傳輸請求之前,先過一遍自己的“體檢”。先別急著寫測試類,你得先搞清楚一件事:ABAP單元測試不是給整個程序做集成測試,它只針對一個類或一個方法,驗證“給定這個輸入,輸出是否符合預期”。所以你要測的東西,必須是能被實例化、能被調用、能被檢查的。如果你寫的一個功能全在FORM里,還依賴一堆屏幕字段和全局變量,那沒法測。這也是為什么很多老代碼沒法做單元測試的原因——不是ABAP不行,是代碼結構不行。想測試,就得先把邏輯拆到類里,把外部依賴掐斷。舉個例子,我之前寫過一個處理物料主數據的增強,其中有段邏輯是根據物料類型和行業領域決定是否允許維護某些字段。原來這邏輯寫在CMOD里,測試的時候得跑到MM02里拼命按回車。后來我把它挪到一個單獨的類ZCL_MATERIAL_RULE里,方法叫CHECK_FI