如何编译和链接单元测试?

时间:2014-11-15 12:10:01

标签: c++ linux unit-testing makefile tdd

我最近开始尝试在我的一个C ++项目中使用TDD。我对此非常陌生,而且我对编译和使用单元测试的方式有一些非常基本的问题。我在Linux上使用Boost.Test库。

  1. 为所有单元编译包含所有测试套件的单个大型测试程序是否常见?如何将测试分成许多较小的独立测试程序?

  2. 如何处理链接(使用make)?每个测试程序对象必须与源程序中的目标文件链接,该目标文件包含正在测试的任何内容。有没有办法自动处理?更具体地说,是否还要编写Makefile以便make自动确定必须将哪些目标文件链接在一起以生成某个单元测试程序?

  3. 更新:我的代码组织在许多.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链接。

1 个答案:

答案 0 :(得分:1)

我发现了this excellent answer给了相关的问题。

可以通过使用静态或动态库来解决链接问题。如果正在测试的目标文件被编译到库中,那么当链接单元测试程序时,它将从库中提取它所需的任何依赖项。