2009-12-09 24 views
3

很久以前,我不得不測試一個程序生成postscript文件圖像。找出程序是否產生正確的預期輸出的一個快速方法是做一個md5的結果,與預先檢查過的「已知良好」輸出的md5進行比較。輸出文件的功能測試,當輸出是非確定性的(或低控制)

不幸的是,Postscript包含文件中的當前時間。當然,這個時間根據測試運行的時間不同而不同,因此即使獲得預期輸出,也要更改結果的md5。作爲一個修復,我剛剛用sed去除了日期。

這是一個很好很簡單的場景。我們並不總是那麼幸運。例如,現在我編寫了一個編寫程序的程序,它創建了一個包含大量匿名節點和uuids的大型RDF文件。用簡單的md5檢查整個程序的功能基本上是不可能的,唯一的方法是用讀取器讀取文件,然後通過該讀取器驗證輸出。正如你可能意識到的那樣,這將打開一個新的蠕蟲罐:首先,你必須編寫一個閱讀器(這可能很費時),其次,你認爲閱讀器在功能上是正確的,並且與作者同步。如果讀者和作者都同步,但假設不正確,讀者會說「沒問題」,但文件格式實際上是錯誤的。

當您必須執行文件格式的功能測試時,這是一個普遍問題,並且文件格式無法通過您提供的輸入完全重現。你如何處理這個案件?

回答

1

在過去,我使用第三方應用程序來驗證此類輸出(最好將其轉換爲可以機械驗證的其他格式)。如果不是嚴格正確的話,使用第三方可以確保我的假設至少可以被其他人共享。這個方法至少可以用來驗證語法。語義正確性可能需要爲測試數據創建一個消費者,這可能總是容易出現您提到的「錯誤假設」陷阱。

1

隨機性總是在相同的地方嗎?即是固定的大部分文件,但有一些部分總是改變?如果是這樣,你可能能夠獲得幾個輸出並使用編程差異來確定非確定性部分。一旦知道這些信息,就可以使用這些信息來導出一個掩碼,然後進行比較(md5或者只是一個比較)。考慮預處理文件以刪除(或用確定性數據覆蓋)非確定性的部分。

如果整個文件是非確定性的,那麼你將不得不想出一個不同的解決方案。我測試了非確定性的MPEG-2解碼器。在那種情況下,我們能夠做一個PSNR,如果它超過了某個門檻,就會失敗。這可能會或可能不會取決於您的數據,但類似的可能是可能的。

+0

這取決於。在我的RDF文件的特定情況下,我無法真正知道該對象將如何序列化爲XML。我可以掩蓋可變部分並比較其餘部分,但順序可能不同。但是,你的答案很有趣。 MPEG-2測試顯然是一種情況。 – 2009-12-12 10:01:18