Coco TCL教程

Tcl脚本覆盖率分析

演示应用程序构建

将示例复制到您的工作目录

$ cp -r /opt/SquishCoco/doc/demoapp_tcl ./
$ cd demoapp_tcl

编辑Makefile并根据您的系统库名称和包含路径调整以下变量

TCLLIBS=-ltk8.5 -litcl3.4 -ltcl8.5
TCLINCLUDES=-I/usr/include/tcl8.5

使用以下命令构建C++可执行文件

$ make

通过执行启动器脚本测试简单的Tk GUI

$ ./proto

即席Tcl覆盖率运行

通过Tcl覆盖率扫描工具启动测试中的应用程序

$ coveragescannertcl --cs-output=tcl ./proto

GUI将像平常一样显示,同时正在监视代码覆盖率。此时,应用程序可能已经通过文件 > 退出菜单项或窗口标题栏中的X按钮关闭。注意将生成两个文件tcl.csmestcl.csexe。后一个包含上次执行中覆盖的代码数据。前者是一个测量数据库,包含有关已工具化的代码和可能导入的前期执行信息。在这种情况下,输出文件的基名是通过--cs-output开关设置的。如果未指定,它将从中推导出应用程序名称。

结果分析

这些结果可以在Coco提供的GUI中交互式查看。要启动它,运行

$ coveragebrowser

选择 文件 > 打开以打开tcl.csmes文件。您将在分别的方法选项卡中看到所有Tcl文件和过程。选择其中任何一个,将打开一个源代码查看器,显示带灰色背景的已工具化代码。请注意,着色仍然仅限于已工具化、即已看到的代码。要检查哪些代码实际上已执行(或未执行),请选择文件 > 加载执行报告并打开tcl.csexe。现在,表示正负覆盖的红绿色调将出现在文件、过程和代码本身上。

过滤后的Tcl覆盖率运行

正如您可能已经注意到的,这种临时运行为几个未命名的内部文件生成了结果。这些来自内部Tcl/Tk文件或例如鼠标事件处理程序,它们导致即时的eval调用。与特定应用程序的Tcl文件相比,这些内部代码片段的覆盖率信息很少引起兴趣。

隐藏不相关代码片段的最简单方法是通过使用各种--cs-exclude-code选项。以下是一些建议的开关列表,将在带有过滤选项的上一次运行中显示

$ coveragescannertcl --cs-output=tcl  --cs-exclude-code-regex="^\s*[^\n]*\s*$"
   --cs-exclude-code-regex="(tcl|tk)Init" --cs-exclude-code-regex="namespace eval ::itcl"
   --cs-exclude-code-regex="^# This file is generated"
   --cs-exclude-code-regex="tk::Menu(Motion|Leave)" ./proto

当在CoverageBrowser中查看新的tcl.csmes时,您会注意到文件列表已减少到相关的canvas.tclxinput.tclxmainwindow.tclxpoint.itclrect.itcl脚本。

TCL覆盖率报告生成

可以使用CoverageBrowser GUI或命令行生成文本、XML和HTML报告。在此示例中,我们假装执行数据尚未导入到测量数据库。此步骤可以从命令行完成

$ cmcsexeimport --title="First run" -m tcl.csmes -e tcl.csexe

生成的proto.csmes文件现在包含我们可以用于生成报告的内容

$ cmreport --title="Coverage Data" -m tcl.csmes --html=report.html

生成的report.html文件(包括report_html目录)现在可以使用Web浏览器访问。它包含全局层面的执行列表、源文件、函数和指标,以及按文件和按函数划分。

C/C++代码覆盖率分析

仪器

虽然Tcl代码可以用于即时覆盖分析,但这一步骤需要对C或C++应用程序进行重建。然而,这几乎不会改变您的常规应用程序构建。以下是两种可能的方法

  • 修改您的构建系统以使用代码扫描工具csgcccsg++等,这些工具将同时进行代码仪表化和随后使用原始编译器正常编译代码。
  • 将Coco的编译器包装器命名为gccg++等,悄悄地放入可执行搜索PATH。它们将首先进行代码仪表化,然后让真正的编译器完成任务。

我们将使用第二种方法。首先,清理现有的目标文件

$ make clean

然后,使用更改后的PATH和启用编译器包装器的开关重新编译应用程序。为了简洁,我们将这一切都在一行中完成

$ PATH=~/SquishCoco/wrapper/bin:$PATH COVERAGESCANNER_ARGS="--cs-on"  make

结果是,我们不仅会得到主可执行文件(proto.exe),还会得到相应的仪表化文件proto.exe.csmes。有关仪表化代码(灰色背景颜色)的信息可选在此点进行审查

$ coveragebrowser -m proto.exe.csmes

执行

让我们运行应用程序

$ ./proto

然后通过其GUI立即退出。当前工作目录现在将包含一个proto.exe.csexe,其中包含有关已完成执行的详细信息。

结果分析

与Tcl一样,现在可以在CoverageBrowser中查看结果。这里显示了一个简短的调用,打开仪表化和执行文件

$ coveragebrowser -m proto.exe.csmes -e proto.exe.csexe

TCL/C++覆盖率报告生成

报告生成过程与上述用于Tcl代码的方法类似。

混合Tcl和C/C++代码覆盖率分析

混合应用程序的Tcl和C/C++部分的覆盖率数据可以像上面显示的那样独立收集,来自单个或多个执行。唯一需要的额外步骤是将数据合并到单个测量数据库中。这可以用于生成一个考虑两种语言的单一组合报告。

组合覆盖率运行

假设C/C++代码的仪器设置仍然在位,我们可以通过单一运行收集两种语言的覆盖率数据

$ coveragescannertcl --cs-output=tcl ./proto

在应用程序重建中还保留有proto.exe.csmes文件的情况下,我们现在将有两个文件集

  1. tcl.csexe
  2. tcl.csmes
  3. proto.exe.csexe
  4. proto.exe.csmes

在此阶段,可以使用cmcsexeimport独立分析Tcl和C/C++的覆盖率数据。但我们需要得到一个全面的视图,因此在下一节中我们将合并结果。

合并测量数据

我们将使用命令行工具而不是覆盖率浏览器GUI。在第一步中,我们将合并来自两种语言的仪器文件集成一个。

cmmerge -o all.csmes tcl.csmes proto.exe.csmes

为了节省磁盘空间,可以使用--append选项来替代创建新的all.csmes文件。

在第二步中,使用2号语言的merge策略合并两个执行文件。

$ cmcsexeimport -m all.csmes -e tcl.csexe --title="Hybrid" --passed
$ cmcsexeimport -m all.csmes -e proto.exe.csexe -p merge --title="Hybrid" --passed

为了使合并实际发生,title必须相同。

组合覆盖报告生成

可以使用单个命令行调用来生成涵盖两部分应用程序覆盖率的单个HTML报告。

$ cmreport --title="Hybrid Tcl/C++ Coverage" -m all.csmes --html=report.html

选择源文件以查看在组合报告中列出Tcl(各种文件)和C++代码(main.cpp)。

Coco v7.2.0©2024 Qt公司有限公司。
Qt及其相关标志是Qt公司(芬兰)及其它在世界各地的商标。所有其他商标均属于其各自的所有者。