0

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

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

4

1 回答 1

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

于 2018-01-09T10:34:51.533 回答