¹7-10 :用斷言保證沒有定義的特性或功能不被使用
示例:假設某通信模塊在設計時,準備提供“無連接”和“連接” 這兩種業務。但當前的版本中僅實現了“無連接”業務,且在此版本的正式發行版中,用戶(上層模塊)不應產生“連接”業務的請求,那么在測試時可用斷言檢查用戶是否使用“連接”業務。如下。
#define EXAM_CONNECTIONLESS 0 // 無連接業務
#define EXAM_CONNECTION 1 // 連接業務
int msg_process( EXAM_MESSAGE *msg )
{
unsigned char service; /* message service class */
EXAM_ASSERT( msg != NULL );
service = get_msg_service_class( msg );
EXAM_ASSERT( service != EXAM_CONNECTION ); // 假設不使用連接業務
... //other program code
}
¹7-11 :用斷言對程序開發環境(OS/Compiler/Hardware )的假設進行檢查
說明:程序運行時所需的軟硬件環境及配置要求,不能用斷言來檢查,而必須由一段專門代碼處理。用斷言僅可對程序開發環境中的假設及所配置的某版本軟硬件是否具有某種功能的假設進行檢查。如某網卡是否在系統運行環境中配置了,應由程序中正式代碼來檢查;而此網卡是否具有某設想的功能,則可由斷言來檢查。
對編譯器提供的功能及特性假設可用斷言檢查,原因是軟件最終產品(即運行代碼或機器碼)與編譯器已沒有任何直接關系,即軟件運行過程中(注意不是編譯過程中)不會也不應該對編譯器的功能提出任何需求。
示例:用斷言檢查編譯器的int型數據占用的內存空間是否為2,如下。
EXAM_ASSERT( sizeof( int ) == 2 );
¹7-12 :正式軟件產品中應把斷言及其它調測代碼去掉(即把有關的調測開關關掉)
說明:加快軟件運行速度。
¹7-13 :在軟件系統中設置與取消有關測試手段,不能對軟件實現的功能等產生影響
說明:即有測試代碼的軟件和關掉測試代碼的軟件,在功能行為上應一致。
¹7-14 :用調測開關來切換軟件的DEBUG 版和正式版,而不要同時存在正式版本和DEBUG 版本的不同源文件,以減少維護的難度
¹7-15 :軟件的DEBUG 版本和發行版本應該統一維護,不允許分家,并且要時刻注意保證兩個版本在實現功能上的一致性
½7-1 :在編寫代碼之前,應預先設計好程序調試與測試的方法和手段,并設計好各種調測開關及相應測試代碼如打印函數等
說明:程序的調試與測試是軟件生存周期中很重要的一個階段,如何對軟件進行較全面、高率的測試并盡可能地找出軟件中的錯誤就成為很關鍵的問題。因此在編寫源代碼之前,除了要有一套比較完善的測試計劃外,還應設計出一系列代碼測試手段,為單元測試、集成測試及系統聯調提供方便。
½7-2 :調測開關應分為不同級別和類型
說明:調測開關的設置及分類應從以下幾方面考慮:針對模塊或系統某部分代碼的調測;針對模塊或系統某功能的調測;出于某種其它目的,如對性能、容量等的測試。這樣做便于軟件功能的調測,并且便于模塊的單元測試、系統聯調等。
½7-3 :編寫防錯程序,然后在處理錯誤之后可用斷言宣布發生錯誤
示例:假如某模塊收到通信鏈路上的消息,則應對消息的合法性進行檢查,若消息類別不是通信協議中規定的,則應進行出錯處理,之后可用斷言報告,如下例。
#ifdef _EXAM_ASSERT_TEST_ // 若使用斷言測試
/* Notice: this function does not call ’abort’ to exit program */
void assert_report( char * file_name, unsigned int line_no )
{
printf( "\n[EXAM]Error Report: %s, line %u\n",
file_name, line_no );
}
#define ASSERT_REPORT( condition )
if ( condition ) // 若條件成立,則無動作
NULL;
else // 否則報告
assert_report ( __FILE__, __LINE__ )
#else // 若不使用斷言測試
#define ASSERT_REPORT( condition ) NULL
#endif /* end of ASSERT */
int msg_handle( unsigned char msg_name, unsigned char * msg )
{
switch( msg_name )
{
case MSG_ONE:
... // 消息MSG_ONE處理
return MSG_HANDLE_SUCCESS;
... // 其它合法消息處理
default:
... // 消息出錯處理
ASSERT_REPORT( FALSE ); // “合法”消息不成立,報告
return MSG_HANDLE_ERROR;
}
}
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/