測試資料的設計

2022-12-12 21:09:07 字數 2474 閱讀 7587

戴德承[摘要]除錯是當今程式設計中至關重要的乙個環節,既考驗了程式設計人員糾查錯誤的能力,更考驗其發現錯誤,即設計測試資料的能力。本文主要從針對性和廣泛性兩方面談談競賽中的測試資料設計。

[關鍵字]除錯測試資料

一、引論

除錯是程式設計中必不可少的環節,甚至比編寫程式本身還要花更多的時間和精力。這一點在歷屆奧林匹克計算機競賽上表現得尤為突出。特別是近年來,競賽評分採取「黑箱操作」制,即只看結果而不分析程式,這更提高了對選手除錯程式能力的要求。

然而要除錯就離不開測試資料,沒有了測試資料,就像字典沒了目錄一樣無從查起。由此可見,測試資料的設計在程式設計中扮演著極為重要的角色。乙個好的測試資料不但能準確地發現錯誤,即具有針對性,還要能發現盡可能多的錯誤,即有廣泛性。

下面,就測試資料設計的針對性和廣泛性進行論述。

二、本論

針對性測試資料的針對性是顯而易見的。

首先,它是針對錯誤本身,是為了發現錯誤而不是為了讓自己增加對程式的「滿意度」。例如用小高斯的方法求1+2+3+…+n(n≤32767)的和,根本無須用大資料來測試它的執行時間,而是要檢驗它是否須使用高精度。

第二,它必須針對題目,必須對題目中的每一句話每乙個要求進行檢測。例如《丘位元的煩惱》(ioi2000中國國家隊組隊賽)一題中規定:1、箭的射程有限;2、每對男女連線上不能有其它的男女。

那麼在除錯過程中就應多注意這兩個方面,並且應將其綜合考慮,比如可以有這樣乙個資料:男1,女2,男3,女4按順序排列在同一直線上,再通過對射程的控制來產生不同的最優解。這樣便可以很方便地檢測上述的兩個要求了。

這裡必須特別說明的是,應十分注意題目提供的數值上下限,它不但決定了題目的難度,還決定了程式應採用的演算法及資料結構。而選手通過對上下限的測試,一方面可以發現疏漏的情況(特別是下限),更重要的是它能為你是否需要繼續優化程式提供必要的依據。在一些演算法中,通過對上限的測試還能判斷演算法的優劣及其可行性,這在後面再作論述。

第三,測試資料應針對資料結構。乙個好的資料結構能經得起任何資料的測試,而「偽劣假冒」則會導致資料丟失或是「stake overflow error」。針對資料結構的測試資料,應在上下限上下功夫:

下限有時會導致程式將用作標記的數值輸出;上限則很可能出現「錯誤202」。同時,資料結構優劣也會在測試中反映出來,例如《單詞查詢樹(noi2000)》一題中,選手建立的資料結構一般有兩種:一種是鍊錶排序;一種是直接建立「單詞樹」。

通過測試可以發現,後一種資料結構在時間和空間上都過不了關,而《lostcity(noi2000)》更是如此,稍微疏忽便會使資料結構在測試時漏洞百出。可見,針對資料結構的測試資料,無論在除錯中還是在評測中都發揮著至關重要的作用。

第四,測試資料必須針對演算法。首先,演算法可以避免的錯誤基本無須除錯,例如圖論及運籌學中的演算法都是經過嚴格論證了的,在其正確性上做文章只會是徒勞。其次,應針對重點演算法的缺點作除錯:

搜尋演算法應用大資料測定其效率,動態規劃應密切注意其空間效率;而貪心演算法則應注重提高其正確率。再次,應多針對易犯的錯誤設計測試資料。例如《算符破譯(noi2000)》一題,通過大資料的測試很快拉開了不同演算法的分數差。

同時其題目隱含內容之多,搜尋結果檢驗之複雜。若沒有好的測試資料的支援是很難得到高分的。例如,評分時有乙個資料就是當其中有12個算符都可直接確定,那麼第13個算符亦可間接確定。

像這樣的例子沒有細心周到的除錯是很難考慮到的。

最後,應針對題目設計者的意圖,在最後的除錯階段多想一些評測時可能出現的資料,盡可能使自己的程式面向評委。當某個特殊資料無法通過時,可以對其單獨作特殊化處理。因為在以往評測中,大資料往往是幾個特殊的模型再套上一些簡單的資料構成。

若是抓住了那幾個特殊的資料,豈不妙哉? 總之,測試資料的設計應針對程式和評測。針對程式,乃知己也;針對評測者,知彼也。

知己知彼,方能百戰不怠。

廣泛性廣泛性是指測試資料應能普遍地發現錯誤,而不是針對某乙個錯誤反覆測試。

首先,廣泛性要求測試資料應盡可能多地包含題目內容。這樣一方面可以多發現錯誤,一方面可以檢驗各個模組之間協調得是否得當。例如在《王伯買魚》一題中,採用搜尋法的選手普遍在程式中帶有乙個限界剪枝的子程式,但往往因為測試資料過於單一而無法發現限界剪枝模組中的錯誤,甚至那個模組壓根兒沒執行而出現了「致命錯誤」。

其次,在初期的除錯中應多設計一些測試資料,通過變換其一部分內容可以針對不同內容進行測試。這樣有利於節省時間,而且在一些較簡單的題目中可以發揮事半功倍的效果。測試資料還應能抓住題目的每乙個細節和每一種可能的情況。

三、 結論

綜上所述,在競賽中設計測試資料,「專」和「博」應兼顧之,從整體除錯上講,應由專到博,先逐個檢查程式的每個模組,再對程式做整體除錯。在單點測試上應由博到專。「博」利於更快地發現錯誤。

然後再一步步地縮小測試資料的範圍,直至最後發現錯誤。引用政治術語講,「兩者相輔相承,相互促進,相互制約」。 然而,測試只發現程式不足之處,更多地是應在解答題目之前對題目的分析及時間空間複雜度的估算上,以及盡可能少地出現「筆誤」。

發現錯誤固然重要,避免錯誤更重要。若是在除錯中死也找不出錯誤,這不是對選手程式設計能力的最大肯定麼? 以上是從參賽選手的角度談了一些個人對競賽過程中測試資料設計的看法,僅藉此拋磚引玉,期待著大家一齊**。

設計測試資料

1.引言 1.1編寫目的 為了保證專案團隊按時保質地完成專案目標,便於專案團隊成員更好地了解專案情況,使專案工作開展的各個過程合理有序,有必要以檔案化的形式,把對於在專案生命週期內的工作任務範圍 各項工作的任務分解 專案團隊組織結構 各團隊成員的工作責任 團隊內外溝通協作方式 開發進度 經費預算 專...

測試資料結構

測試一 選擇題 1.乙個棧的入棧序列是a b c d e,則棧的不可能輸出序列是 2.乙個佇列的入隊序列是1 2 3 4,則佇列輸出序列是 a.4 3 2 1 b.1 2 3 4 c.1 4 3 2 d.3 2 4 1 3.判斷乙個迴圈佇列qu 最多元素為m 為滿佇列的條件是 a.qu front ...

測試資料分析報告

汶陽鎮小學 2013年 國家學生體質健康標準 測試 分析報告 我鎮小學本學年度測試年級為一至六年級全體學生。鎮教辦王主任召開三處小學校長和分管藝體校長會,在教研室張鵬 李敬東的專業指導下,經過三處小學體育教師 衛生保健教師 班主任共同努力,各校測試工作開展順利 圓滿,取得了優異的成績。與2013年1...