從測試角度寫代碼(一)調試分級
一.爲什麼要使用調試分級
調試分級並不是一定要做的,需要根據具體情況進行分析,比如我們在使用開發小型代碼時,是完全不需要使用調試分級的,反而會給我們帶來了代碼編寫的複雜性。調試分級一般用於大型項目開發中,可以快速定位代碼問題,提高編程效率,以下場景都是可以使用調試分級進行優化的選項。
- 當我們進行大型項目開發時基本都是按階段性開發進行的,當我們調試完一階段代碼之後,如果需要繼續調試開發下一段代碼時,需要將上一段代碼的打印信息全部屏蔽。
- 上一個場景儘管有同學說我們可以開發下一階段任務前,利用編譯器的查找替換將上階段的代碼的printf全部替換//printf進行快速註釋,但是如果我們需要輸出的代碼既有需要顯示的業務代碼,又有需要開發時的調試方法。直接使用替換功能將調試信息註釋掉同時也會將顯示信息註釋。
- 在項目發佈上線的頭天,進行最後的代碼測試時,如果調試打印出現了錯誤信息,但是這個信息並不緊急,爲了不影響發佈日期,我們完全如期上線項目,在後期使用補丁或者更新的方法進行代碼修飾。但如果沒有代碼分級的情況下,在大型項目中測試打印出非常多信息的情況下,如何快速得到錯誤嚴不嚴重呢。
二.調試分級層次
-
以上問題都可以通過手動修改printf進行改變,但是這種方法在使用時,即繁瑣又低效,而且一步步修改也容易出錯,自己寫一個小的demo代碼還好,具體代碼實施時,還是使用分級調試的思想比較快捷。
-
我認爲調試分級參照日誌的做法,大致的分爲以下四個級別:
- ERROR級別:這種級別優先級最高,表示運行功能的過程中表示代碼已經發生了錯誤,比如文件讀寫出錯,內存訪問出錯,需要進行修正。這種問題需要立即解決。
- WARNING級別:這種級別優先級其次,表示代碼能夠正常運行,但是可能存在潛在問題,這種問題在也需要進行解決,但是如果項目緊急,完全可以先根據警告信息進行一個判斷。當錯誤信息不會影響到整個項目的功能運行,我們先將產品發佈,後期通過更新和補丁進行修復。比如現在很多手機廠商在發佈會上需要發佈新的操作系統,儘管系統中還存在一些小的DEBUG,但是就目前而言,這些小bug基本不會影響到用戶體驗,這時我們爲了保證如期發佈,可以使用先上線,後修復的策略。
- DEBUG級別:這種級別屬於程序調試級別,在程序開發時,提供一個調試級別給程序員們做一個信息調試,獲取出程序員員所需要的調試信息。在項目發佈後,需要屏蔽掉這一級別顯示信息。
- INFO級別:這種級別屬於正常輸出級別,系統通過正常的打印出業務信息與用戶進行交互,我們需要展顯出來的菜單信息就是這一層。
-
實現調試分級的方法
-
利用不同的宏定義不同的調試等級,下面代碼定義出了兩種級別,一個正常的信息交互info_log,一個用於調試debug_log。我們調試代碼可以使用debug_log代替printf,正常的交互信息可以用info_log代替printf。具體實現代碼如下:
#define DEBUG_PRINT 1 #if(1 == DEBUG_PRINT) #define debug_log printf #else #define debug_log #endif #define INFO_PRINT 1 #if(1 == INFO_PRINT) #define info_log printf #else #define info_log #endif #include <stdio.h> #include <stdlib.h> int main(void) { char *info_messages = NULL; info_log("you scanf messages is %s\n", info_messages); while(1) { info_messages = (char*)malloc(sizeof(int)*10000); if(NULL == info_messages) { debug_log("no enough memory\n"); break; } } return 0; }
-
程序輸出
-
將info_log的宏置爲1,debug_log的宏置爲0,只顯示正常交互信息
-
將info_log的宏置爲0,debug_log的宏置爲1,只顯示調試信息
-
-