我正在通過特定類型的代碼測試工作,這些代碼測試相當煩人並且可以自動化,但我不確定最佳實踐。在描述問題之前,我想說清楚我正在尋找適當的術語和概念,以便我可以閱讀更多關於如何實施它的信息。當然,歡迎有關最佳實踐的建議,但我的目標是具體的:這種方法叫做什麼?用於運行時比較兩個程序對象的方法
在最簡單的情況下,我有兩個程序需要一堆數據,產生各種中間對象,然後返回最終結果。當進行端到端測試時,最終結果會有所不同,因此需要找出差異發生的位置。不幸的是,即使中間結果可能不同,但並不總是顯着的方式(即一些差異是可以容忍的)。最後的錯誤是中間對象在兩個程序之間可能不一定具有相同的名稱,並且兩組中間對象可能不完全重疊(例如,一個程序可能具有比另一個更多的中間對象)。因此,我不能認爲在這兩個程序中創建的對象之間存在一對一的關係。
,我正在考慮採取自動化對象的這種比較的方法如下(它大致在語料庫頻率計數的啓發):
- 對於每一個程序,A和B:創建在整個執行過程中創建的對象列表,這些列表可以以非常簡單的方式編制索引,如a001,a002,a003,a004,...以及類似的B(b001,...)。
- 設Na = A中遇到的唯一對象名稱的數量,類似於Nb中的對象和B中的對象數量。
- 分別用Na和Nb列創建兩個表格TableA和TableB。條目將在每次觸發時爲每個對象記錄一個值(即對於每一行,下一個定義)。
- 對於A中的每個賦值,最簡單的方法是捕獲所有Na項目的哈希值;當然,對於那些不改變的項目,可以使用LOCF(最後一次觀察結轉),並且任何尚未觀察到的對象都被賦予一個NULL條目。對B重複此操作。
- 通過它們的哈希值匹配TableA和TableB中的條目。理想情況下,對象將以大致相同的順序進入「詞彙表」,所以順序和散列值將允許識別值的序列。
- 根據哈希值序列何時發散任何具有不同序列的對象,找出A和B之間對象的差異。
現在,這是一個簡單的方法,如果數據是簡單的,原子的,並且不易受數值精度問題影響,它可以工作得非常好。但是,我認爲數值精度可能會導致散列值發散,但如果差異大致在機器容差級別,則影響不顯着。
第一:這種類型的測試方法和概念的名稱是什麼?答案不一定是上面的方法,而是反映比較來自兩個(或更多)不同程序的對象的方法類。
第二:我在步驟3和步驟4中描述了什麼標準方法?例如,「值」不僅需要散列:還可以存儲對象的大小 - 畢竟,如果兩個對象的大小大不相同,則它們不能相同。
實際上,我傾向於比較少量的項目,但我懷疑當自動化時,這不需要涉及來自用戶的大量輸入。
編輯1:This paper在比較執行痕跡方面涉及;它提到了「代碼比較」,這與我的興趣有關,儘管我關心的是數據(即對象)而不是產生對象的實際代碼。我只是剔除它,但會更仔細地審查方法。更重要的是,這表明比較代碼跟蹤可能會擴展到比較數據跟蹤。 This paper分析了代碼痕跡的一些比較,儘管在安全測試的一個完全不相關的領域。
也許數據跟蹤和堆棧跟蹤方法是相關的。點校驗有點相關,但其典型用法(即保存所有狀態)是過度殺傷。
編輯2:其他相關概念包括differential program analysis和遠程系統(例如空間探測器)的監視,其中一個嘗試使用本地實現(通常是克隆)重現計算(考慮HAL-9000與地球相比克隆)。我查看了單元測試,逆向工程,各種取證以及其他方面的路線。在開發階段,可以確保與單元測試一致,但這對於儀器化分析似乎並不有用。對於逆向工程,目標可以是代碼&數據協議,但用於評估重新設計的代碼的保真度的方法似乎並不容易找到。每個節目的取證都很容易找到,但節目之間的比較似乎並不常見。