QTest - 为基于 Qt 的库和公开类编写测试
QTest - writing tests for Qt-based library and exposing classes
我有一个库(我们称之为MyLib
(,它具有以下结构:
-
mylib_global.h - 确定
Q_DECL_IMPORT
或Q_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 中都很容易做到。
- Qt QML桌面应用程序自动化测试
- 在Qt C++单元测试中动态加载QQuickWindow而不是QQuickWidget
- 在Qt中测试它是QJsonObject还是QJsonArray
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
- 如何在Qt测试框架中对信号进行基准测试?
- Cmake无法在qt-creater/collect2上编译简单的测试程序:错误:ld
- Qt单元测试:指针列表上的QCOMPARE函数
- 如何测试高级Qt插件?
- 如何使用Boost单元测试框架测试Qt应用程序
- CppUnit 测试与 Qt 5.9 一起挂起
- 使用命名空间进行 QT 测试
- Qt 自动 UI 测试因消息框而停止.如何在消息框中模拟输入?
- 在Qt项目中包括谷歌测试
- 如何使用 Qt 自发关闭事件进行单元测试
- 在QT中测试Lambda唯一连接
- 单位测试QT中的非返回功能
- Qt测试模拟动态链接库
- NAS(使用 qt/linux)- 无法建立简单的音频服务器连接测试
- 将超时设置为QT测试
- 测试Qt 5.0.x中的QQuickView(QWindow)是否为全屏