【发布时间】:2015-01-12 18:30:01
【问题描述】:
我最近开始尝试在我的一个 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 链接。
【问题讨论】:
-
我看到有些人投票结束这个问题太宽泛了。我正在删除对利弊的提及,因为可以说,这是问题中唯一过于宽泛的部分。
-
我不同意搁置这个问题。我在这里问了一个元问题:meta.stackoverflow.com/questions/276879/… - 欢迎来自投票者的 cmets。
-
您是如何组织应进行测试的代码的?你有静态或共享库吗?您是否只有简单的源代码束编译成一个单一的可执行文件?你的单元测试框架是什么?是什么阻碍了您将另一个目标
test:添加到您的 make 文件中?还有更多问题在这里悬而未决......没有正确或错误的方式向您表示歉意。 -
@πάνταῥεῖ 用我的代码组织更新问题。问题中清楚地说明了我的单元测试框架。没有什么能阻止我添加另一个目标
test:。我的问题是我应该在它下面写什么。 -
我已经阅读了您的问题(可能错过了提升点),但最广泛的事情是如何使用
make进行设置。这完全取决于您的代码的实际组织方式,以及已经用于构建它的内容。
标签: c++ linux unit-testing makefile tdd