人們借助于測試用例的媒介作用,對程序的邏輯和功能提出各種疑問,結合問題開展熱烈的討論和爭議,能夠發現更多的問題。
6. 調試(Debug,排錯)
軟件測試也是一個系統工程,在做測試時,需要先做測試計劃和規格說明,然后設計測試用例,定義策略,最后將測試結果與預先給出的期望結果進行比較,再做評價分析。而軟件調試則是在進行了成功的測試之后才開始的工作。它與軟件測試不同,軟件測試的目的是盡可能多地發現軟件中的錯誤,但進一步診斷和改正程序中潛在的錯誤,則是調試的任務。
調試活動由兩部分組成:
?、?確定程序中可疑錯誤的確切性質和位置。
?、?對程序(設計,編碼)進行修改,排除這個錯誤。
通常,調試工作是一個具有很強技巧性的工作。一個軟件工程人員在分析測試結果的時候會發現,軟件運行失效或出現問題,往往只是潛在錯誤的外部表現,而外部表現與內在原因之間常常沒有明顯的聯系。如果要找出真正的原因,排除潛在的錯誤,不是一件易事。因此可以說,調試是通過現象,找出原因的一個思維分析的過程。
6.1調試的步驟
?、?從錯誤的外部表現形式入手,確定程序中出錯位置;
?、?研究有關部分的程序,找出錯誤的內在原因;
?、?修改設計和代碼,以排除這個錯誤;
?、?重復進行暴露了這個錯誤的原始測試或某些有關測試,以確認該錯誤是否被排除;是否引進了新的錯誤。
?、?如果所做的修正無效,則撤銷這次改動,重復上述過程,直到找到一個有效的解決辦法為止。
從技術角度來看,查找錯誤的難度在于:
現象與原因所處的位置可能相距甚遠。就是說,現象可能出現在程序的一個部位,而原因可能在離此很遠的另一個位置。高耦合的程序結構中這種情況更為明顯。
當糾正其它錯誤時,這一錯誤所表現出的現象可能會暫時消失,但并未實際排除。
現象實際上是由一些非錯誤原因(例如,舍入得不精確)引起的。
現象可能是由于一些不容易發現的人為錯誤引起的。
錯誤是由于時序問題引起的,與處理過程無關。
現像是由于難于精確再現的輸入狀態(例如,實時應用中輸入順序不確定)引起。
現象可能是周期出現的。在軟、硬件結合的嵌入式系統中常常遇到。
6.2幾種主要的調試方法
調試的關鍵在于推斷程序內部的錯誤位置及原因。為此,可以采用以下方法:
?、?強行排錯
這是目前使用較多,效率較低的調試方法。它不需要過多的思考,比較省腦筋。例如:
通過內存全部打印來排錯(Memory Dump);
在程序特定部位設置打印語句;
自動調試工具。
可供利用的典型的語言功能有:打印出語句執行的追蹤信息,追蹤子程序調用,以及指定變量的變化情況。自動調試工具的功能是:設置斷點,當程序執行到某個特定的語句或某個特定的變量值改變時,程序暫停執行。程序員可在終端上觀察程序此時的狀態。
應用以上任一種方法之前,都應當對錯誤的征兆進行全面徹底的分析,得出對出錯位置及錯誤性質的推測,再使用一種適當的排錯方法來檢驗推測的正確性。
?、?回溯法排錯
這是在小程序中常用的一種有效的排錯方法。一旦發現了錯誤,人們先分析錯誤征兆,確定最先發現“癥狀”的位置。然后,人工沿程序的控制流程,向回追蹤源程序代碼,直到找到錯誤根源或確定錯誤產生的范圍。
回溯法對于小程序很有效,往往能把錯誤范圍縮小到程序中的一小段代碼;仔細分析這段代碼不難確定出錯的準確位置。但對于大程序,由于回溯的路徑數目較多,回溯會變得很困難。
?、?歸納法排錯
歸納法是一種從特殊推斷一般的系統化思考方法。歸納法排錯的基本思想是:從一些線索(錯誤征兆)著手,通過分析它們之間的關系來找出錯誤。
歸納法排錯步驟大致分為以下四步:
收集有關的資料 :列出所有已知的測試用例和程序執行結果??茨男┹斎霐祿倪\行結果是正確的,哪些輸入數據的運行結果有錯誤存在。
組織數據 :由于歸納法是從特殊到一般的推斷過程,所以需要組織整理數據,以便發現規律。常用的構造線索的技術是“分類法”。
原文轉自:http://www.uml.org.cn/Test/201511262.asp