QTest - 为基于 Qt 的库和公开类编写测试

QTest - writing tests for Qt-based library and exposing classes

本文关键字:测试 Qt QTest      更新时间:2023-10-16

我有一个库(我们称之为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 {
        ...
    }
    
  • 文件和其他类(标头+源( - 包含MyLib底层逻辑的声明和定义。

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

这在编写普通应用程序时完全没问题。但是,我决定编写一些测试(使用Qt测试框架(,因为我经常更改代码(目前:)(,其中有许多复杂的依赖项,我想确保每次更改后我编写的所有测试都被覆盖并且功能与预期相同。

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

由于许多功能未导出,因此您已经设置了不测试最终可交付成果:您不能只获取最终产品并在其上运行测试工具。

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

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