簡體   English   中英

如何編譯和鏈接單元測試?

[英]How do I compile and link unit tests?

我最近開始嘗試在我的一個C ++項目中使用TDD。 我對此非常陌生,而且我對編譯和使用單元測試的方式有一些非常基本的問題。 我在Linux上使用Boost.Test庫。

  1. 為所有單元編譯包含所有測試套件的單個大型測試程序是否常見? 如何將測試分成許多較小的獨立測試程序?

  2. 如何處理鏈接(使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM