2011-09-27 55 views
4

我正在通過特定類型的代碼測試工作,這些代碼測試相當煩人並且可以自動化,但我不確定最佳實踐。在描述問題之前,我想說清楚我正在尋找適當的術語和概念,以便我可以閱讀更多關於如何實施它的信息。當然,歡迎有關最佳實踐的建議,但我的目標是具體的:這種方法叫做什麼?用於運行時比較兩個程序對象的方法

在最簡單的情況下,我有兩個程序需要一堆數據,產生各種中間對象,然後返回最終結果。當進行端到端測試時,最終結果會有所不同,因此需要找出差異發生的位置。不幸的是,即使中間結果可能不同,但並不總是顯着的方式(即一些差異是可以容忍的)。最後的錯誤是中間對象在兩個程序之間可能不一定具有相同的名稱,並且兩組中間對象可能不完全重疊(例如,一個程序可能具有比另一個更多的中間對象)。因此,我不能認爲在這兩個程序中創建的對象之間存在一對一的關係。

,我正在考慮採取自動化對象的這種比較的方法如下(它大致在語料庫頻率計數的啓發):

  1. 對於每一個程序,A和B:創建在整個執行過程中創建的對象列表,這些列表可以以非常簡單的方式編制索引,如a001,a002,a003,a004,...以及類似的B(b001,...)。
  2. 設Na = A中遇到的唯一對象名稱的數量,類似於Nb中的對象和B中的對象數量。
  3. 分別用Na和Nb列創建兩個表格TableA和TableB。條目將在每次觸發時爲每個對象記錄一個值(即對於每一行,下一個定義)。
  4. 對於A中的每個賦值,最簡單的方法是捕獲所有Na項目的哈希值;當然,對於那些不改變的項目,可以使用LOCF(最後一次觀察結轉),並且任何尚未觀察到的對象都被賦予一個NULL條目。對B重複此操作。
  5. 通過它們的哈希值匹配TableA和TableB中的條目。理想情況下,對象將以大致相同的順序進入「詞彙表」,所以順序和散列值將允許識別值的序列。
  6. 根據哈希值序列何時發散任何具有不同序列的對象,找出A和B之間對象的差異。

現在,這是一個簡單的方法,如果數據是簡單的,原子的,並且不易受數值精度問題影響,它可以工作得非常好。但是,我認爲數值精度可能會導致散列值發散,但如果差異大致在機器容差級別,則影響不顯着。

第一:這種類型的測試方法和概念的名稱是什麼?答案不一定是上面的方法,而是反映比較來自兩個(或更多)不同程序的對象的方法類。

第二:我在步驟3和步驟4中描述了什麼標準方法?例如,「值」不僅需要散列:還可以存儲對象的大小 - 畢竟,如果兩個對象的大小大不相同,則它們不能相同。

實際上,我傾向於比較少量的項目,但我懷疑當自動化時,這不需要涉及來自用戶的大量輸入。


編輯1:This paper在比較執行痕跡方面涉及;它提到了「代碼比較」,這與我的興趣有關,儘管我關心的是數據(即對象)而不是產生對象的實際代碼。我只是剔除它,但會更仔細地審查方法。更重要的是,這表明比較代碼跟蹤可能會擴展到比較數據跟蹤。 This paper分析了代碼痕跡的一些比較,儘管在安全測試的一個完全不相關的領域。

也許數據跟蹤和堆棧跟蹤方法是相關的。點校驗有點相關,但其典型用法(即保存所有狀態)是過度殺傷。

編輯2:其他相關概念包括differential program analysis和遠程系統(例如空間探測器)的監視,其中一個嘗試使用本地實現(通常是克隆)重現計算(考慮HAL-9000與地球相比克隆)。我查看了單元測試,逆向工程,各種取證以及其他方面的路線。在開發階段,可以確保與單元測試一致,但這對於儀器化分析似乎並不有用。對於逆向工程,目標可以是代碼&數據協議,但用於評估重新設計的代碼的保真度的方法似乎並不容易找到。每個節目的取證都很容易找到,但節目之間的比較似乎並不常見。

回答

0

(製作這個答案社區維基,因爲數據流編程和反應式編程是不是我的專業領域。)

數據流編程的面積似乎是相關的,因此數據流程序的調試可能會有所幫助。 This paper from 1981給出了幾個有用的高層次的想法。雖然很難將這些代碼翻譯成即時可用的代碼,但它的確提供了一種我忽略的方法:在將程序作爲數據流接近時,可以靜態或動態地識別輸入值的更改導致中間處理中其他值的更改或者在輸出中(如果有人要檢查控制流,不只是改變執行)。

儘管數據流編程通常與並行或分佈式計算有關,但它似乎與Reactive Programming相吻合,這就是如何實現對象監控(例如哈希)。

這個答案遠遠不夠,因此它的CW標籤,因爲它沒有真正命名我描述的調試方法。也許這是針對反應式編程範例的一種調試形式。

[還要注意:雖然這個答案是CW,如果任何人有關於數據流或反應式編程一個更好的答案,請隨意張貼一個單獨的答案,我會刪除這一個]


注1:Henrik Nilsson和Peter Fritzson have a number of papers針對懶惰函數式語言的調試,這些有點相關:調試目標是評估值,而不是執行代碼。 This paper似乎有幾個很好的想法,他們的工作部分啓發this paper在一個叫做Luster的反應式編程語言的調試器上。這些參考資料並不回答原始問題,但可能會面臨同樣挑戰的任何人都感興趣,儘管編程環境不同。