QML 应用程序的代码覆盖率

在本教程中,我们将展示如何使用 Coco 测量用 C++ 和 QML 编写的 Qt 应用程序的代码覆盖率。我们描述了如何独立测量每种语言的代码覆盖率以及如何将它们组合成一个单一的报告。

我们将使用一个名为 parser_qml 的简单 GUI 应用程序,它是 简单项目的 instrumentation 中描述的解析器示例的扩展。它使用相同的 C++ 后端,但也具有用 QML 编写的图形界面以及 JavaScript。

设置教程

先决条件

为了简单起见,我们假设您正在运行一个安装了 gcc 编译器的 Linux 机器。然而,相应的步骤可以在 Windows 和 macOS 上使用 Visual Studio、Clang 和其他支持的工具链执行。本教程还假设您有

  • 环境 PATH 中的 Coco 安装路径,
  • 环境 PATH 中的 Qt 6 安装路径,
  • Qt 账户中可以单独下载的 CocoQML 插件副本。

获取教程源代码

此示例的源代码可以在 Linux 和 macOS 上的 SquishCoco/samples/parser/parser_qml 和 Windows 上的 <Windows Coco>\parser\parser_qml 中找到。我们必须首先将此目录复制到我们的工作区

$ cd /home/user/cocoqml-tutorial
$ cp -r /path/to/SquishCoco/samples/parser/parser_qml .

我们还可以采取此步骤来浏览源代码。作为选项,我们还可以在不进行代码覆盖率的情况下编译和执行应用程序

$ mkdir parser_qml-build && cd parser_qml-build
$ qmake ../parser_qml
$ make
$ ./parser_qml

设置 CocoQML

提取 CocoQML 包

接下来,我们在工作区中提取 CocoQML 包的内容

$ tar xvzf cocoqml-7.2.0-linux.tgz
$ ls cocoqml-7.2.0-linux
bin  trackerplugin

版本号 7.2.0 应替换为您拥有的 CocoQML 版本号。这将在我们的工作区中产生一个包含的目录 cocoqml-7.2.0-linux

  • bin/cocoqmlscanner - 用于使用覆盖率计数器对 QML 源代码进行 instrumentation 的应用程序
  • trackerplugin 目录 - 记录执行过程中覆盖率计数器值的 QML 插件

关于 CocoQML 的工作原理的更详细解释,您可以阅读我们的专项 QML 层次结构 参考页面。

编译 trackerplugin

下一步是 编译 trackerplugin。它是一个 qmake 项目,必须与要测试的应用程序相同的 Qt 安装一起编译。我们在名为 trackerplugin-build 的单独构建目录中进行编译。

$ cd cocoqml-7.2.0-linux
$ mkdir trackerplugin-build && cd trackerplugin-build
$ qmake ../trackerplugin
$ make

这将在 QmlJsCoverage 目录下创建一个目录,其中包含一个名为 cocoqmltracker 的插件。此模块必须由经过测试的 QML 应用程序加载,负责将覆盖率计数器记录到 .csexe 文件中。注意 trackerplugin-build 目录的位置,因为它将在接下来的步骤中使用。

对源代码进行测试

这一步将分析源代码并在代码中插入计数器以确定哪些代码部分已执行。必须分别对源代码的 C++ 和 QML 部分执行此操作。

QML 测试

首先,我们使用 cocoqmlscanner测试 QML 源代码

$ cd /home/user/cocoqml-tutorial/parser_qml
$ ../cocoqml-7.2.0-linux/bin/cocoqmlscanner .

cocoqmlscanner 通过在代码中插入覆盖率计数器修改 .qml.js 源代码文件,同时保留原始代码的副本在备份文件中。它也为 QML 和 JS 源代码创建了仪器化数据库,形式为名为 cocoqmlscanner_result.csmes.csmes 文件。其文件名可以使用 -c--csmes-name 选项指定。

有关 cocoqmlscanner 命令行选项的更多详细信息,请参阅其专项 参考页面

C++ 编译和测试

接下来,由主 Coco 软件包的一部分 CoverageScanner 进行 C++ 代码的测试。为此,取代编译器而不是调用某个 CoverageScanner 包装器。例如,使用 csg++ 而不是 g++

parser_qml.pro 中,可以使用 CodeCoverage 配置来启用此操作

CodeCoverage {
    COVERAGE_OPTIONS = --cs-mcdc --cs-exclude-file-abs-wildcard=* --cs-include-path=$$PWD

    QMAKE_CFLAGS   += $$COVERAGE_OPTIONS
    QMAKE_CXXFLAGS += $$COVERAGE_OPTIONS
    QMAKE_LFLAGS   += $$COVERAGE_OPTIONS

    QMAKE_CC=cs$$QMAKE_CC
    QMAKE_CXX=cs$$QMAKE_CXX
    QMAKE_LINK=cs$$QMAKE_LINK
    QMAKE_LINK_SHLIB=cs$$QMAKE_LINK_SHLIB
    QMAKE_AR=cs$$QMAKE_AR
    QMAKE_LIB=cs$$QMAKE_LIB
}

这告诉 qmake 使用 CoverageScanner 进行编译。给定的 COVERAGE_OPTIONS 告诉 CoverageScanner 测量 MC/DC 覆盖率并排除此目录之外的所有其他源文件。

要启用代码覆盖率编译,我们只需将 CodeCoverage 添加到配置中

$ cd /home/user/cocoqml-tutorial
$ mkdir parser_qml-coverage && cd parser_qml-coverage
$ qmake ../parser_qml CONFIG+=CodeCoverage
$ make

这将为 C++ 源文件创建仪器化的可执行文件 parser_qml 和仪器化数据库 parser_qml.csmes

有关 qmake 集成的更多详细信息,请参阅 此处

执行仪器化的应用程序

为了让经过测试的 QML 代码可以工作,我们需要将 QML 运行时指向我们在之前步骤中构建的 trackerplugin

$ export QML_IMPORT_PATH=/home/user/cocoqml-tutorial/cocoqml-7.2.0-linux/trackerplugin-build

没有这样做,通常会导致错误消息:"module "QmlJsCoverage" is not installed"

现在我们可以运行应用程序

$ ./parser_qml

使用图形界面,您可以输入各种算术运算并点击按钮以便测试源代码的不同部分。

退出应用程序后,当前工作目录中会写出两个 .csexe 文件

  • parser_qml.csexe 包含 C++ 覆盖率计数器
  • ParserQML_qml.csexe 包含 QML 覆盖率计数器

导入和合并覆盖率数据

现在,我们可以使用cmcsexeimport实用程序将覆盖率计数器导入仪器数据库。我们分别对C++和QML进行操作。

$ cmcsexeimport -m parser_qml.csmes -e parser_qml.csexe -t "C++"
$ cmcsexeimport -m ../parser_qml/cocoqmlscanner_result.csmes -e ParserQML_qml.csexe -t "QML"

然后,我们可以使用cmmerge实用程序将两个.csmes文件合并。

$ cmmerge -o parser_qml.csmes -a ../parser_qml/cocoqmlscanner_result.csmes

最后,我们可以使用CoverageBrowser浏览覆盖率数据内容。

$ coveragebrowser -m parser_qml.csmes

如果一切操作正确,你应该能在“源代码”面板中找到C++和QML文件,以及在“执行”面板中的“C++”和“QML”条目。

Coco v7.2.0©2024 泛泰公司有限公司。
Qt及其相关标志是泛泰公司在芬兰以及其他国家和地区的商标。所有其他商标均为其各自所有者的财产。