我有点困惑如何使用模拟和动态链接库。让我们假设一个如下所示的项目结构
subdirs.pro (subdir project)
- app (subdir project)
-- app (executable, include and use lib)
-- lib (dynamic library)
- test (subdir project)
-- test_app (test the app WITHOUT test lib again)
-- test_lib (fully test of lib functions)
"应用程序"正在使用库;库在test_lib项目中进行测试。
现在我想测试应用程序,但我不想再次测试整个 lib 的东西(这是愚蠢的,不费吹灰之力地重复工作!所以我需要一些方法来嘲笑整个库。以前有没有人在Qt中做过这件事,可以帮助我?这在Qt测试框架内可能吗?我已经阅读了很多文章和SO问题,但是我没有找到这个特殊问题的任何解决方案。
我使用基于 Qt 5.6.1 的 Qt Creator 4.0.3、带有 mscv2013 的 qmake 和包含的 Qt 测试框架。
正如我在评论中建议的那样,创建一个只会模拟原始库 API 的库,这是如何完成的。假设您在我们的原始库中有一个带有一些琐碎 API 的类Foo
:
class Foo
{
public:
void doSomething();
int returnSomething();
private:
void doSometingElse();
};
要创建模拟库,您必须遵循与保留公共 API 的原始库中相同的类层次结构(可以忽略私有和受保护的内容),以便应用程序也可以编译并链接到模拟库。因此,我们的Foo
类将如下所示:
class Foo
{
public:
// This is just a stub
void doSomething()
{
// Do nothing
}
// This is just a stub
int returnSomething()
{
return 0; // Some value
}
};
您必须对应用程序使用的所有类执行相同的技巧。 如果你想构建你的应用程序进行测试,你必须把它链接到模拟库而不是原始库。您不需要更改应用程序的代码,但它将调用不会执行任何操作的函数。
注意:此方法可能并不总是正常工作,因为应用程序行为可能取决于库函数执行操作的方式和内容。
更新
另一种方法是保留单个库,但是有条件地构建每个公共函数的内容。使用原始库中相同的示例Foo
类:
class Foo
{
public:
void doSomething()
{
#ifdef TEST_MODE
// Do nothing
#else
// Do things normally
#endif
}
int returnSomething()
{
#ifdef TEST_MODE
// Return some dummy value
#else
// Do the real calculations
#endif
}
private:
void doSometingElse();
};
当您需要构建应用程序进行测试时,只需使用定义的TEST_MODE
预处理器宏构建库。这样,您将绕过不必要的库代码执行。