Qt测试模拟动态链接库

时间:2018-01-09 08:34:04

标签: c++ qt unit-testing mocking qttest

我对如何使用模拟和动态链接库感到有点困惑。让我们假设一个项目结构,如下所示

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测试框架。

1 个答案:

答案 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预处理器宏构建库。有了这个,你就可以绕过不必要的库代码执行。