【问题标题】:QTest - writing tests for Qt-based library and exposing classesQTest - 为基于 Qt 的库编写测试并公开类
【发布时间】:2016-11-03 10:47:27
【问题描述】:

我有一个库(我们称之为MyLib),它具有以下结构:

  • mylib_global.h - 确定 Q_DECL_IMPORTQ_DECL_EXPORT 是否位于 MYLIBSHARED_EXPORT 前缀后面,该前缀用于在编写使用库的应用程序时公开库的特定符号:

    #ifndef MYLIB_GLOBAL_H
    #define MYLIB_GLOBAL_H
    
    #include <QtCore/qglobal.h>
    
    #if defined(MYLIB_LIBRARY)       // Set using DEFINES inside MyLib.pro
    #  define MYLIBSHARED_EXPORT Q_DECL_EXPORT
    #else
    #  define MYLIBSHARED_EXPORT Q_DECL_IMPORT
    #endif
    
    #endif // MYLIB_GLOBAL_H
    
  • MyLib.h - 包含主类,其中还包括各种其他类:

    #include "mylib_global.h"
    #include "MyLibOtherClass1.h"
    #include "MyLibOtherClass2.h"
    
    // Symbol will be exposed to the application that links against MyLib
    // and can be directly interacted with from the application's code
    class MYLIBSHARED_EXPORT MyLibMainClass {
        public:
            ...
        private:
            MyLibOtherClassA ocA;
            MyLibOtherClass1 oc1;
            MyLibOtherClass2 oc2;
            ...
    }
    
    // Symbol will not be exposed to the application that links against MyLib
    // however it is indirectly used through the `MyLibMainClass`
    class MyLibOtherClassA {
        ...
    }
    
  • 源文件和其他类(header+source) - 包含MyLib 底层逻辑的声明和定义。

如您所见,我混合了多个类 - 有些定义在与库的主类相同的头文件中(它控制所有其他类实例),其他则位于不同的头文件中。只有极少数带有MYLIBSHARED_EXPORT 的类我需要公开,以便在链接时能够访问库的功能。

这在编写普通应用程序时非常好。但是我决定编写一些测试(使用 Qt 测试框架),因为我经常更改代码(现在:)),那里有许多复杂的依赖项,我想确保在每次更改后所有测试我已编写的内容已涵盖,并且功能与预期相同。

在编写测试时,我需要访问所有类以确保每个 cog 都朝着正确的方向转动(即使它没有暴露在外部)。我该如何处理?我可以在所有类前面添加MYLIBSHARED_EXPORT,但这也将允许普通用户查看内容,这只是为了间接使用。这可以使用另一个#define 更精确地进行调节,该#define 可以通过项目的设置进行设置,并且只有在定义时所有没有前缀的类都会得到一个,否则它们将不会被暴露。虽然这个解决方案很可能会成功,但它会造成代码混乱,如果可能的话,我想避免这种情况。

【问题讨论】:

    标签: c++ qt shared-libraries dllexport qtestlib


    【解决方案1】:

    由于很多功能没有导出,您已经决定不测试最终交付物:您不能只获取最终产品并在其上运行测试工具。

    然后,最简单的解决方案是将所有标头/源包含到测试工具本身中。

    您可以将源和标头列表分解到一个单独的文件中,该文件将包含在可交付成果和测试工具的项目文件中。这在 cmake 和 qmake 中都很容易做到。

    【讨论】:

    • 我决定使用#ifdef,并在我的库的项目文件中进行定义。定义变量后,我会导出所有内容,否则只会导出我真正想要导出的几个类。您的解决方案当然是完全有效的。
    猜你喜欢
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多