我刚刚开始使用TDD,并且很好奇其他人采取什么方法来运行他们的测试.作为参考,我使用谷歌测试框架,但我相信这个问题适用于大多数其他测试框架和C/C++以外的语言.
到目前为止,我的一般方法是做三件事之一:
将大部分应用程序写入静态库,然后创建两个可执行文件.一个可执行文件是应用程序本身,而另一个是具有所有测试的测试运行器.两者都链接到静态库.
将测试代码直接嵌入到应用程序本身中,并使用编译器标志启用或禁用测试代码.这可能是我迄今为止使用过的最好的方法,但是稍微混乱了代码.
将测试代码直接嵌入到应用程序本身中,并且在给定某些命令行开关的情况下,运行应用程序本身或运行应用程序中嵌入的测试.
这些解决方案都不是特别优雅 ......
你是怎么做到的?
我有一个 C++ 项目,我使用 Google Test 来编写单元测试。该项目已经存在了一段时间并且相当混乱,因此我只是在 main 函数的开头添加了一行,用于启动单元测试,然后退出程序。然后,我将注释和取消注释这一行,以便在单元测试和实际应用程序之间切换。
当只有我使用我的代码时,这工作正常,但现在我试图以正确的方式解决这个问题,使用两个项目和 .exe 文件,一个用于实际应用程序,一个用于测试,就像图萨在这里的答案: Visual Studio C++:使用 google test 进行单元测试 exe 项目?
他对此的解释如下: Linking to multiple .obj for unit test a console application
问题是所有 .obj 文件都放入该库中,包括 main 函数。这使得我无法链接到我的 testmain,因为 _main 已经定义了。我尝试在命令中添加“/REMOVE”选项,所以它看起来像这样:
lib /NOLOGO /OUT:"$(TargetPath).lib" /REMOVE:"$(ProjectDir)$(Configuration)\mainfile.obj" "$(ProjectDir)$(Configuration)\*.obj"
Run Code Online (Sandbox Code Playgroud)
我希望 mainfile.cpp 被编译为 mainfile.obj。lnk 的输出是:
LINK : warning LNK4014: cannot find member object C:\dev\solutions\currentSolution\currentProject\Debug\mainfile.obj
Run Code Online (Sandbox Code Playgroud)
我发现的关于如何编写目标文件名称的唯一信息是来自这里: http://msdn.microsoft.com/en-us/library/5ff8sk86 (v=vs.100).aspx
他们写道:
/REMOVE 和 /EXTRACT 选项需要要删除或复制到文件的成员对象的全名。全名包括原始目标文件的路径。要查看库中成员对象的全名,请使用 DUMPBIN /ARCHIVEMEMBERS 或 LIB /LIST。
如果我输入这两个中的任何一个,我会得到一个列表,其中“C:\dev\solutions\currentSolution\currentProject\Debug\mainfile.obj”是其中一个条目。
我究竟做错了什么?我是否有什么地方输入错误,或者是否有更简单的解决方案来解决这个问题?