2012-01-19 27 views
3

我正在寫一個事件驅動的應用程序,使用libevent庫進行異步I/O。本質上,應用程序有一個evconnlistener監聽端口上的數據。在接收數據時,數據根據數據有效載荷被轉發到相應的http REST端點。轉發組件使用libevent提供的evhttp_ *。如何爲由libevent管理的事件驅動應用程序編寫單元測試?

我能夠測試應用程序作爲外部過程來滿足應用程序的完整性,但是當我們生成代碼覆蓋率報告時,我很難過。我該如何着手編寫可以通過常規單元測試框架(如cppunit)調用的單元測試?

回答

4

圍繞異步I/O調用添加包裝器層。然後,您可以用一個「MockIO」類替代處理I/O連接的測試。

這聽起來像是你描述集成而不是單元測試。單元測試實際上是關於單獨測試每個單獨的模塊,而不是它們如何聚集在一起來提供系統功能。

一個單元測試將確保從I/O事件接收到數據。單獨的測試將確保正確接收到饋入REST端點的數據。另一個單獨的測試將確保REST端點按需要解析它。關於I/O事件測試,我會添加更多單元測試來模擬I/O故障,連接斷開和其他不愉快的路徑,所有這些都要確保異常處理代碼運行正常,並且所有代碼行模塊進行了測試。同樣,我也會使用各種錯誤輸入來測試端點:空指針,空緩衝區,真正長緩衝區,意外數據類型,不管需要通過方法執行所有路徑的不同測試。

我們努力在單元測試中完成代碼覆蓋(但並不總是實現)。集成測試表明這些部分成功地結合在一起,但我們無法總是測試每一個交互。最大的假設是,如果單元測試通過了,不管他們在做什麼,這些部分應該一起工作。

我在想,一本書可能會更好地幫助您突破「難倒」階段,爲您提供更好的自動化單元測試的整體畫面。如果您想將單元測試添加到現有的項目中,Michael Feathers的「有效使用遺留代碼工作」一書非常棒(Mike是CppUnit的作者)。如果您剛剛開始一個小項目,The Art of Roy Osherove的單元測試是一個很好的閱讀。一旦你獲得了單元測試的想法,Gerard Meszaros的xUnit Test Patterns是一個很好的資源,可以幫助你學習如何編寫可維護的測試。

如果你有機會,花一些高質量的時間從導師那裏學習。

+0

謝謝!之前我遇到過麻煩,因爲我設計中的不同組件緊密結合在一起。我抽象出了異步部分,並消除了不同組件之間的緊密耦合。現在,單元測試已經變得比首先看起來的龐然大物更容易了。\ n另外感謝這本書的指針。肯定會看看那些。 – sanjivr

相關問題