[英]How do I compile and link unit tests?
我最近開始嘗試在我的一個C ++項目中使用TDD。 我對此非常陌生,而且我對編譯和使用單元測試的方式有一些非常基本的問題。 我在Linux上使用Boost.Test庫。
為所有單元編譯包含所有測試套件的單個大型測試程序是否常見? 如何將測試分成許多較小的獨立測試程序?
如何處理鏈接(使用make
)? 每個測試程序對象都必須與源程序中的目標文件鏈接,該目標文件包含正在測試的內容。 有沒有辦法自動處理? 更具體一點,是否有編寫Makefile
以便make
自動確定哪些目標文件必須鏈接在一起以生成某個單元測試程序?
更新 :我的代碼組織在許多.cpp / .h文件中,目前是單片(沒有庫)。 單元測試位於一個單獨的目錄中,通常與源樹中的.cpp文件保持一對一的關系。
更新2 :希望這會使我的問題不那么廣泛,這里是我正在使用的Makefile的摘錄:
$(TSTDIR)%.$(TEST): $(OBJDIR)%.$(TEST).$(OBJEXT) $(OBJDIR)%.$(OBJEXT)
@mkdir -p $(@D)
@$(CXX) -o $@ $^ $(TSTLIBS)
$(OBJDIR)%.$(OBJEXT): $(SRCDIR)%.$(SRCEXT) $(DEPDIR)%.$(DEPEXT)
@mkdir -p $(@D)
@$(CXX) $(CXXFLAGS) $(INCLUDES) -o $@ $<
$(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鏈接。
我找到了一個相關問題的優秀答案 。
通過使用靜態或動態庫可以解決鏈接問題。 如果正在測試的目標文件被編譯到庫中,那么當鏈接單元測試程序時,它將從庫中提取它所需的任何依賴項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.