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及其相关标志是泛泰公司在芬兰以及其他国家和地区的商标。所有其他商标均为其各自所有者的财产。