2014-11-15 19 views
3

我最近開始嘗試在我的一個C++項目中使用TDD。在這方面,我很新,而且我還有一些關於單元測試編譯和使用的基本問題。我在Linux上使用Boost.Test庫。如何編譯和鏈接單元測試?

  1. 它是常見的編譯一個大的測試程序,包含所有測試套件,你所有的單位?將測試分成許多較小的獨立測試程序如何?

  2. 如何處理鏈接(與make)?每個測試程序對象都必須與來自我的源程序的包含正在測試的任何目標文件相鏈接。有沒有辦法自動處理?更具體地說,是否有編寫Makefile以便make自動確定哪些目標文件必須鏈接在一起才能生成特定的單元測試程序?

更新:我的代碼是在很多的.cpp/.h文件組織起來,是目前單一的(無庫)。單元測試位於一個單獨的目錄中,通常與我的源代碼樹中的.cpp文件成1對1關係。

更新2:希望這將使我的問題少廣闊,這裏是Makefile中的摘錄,我使用:

$(TSTDIR)%.$(TEST): $(OBJDIR)%.$(TEST).$(OBJEXT) $(OBJDIR)%.$(OBJEXT) 
    @mkdir -p $(@D) 
    @$(CXX) -o [email protected] $^ $(TSTLIBS) 

$(OBJDIR)%.$(OBJEXT): $(SRCDIR)%.$(SRCEXT) $(DEPDIR)%.$(DEPEXT) 
    @mkdir -p $(@D) 
    @$(CXX) $(CXXFLAGS) $(INCLUDES) -o [email protected] $< 

$(TEST)只是我用我的單位來區分的標誌測試和其他文件。請注意,我目前將所有測試程序與具有相同名稱的目標文件鏈接起來。然而,如果還需要來自另一個目標文件的符號,這將會中斷。

更新3:這是我在上述段落中討論的一個例子。

MyOtherClass.h:

class MyOtherClass 
{ 
public: 
    int Foo(); 
} 

MyOtherClass.cpp:

#include "MyOtherClass.h" 

int MyOtherClass::Foo() 
{ 
    return 0; 
} 

MyClass.h:

#include "MyOtherClass.h" 

class MyClass 
{ 
public: 
    int Foo(); 

private: 
    MyOtherClass moc_; 
} 

MyClass.cpp:

#include "MyClass.h" 

int MyClass::Foo() 
{ 
    return moc_.Foo(); 
} 

TestMyClass.cpp會測試MyClass::Foo是否返回0.使用我當前的Makefile,這將不會編譯,因爲測試程序需要與MyClass.o和MyOtherClass.o鏈接。

+0

我看到有些人投票結束這個問題太廣泛。可以說,我沒有提及利弊,這是太寬泛問題的唯一部分。 –

+0

我不同意擱置這個問題。我在這裏問了一個元問題:https://meta.stackoverflow.com/questions/276879/why-was-this-question-put-on-hold-as-opinion-based - 來自投票人的評論是受歡迎的。 –

+1

你是如何組織你的代碼應該被測試的?你有靜態或共享庫嗎?你是否只有簡單的源代碼編譯成一個單一的可執行文件?你的單元測試框架是什麼?什麼妨礙你添加另一個目標'test:'到你的make文件?還有更多的問題在這裏打開......沒有對錯的方法來爲你提供抱歉。 –

回答

1

我發現this excellent answer這是給了一個相關的問題。

可以通過使用靜態或動態庫來解決鏈接問題。如果正在測試的對象文件被編譯到庫中,那麼當鏈接單元測試程序時,它將從庫中提取所需的任何依賴關係。