2012-10-13 57 views
2

我已經寫了一個漂亮的打印機使用GDB Python接口的(C)結構,有傾向於軟件版本之間進行更改。由於格式是波動的,我試圖讓打印機足夠動態以適應並總是嘗試打印一些有用的內容,而不是拋出Python異常。我該如何測試用Python編寫的GDB漂亮打印機?

現在有兩種我需要支持的主要格式,但未來可能會有更多。我想爲打印機編寫一些單元測試,以避免不得不從不同版本手動加載coredumps來測試它。

我想也許我可以從調試會話中序列化gdb.Value並將它們加載到我的單元測試中,但是我無法做到這一點(pickle沒有與gdb.Value一起使用)。核心轉儲非常大,因此將它們與漂亮的打印機和腳本GDB一起存儲用於測試不是一種選擇。

如何在不保留大型核心轉儲的情況下對我的漂亮打印機進行單元測試?

回答

2

如何在不保留大型核心轉儲的情況下對我的漂亮打印機進行單元測試?

保持小核心轉儲:-)

讓我們假設你有struct Foo,你有一個漂亮的打印機,並保持版本之間的變化。

編譯下面的程序:

#include <stdlib.h> 
#include "foo.h" 
int main() 
{ 
    struct Foo f; 
    // initialize f with some values 
    abort(); 
} 

編譯並運行此程序,其存儲和所得到的芯爲foo-v2foo-v2.core(假設你現在對struct Foo第2版)。核心應該很小。

現在結賬foo.h,從您的版本控制系統相當於struct Foo 1版本(你使用版本控制系統,對吧?)。重建並重新運行該程序,將其存儲爲foo-v1foo-v1.core

現在,每次發佈時,您只需重新編譯/重新運行程序,然後將GDB漂亮打印機的輸出與預期結果進行比較。如果它仍然可以正常工作,你就完成了。如果不是,struct Foo必須已經更改,並且您需要更新漂亮的打印機。

保存新的二進制文件和核心的foo-v3foo-v3.core,更新漂亮的打印機,然後對其進行測試對所有foo-vNfoo-vN.core對(用於測試本身,使用隨GDB源GDB單元測試框架)。

+0

這是一個好主意,我正在考慮。最好我想避免在Python之外的依賴。 –

+0

@DavidHolm你想消除哪種依賴關係?我不認爲有可能不需要存儲foo-vN和foo-VN.core(但也許你可以根據需要重新生成它們)。消除對GDB測試框架的依賴是很容易的*如果*您漂亮打印機的輸出可以與「黃金」輸出進行比較。 –

+0

對GDB的依賴。現在GDB 7並不是我們產品正式支持的版本,所以我使用我自己的GDB。有些人正在使用我的構建,其他人有他們自己的構建,所以如果測試代碼獨立於它將在路徑中找到的任何版本的GDB,我都會更喜歡它。 –