gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:40:29 24 4
gpt4 key购买 nike

我最近开始尝试在我的一个 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:这是我在上一段中谈到的例子。

我的其他类.h:

class MyOtherClass
{
public:
int Foo();
}

我的其他类.cpp:

#include "MyOtherClass.h"

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

我的类.h:

#include "MyOtherClass.h"

class MyClass
{
public:
int Foo();

private:
MyOtherClass moc_;
}

我的类.cpp:

#include "MyClass.h"

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

TestMyClass.cpp 将测试 MyClass::Foo 是否返回 0。使用我当前的 Makefile,这不会编译,因为测试程序需要与 MyClass.o 和 MyOtherClass.o 链接.

最佳答案

我找到了 this excellent answer这是给相关问题的。

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

关于c++ - 如何编译和链接单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26945685/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com