我对如何使用模拟和动态链接库感到有点困惑。让我们假设一个项目结构,如下所示
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)
'app'正在使用图书馆;该库在test_lib项目中进行测试。
现在我想测试应用程序,但我不想再次测试整个lib的东西(这是愚蠢的双重工作而不费力!)。所以我需要一些方法来模拟整个lib。有没有人在Qt之前做过这个并且可以帮助我?这可能在Qt测试框架内吗?我已经阅读了很多文章和SO问题,但我没有找到任何解决这个特殊问题的方法。
我使用Qt Creator 4.0.3基于Qt 5.6.1,qmake使用mscv2013和包含的Qt测试框架。
答案 0 :(得分:0)
正如我在评论中提出的那样,创建一个只会模拟原始库的API的库,以下是它的完成方式。我们假设您在我们的原始库中有一个类Foo
和一些简单的API:
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
预处理器宏构建库。有了这个,你就可以绕过不必要的库代码执行。