守听 发表于 2024-2-11 21:05:14

Qt6 c++教程9测试&调试

9 测试&调试

调试和测试是软件开发的重要组成部分。在本章中,你将学习如何调试 Qt 项目、不同的调试技术以及 Qt 支持的调试器。调试是发现错误或不希望出现的行为的根本原因并加以解决的过程。我们还将讨论使用Qt Test框架进行单元测试。Qt Test是基于Qt的应用程序和库的单元测试框架。它具有大多数单元测试框架提供的所有功能。此外,它还支持测试图形用户界面(GUI)。本模块有助于以便捷的方式编写基于 Qt 的应用程序和库的单元测试。您还将学习使用不同图形用户界面测试工具测试图形用户界面的技巧。
具体来说,我们将讨论以下主题:

[*]Qt中的调试
[*]调试策略
[*]调试C++应用程序
[*]调试Qt Quick应用程序
[*]Qt中的测试
[*]与Google的 C++ 测试框架集成
[*]测试Qt Quick应用程序
[*]图形用户界面测试工具
9.1 Qt 调试

在软件开发过程中,经常会出现技术问题。为了解决这些问题,我们必须在向公众发布应用程序之前首先确定并解决所有问题,以保证质量和声誉。调试是一种定位这些潜在技术问题的技术。
Qt 支持几种不同类型的调试器。您所使用的调试器可能因您的项目所使用的平台和编译器而异。以下是 Qt 广泛使用的调试器列表:

[*]GNU 符号调试器(GDB)是由 GNU 项目开发的跨平台调试器。
[*]Microsoft Console Debugger (CDB) 是 Microsoft 为 Windows 开发的调试器。
[*]低级虚拟机调试器(LLDB)是由 LLVM 开发人员小组开发的跨平台调试器。
[*]QML/JavaScript Debugger 是 Qt 公司提供的 QML 和 JavaScript 调试器。
如果您在 Windows 上使用 MinGW 编译器,则无需手动设置GDB,因为它通常包含在 Qt 安装中。如果您使用的是Linux等其他操作系统,则可能需要在将其链接到 Qt Creator之前手动安装。Qt Creator会自动检测 GDB 的存在,并将其添加到调试器列表中。
你也可以使用Valgrind来调试你的应用程序。你可以指定 --vgdb=yes 或 --vgdb=full 来激活 Valgrind gdbserver。你可以指定 --vgdb-error=number 来在显示一定数量的错误后激活 gdbserver。如果将该值设为 0,gdbserver 将在初始化时激活,这样就可以在程序启动前设置断点。值得注意的是,Valgrind 发行版中已包含vgdb。无需单独安装。
Windows可安装 CDB。默认情况下,Visual Studio 的内置调试器不可用。因此,您必须单独安装CDB调试器,方法是在安装 Windows SDK 时将 Windows 的调试工具选为可选组件。Qt Creator 通常会识别 CDB 的存在,并将其添加到选项下的调试器列表中。
Android 调试比在普通桌面环境中调试更具挑战性。Android开发需要不同的软件包,如JDK、Android SDK 和 Android NDK。在桌面平台上,需要使用 Android Debug Bridge(ADB)驱动程序才能进行 USB 调试。您必须在 Android 设备上启用开发者模式并接受 USB 调试才能继续。
MacOS 和 iOS 上使用的调试器是 LLDB。它默认包含在 Xcode 中。Qt Creator 会自动检测它的存在,并将其与工具包链接。如果您熟悉调试器并知道自己在做什么,也可以将非 GDB 调试器添加到您最喜欢的集成开发环境中。
调试器插件会根据机器上可用的调试器为每个软件包确定一个合适的本地调试器。你可以通过添加新调试器来克服这种偏好。如图 9.1 所示,你可以在 "选项 "菜单下的 "工具包 "设置中的 "调试器 "选项卡中找到可用的调试器:
https://img2023.cnblogs.com/blog/3174021/202312/3174021-20231209105745035-1404633397.png
9.2 调试策略

有不同的调试策略可以找到问题的根本原因。在尝试查找应用程序中的错误之前,彻底了解程序或程序库至关重要。如果不了解自己在做什么,就无法发现错误。只有彻底了解系统及其运行方式,才能找出应用程序中的错误。以往的经验有助于发现类似类型的错误以及解决错误。专家个人的知识决定了开发人员可以多容易地找到错误。您可以添加调试打印语句和断点来分析程序的流程。您可以进行前向分析或后向分析,以跟踪错误的位置。
调试时,可通过以下步骤找到根本原因并加以解决:

