2014-11-02 26 views
0

我想寫一個序列化方法的單元測試。通過序列化方法,我的意思是將一組數據輸出爲特殊格式的方法。如何單元測試生成器/序列化方法?

例如,以XML格式輸出數據的方法。 (我使用C++,但它是在每一種語言相同。)

class Generator 
{ 
public: 
    std::string serialize(); 
}; 

// unit test (pseudo-code) 
Generator gen; 
// set some data in gen 
std::string actual = gen.serialize(); 
std::string expected = "<xml>...</xml>"; 
ASSERT_EQUAL(expected, actual); 

這樣做的問題是,單元測試是高度依賴於非重要的事情,如XML的格式(換行符)或者XML屬性的順序。

雖然使用XML,以前的方法將起作用,但它不適用於輸出二進制數據的生成器。

那麼,測試序列化方法的強大方法是什麼?


我的想法如下,但都有嚴重的缺陷。

  • 使用外部庫解析數據(專有格式,可能不存在)。
  • 總是寫入序列化/反序列化對並組合測試它們(兩種方法中的錯誤都可能未被發現)。
  • 將序列化數據存儲在外部文件中並在測試中與它們進行比較(單元測試難以讀取和維護)。
+0

就我個人而言,我更喜歡做成對測試的第二種選擇。在串行器和反串行器中出現錯誤的可能性很小,我會說。如果你在serialiser中有一個bug,當你反序列化和驗證這個對象的時候你可能會發現它 – 2014-11-02 15:39:40

回答

1

這更像是一個很長的評論與我的第一個想法的主題。

我認爲你必須看兩種不同的情況。您的數據< - >序列化數據關係可以是1:1或1:n。

XML將是一個1:n的關係,您的XML代碼將具有相當的自由度,但仍然會被反序列化爲相同的數據。在這種情況下,在我看來,組合開發和測試序列化/反序列化是要走的路。如果有外部庫可用,當然也可以使用它們。如果沒有可用的外部庫,那麼 - 只要序列化/反序列化 - 得到相同的結果,您可能不會有「錯誤」,但「功能」...
使用存儲的外部數據文件測試反序列化也會使有道理,但這不適用於序列化,恕我直言。

看着1:1的關係,就像可能把數據放入一個特定的二進制格式,你應該去存儲在外部文件中的數據。當然,一定要使用外部庫,如果它們存在的話。

我會建議一起做所有這三種方法 - 當然,如果適用的話。你不應該依賴它們中的一個。