C++ 使用链接时间替换进行单元测试
C++ unitTest with LinkTime substitution
我正在阅读James W. Grenning的《嵌入式C的测试驱动开发》。
我想使用Visual Studio Community 2019和gTest重现"链接时间替换"的情况。
我有以下代码:
production_code静态链接库
傅.cpp
#include "foo.h"
int foo(int x) {
return x + 1;
}
福.H
#ifndef _foo_
#define _foo_
int foo(int x);
#endif //_foo_
在gtest项目中production_code库通过引用包含在内测试.cpp
#include "gtestgtest.h"
#include "gmockgmock.h"
#include "..prodfoo.h"
//fake implementation of production code foo
int foo(int x) {
return x - 1;
}
TEST(TestCaseName, TestName) {
auto x = foo(5);
EXPECT_EQ(x, 4);
}
链接器给我以下错误:
1>prod.lib(foo.obj(:错误LNK2005:"int __cdecl foo(int(" (?foo@@YAHH@Z( 已在 test.obj 1>C:\Example\prod_test.exe 中定义 :致命错误LNK1169:找到一个或多个乘法定义的符号
我在这里错过了什么?为什么这不起作用?
如果我将命令"/FORCE:MULTIPLE"添加到链接器,那么我只会得到警告,但我认为这不是这样做的正确方法。
出现这种情况是因为您在 2 个位置定义了foo(int)
:foo.cpp和test.cpp并且使用此文件构建代码。如果您需要使用存根运行一些测试(在这种情况下foo(int)
假函数(,则需要为其创建 2 个构建目标:
- 构建您的实际应用程序
- 为单元测试构建一个特殊的应用程序(然后运行它(
当您为单元测试构建应用程序时,您可以将其与test链接.cpp(但不与foo.cpp链接(。此外,当你构建你的实际应用程序时,你把它与foo.cpp(而不是test.cpp链接(。
注意:当此存根根据测试的想法提供一些附加功能时,测试真实代码并创建一个存根是有意义的(例如,您检查sort()
函数,但您可以使用存根生成sort()
数据,因为数据是在某些复杂算法完成工作并且计算需要大量时间后提供的(,或者您不想使用某些资源(例如, 您检查sort()
函数,但您使用与服务器的网络连接来获取sort()
(的真实数据,或者您需要提供一些特定数据来测试算法(例如,使用特定数据检查极端情况;或者您可能发现sort()
不适用于特定数据(。但同样,测试真实代码是有意义的。
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- VC++本机单元测试,找不到调试符号
- 用于交叉编译和CMake的预处理器宏的单元测试
- C++ 用于单元测试的模板模板
- 提升 1.64 单元测试编译失败
- 单元测试欧拉到四元数实现失败
- 运行 C++ 单元测试时LNK2005链接错误
- 禁用自动捕获 Googletest 单元测试中的C++异常
- 有没有办法在不使用 #ifdef 的情况下不编译发布版本中的单元测试函数体?
- 使用 Google Test 对自定义断言函数进行单元测试
- 如何将我的 CMake 项目配置为运行所有单元测试?
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- MS 本机单元测试 - 断言::线程失败不起作用
- 如何获取 CMake 单元测试的相对路径?
- QTimer 超时不会在单元测试中触发
- 如何在提升构建中设置环境变量以进行提升单元测试框架?
- 在 AtMega32a 上运行的C++的单元测试
- 使用 gtest 框架在单元测试代码中检查目标对象的私有变量的最佳实践是什么?
- 如何用 c++ 编写单元测试?