2009-12-15 289 views
10

也許我沒有正確地考慮這個問題。 我正在使用單元測試開始我的第二個項目。我的第一個項目是我自己推出的,對於這個項目我嘗試了Boost :: test。單元測試可執行項目

我的問題是,什麼是編譯爲可執行文件的單元測試項目的正確程序?似乎我所看到的所有內容都是針對庫和依賴項的。我希望我的EXE項目進行單元測試,但我不希望一堆單元測試功能漂浮在二進制,我也不想做

#ifdef _DEBUG 
    BOOST_AUTO_TEST_CASE(my_func) 
    { 
    } 
#endif 

在我所有的測試。

我想過創建單元測試一個單獨的項目,但並沒有真正可執行工作..除非我想從我的其他項目到測試項目做一些花哨的預生成操作複製..

任何想法或想法?

+0

你或許應該更新你的問題,以避免誤解 - 我似乎沒有成爲唯一的一個。 – 2009-12-15 05:19:03

回答

6

該項目可以編譯爲一個庫,該庫可能靜態地鏈接到兩個單獨的可執行文件中:將交付的「項目」和單元測試。

現在問題似乎來自您的IDE,它是哪一個?它是否允許爲一個項目創建兩個二進制文件?

+0

這是一個非常好的主意 – Charles 2009-12-15 14:42:16

+0

我使用這個解決方案,但要確保如果你這樣做你的編譯器知道鏈接庫中的所有對象。在Visual Studio中,您在鏈接器選項中設置了使用庫依賴項輸入,在gcc中我相信這個選項是-z allextract或者什麼 – Charles 2009-12-15 17:36:06

2

這個想法是創建一個獨立的項目,您可以單獨測試單獨的單元代碼的預期行爲,無論是否構建調試或不是(由於代碼差異,甚至不會在調試版本中顯示某些問題)。
您將它構建爲一個二進制文件,然後運行以查看您的更改是否沒有破壞任何內容 - 通常甚至將其設置爲自動生成後操作。

如果您想從外部測試您的應用程序 - 可能會使用一些測試框架,具體取決於區域/框架等。的應用程序......但Boost.Test和所有其他單元測試框架不適用於測試可執行文件。

+0

感謝您的快速回復。我知道單元測試對庫很好,但我想單元測試我的可執行文件,所以我需要真正定義我的main()函數。這是我的單元測試解決方案沒有問題,但與Boost :: test有關的一個問題:( – Charles 2009-12-15 04:17:29

+0

提供了一個最小的main,它在單元測試中應該不會太麻煩。 http://www.boost.org/doc/libs/1_41_0/libs/test/doc/html/utf/user-guide/initialization.html#utf.user-guide.initialization.auto-generation – 2009-12-15 04:23:18

+0

如果有幫助,在這裏看起來像有用的例子:http://github.com/jsankey/boost.test-examples/ – 2009-12-15 04:33:01

1

單元測試可執行文件可能是一個好主意 - 但意識到它是一個完全不同於單元測試代碼的怪物。一旦你有一個可執行文件,就沒有更多的C++或Boost。這只是一個程序。你需要能夠運行它,並分析/在不同的機構控制您的輸入:

輸入:

  • 參數
  • stdin
  • 環境變量(也許)
  • 配置文件(也許)

輸出:

  • 返回值
  • stdout
  • 輸出文件(也許)

它可能會是最容易運行一個外殼內。 bash將在Linux環境中工作(輸入/輸出文件,在輸出上運行sed/awk/grep以分析正確性)。您可以使用Perl或Python以及它們各自的單元測試框架,但需要注意的是,您必須將程序的調用包裝在其他函數中:這兩種語言都支持來自子流程的管道概念,Python的subprocess模塊和Perl與其標準的文件打開機制。

無論你做什麼,你都做而不是想要嘗試從C++單元測試整個可執行文件。

+0

嗯,我並不真正的意思是測試構建的可執行文件,我的意思是我的項目編譯爲exe文件,而不是庫。大多數單元測試框架是爲圖書館設計的,因此存在混淆和問題。 – Charles 2009-12-15 05:33:59

6

我使用的CppUnit到一個額外的項目,簡單地鏈接到從可執行代碼生成的* .OBJ文件中測試我的可執行文件。這樣,您在原始代碼庫中就沒有任何測試邏輯,並且可以爲您的測試編寫單獨的控制檯或Windows應用程序。

乾杯 霍爾格

+0

如何將* .obj添加到單元測試項目中? – NSA 2011-07-22 16:29:55

+0

至少在Visual Studio中,您可以將所需的* .obj文件添加到鏈接器輸入文件中,就像使用lib一樣。 – 2011-10-06 11:40:52

1

可以包括從你的單元測試項目需要.cpp文件並進行測試。

像我一樣:

測試\遊戲服務器\ PVESettingsTest.cpp:

#include "../../sources/GameServer/PVESettings.cpp" 

一切工作正常...

+0

該方法使編譯時間加倍。在你的例子中'PVESettings.cpp'被編譯了兩次:用於原始項目和單元測試。對於小型項目來說可能是微不足道的,但隨着項目的增長將會變得很痛苦。 – 2017-12-22 14:29:20