[*]确定问题。
[*]定位问题。
[*]分析问题。
[*]解决问题。
[*]修复副作用。
无论使用哪种编程语言或平台,调试应用程序时最重要的是要知道是哪段代码导致了问题。您可以通过多种方式找到有问题的代码。
如果缺陷是由质量保证团队或用户提出的,那么可以询问问题发生的时间。查看日志文件或任何错误信息。注释掉代码中可疑的部分,然后再次构建并运行应用程序,看看问题是否仍然存在。如果问题可以重现,则在找到导致问题的代码行之前,通过打印信息和注释代码行进行正向和反向分析。
还可以在内置调试器中设置断点,搜索目标功能中的变量变化。如果某个变量更新到了意外值,或者某个对象指针变成了无效指针,那么你就可以很容易地识别出来。检查安装程序中使用的所有模块,确保您和用户使用的应用程序版本号相同。如果使用的是不同的版本或不同的分支,那么请检查带有指定版本标记的分支,然后调试代码。
9.3 调试C++应用程序

QDebug类可用于将变量值打印到应用程序输出窗口。QDebug类似于标准库中的std::cout,它是Qt的一部分,支持 Qt 类,无需转换即可显示其值。
要启用调试信息,我们必须包含 QDebug 头文件。
Qt 提供了多个全局宏,用于生成不同类型的调试信息。它们可用于以下不同目的:

[*]qDebug() 提供自定义调试信息。
[*]qInfo() 提供信息消息。
[*]qWarning() 报告警告和可恢复错误。
[*]qCritical() 提供关键错误信息并报告系统错误。
[*]qFatal() 在退出前提供致命错误信息。
使用qDebug()可以查看功能是否正常运行。查找完错误后,删除包含qDebug()的代码行,以避免出现不必要的控制台日志。让我们通过一个例子来看看如何使用 qDebug()在输出窗格中打印变量。创建一个示例QWidget应用程序,添加函数 setValue(int value),并在函数定义中添加以下代码:
#include "widget.h"
#include "ui_widget.h"
#include <QDebug>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setValue(100);
}

Widget::~Widget()
{
    delete ui;
}

void Widget::setValue(int value)
{
    qDebug()<<"Value is:" <<value;
}前面的 LDTP 命令找到了 quitButton 并生成了一个按钮点击事件。您可以通过以下链接了解更多有关其功能和用途的信息:https://ldtp.freedesktop.org/user-doc/
9.8.2 GammaRay

KDAB 开发了一款名为 GammaRay 的软件自省工具,用于检查 Qt 应用程序。您可以使用 QObject 自省机制在运行时观察和操作应用程序。它既能在本地机器上运行,也能在远程嵌入式目标上运行。它扩展了指令级调试器的功能,同时遵循与底层框架相同的标准。这对于使用场景图、模型/视图、状态机等框架的复杂项目尤其有用。有多种工具可用于检查对象及其属性。然而,GammaRay 与 Qt 复杂框架的深度关联使其从众多工具中脱颖而出。
您可以从以下链接下载 GammaRay:https://github.com/KDAB/GammaRay/wiki/Getting-GammaRay
您可以从以下链接了解更多有关其功能和用途的信息:https://www.kdab.com/development-resources/qt-tools/gammaray/
9.8.3 Squish

Squish是一款跨平台图形用户界面自动化测试工具,适用于桌面、移动、嵌入式和网络应用程序。您可以对使用 Qt Widgets 或 Qt Quick 编写的跨平台应用程序进行图形用户界面自动化测试。全球数以千计的企业使用 Squish 通过功能回归测试和系统测试来测试图形用户界面。
您可以通过以下链接了解有关该工具的更多信息:https://www.froglogic.com/squish/
在本节中,我们讨论了各种图形用户界面测试工具。探索它们,并在你的项目中尝试使用。让我们总结一下本章的学习内容。
9.9 总结

在本章中,我们了解了什么是调试,以及如何使用不同的调试技术来识别 Qt 应用程序中的技术问题。除此之外,我们还了解了 Qt 在不同操作系统上支持的各种调试器。最后,我们学习了如何使用单元测试来简化某些调试措施。我们讨论了单元测试,并学习了如何使用 Qt 测试框架。你还看到了如何调试 Qt Quick 应用程序。我们还讨论了 Qt 支持的其他各种测试框架和工具。现在,您可以为自定义类编写单元测试。如果有人不小心修改了某些特定逻辑,单元测试就会失败并自动报警。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Qt6 c++教程9测试&调试