Coco 测试引擎目标

概览

Coco 测试引擎的 目标程序Coco 测试引擎驱动程序 驱动,并将其连接到被测试的功能。该程序是一个由用户编写和编译的独立的数据驱动单元测试,它使用来自 Coco 测试引擎框架的头文件和宏。

对于每个数据驱动的测试,用户会编写一个接口定义,通过 COCOTEST 宏引入。接口包括一个用于读取测试数据的宏(《COCOTEST_FETCH》),另一个用于保存和验证测试结果的宏(《COCOTEST_CHECK》))。在读取和验证之间调用被测试的功能。

目标程序的主要用途是运行 cocotestengine 驱动程序,但有一个用例更好使用目标程序直接:当需要调试特定测试用例时。可以在调试器中运行如下命令

<targetprog> -t <test> -d <configDir> --row <row>

其中 <targetprog> 是编译后的目标程序,<test> 是测试名称,<row> 是需要执行的行为。失败测试的行号由 cocotestdriver 如下报告

Row 5:
    In:  expression="11"
    Out: result="Ans = 11" (should be "Ans = 1")
Rows run: 78. Passed: 77, Failed: 1.

编写目标程序

本节假设您要测试的代码包含在一个或多个库中。因此,目标程序是一个使用此库的单独的 C++ 源文件。

源代码

源代码必须以一条包含语句开始

#include "CocoTestEngine.h"

这使以下宏可访问

COCOTEST

COCOTEST( <testname> ):声明一个测试接口。这个宏用于以下形式

COCOTEST( test )
{
    <fetch statements>
    <function calls>
    <check statements>
}

其中以下代码块(称为 COCOTEST 块)是一个 void 函数,它包含对 COCOTEST_FETCHCOCOTEST_CHECK 的调用,其中包含任意代码。

该宏定义了一个名为 <testname> 的测试。这是与目标程序和 cocotestengine-t 标志一起使用的名称,用于指定一个测试。它也是用于存储配置选项和测试数据的 JSON 文件 的基本名称。

COCOTEST_FETCH

COCOTEST_FETCH( <type>, <identifier> ):声明一个变量并获取其内容。

该宏使用名称 <identifier> 声明一个给定类型的变量,并将一个值赋给它。在测试和学习模式下,该值从数据文件中名为 "<identifier>" 的行中的 input 字段中获取。在发现模式下,它由 cocotestengine 生成。

所有 COCOTEST_FETCH 语句都必须位于 COCOTEST 块的开头。

COCOTEST_CHECK

COCOTEST_CHECK( <identifier> ):保存或验证一个变量。

<identifier> 必须是已经声明的变量的名称。

在测试模式下,变量的值与数据文件中当前行的 output 字段 "<identifier>" 的值进行比较。如果它们不同,则该行的测试失败,并且程序继续检索和测试下一行。

在学习模式下,<identifier> 的当前值将覆盖数据文件中的值。

在发现模式下,生成一个新的行,其中输出值 "<identifier>" 是变量的当前值。在发现过程结束时,将新行写入数据文件(除非它被更好的一个所替代)。

所有 COCOTEST_CHECK 语句都必须位于 COCOTEST 块的末尾。

COCOTEST_MAIN

COCOTEST_MAIN:此宏必须出现在每个目标源文件的末尾。它为目标程序定义了一个适当的 main() 函数。

注意:有关 COCOTEST_FETCHCOCOTEST_CHECK 可以使用的类型列表,请参见此处

编译

对于目标程序的编译,只需向编译器添加一个包含路径,以便找到 CocoTestEngine.h 文件,并启用代码覆盖率 - 所需的所有位于头文件中的代码。

  • 在 Linux 默认安装下,包含 CocoTestEngine.h 的目录是 /opt/SquishCoco/include
  • 在 Windows 上,它位于 %SQUISHCOCO%\CocoTestEngine,其中 %SQUISHCOCO% 是安装程序自动设置的指向 Coco 安装目录的路径环境变量。

因此,必须扩展编译器的包含路径,以便搜索这些目录。

对于发现,必须使用代码覆盖率编译目标 包含要测试的函数的库。与普通代码覆盖率不同,需要额外的选项。在简单的情况下,选项可能包括

--cs-on --cs-test-case-generation --cs-exclude-file-wildcard=* --cs-include-file-wildcard=*/librarydir/*

要启用测试数据和代码覆盖率生成的以下参数是必需的

  • --cs-on 以启用代码覆盖率。
  • --cs-test-case-generation 以支持测试用例生成。

以下参数被建议以提高遗传算法的精度

  • --cs-mcdc--cs-mcc(可选)用于更多由搜索算法使用的仪器点。
  • --cs-exclude-file-wildcard=* --cs-include-file-wildcard=*/librarydir/* 以仅生成库代码的代码覆盖率。然后搜索算法可以更清楚地看到哪些更改导致了更多的代码覆盖率。

    使用库代码所在目录的名称而不是 librarydir。如果需要,请使用多个 --cs-include-file-wildcard 标志。

请注意,即使目标是未启用代码覆盖率编译的,运行测试和执行学习仍然可能;只是不进行发现。

命令行参数

以下是一些从用户角度需要的命令行参数列表。还有更多选项,但它们是 cocotestengine 和目标程序之间通信需要的,并且可能没有通知就改变。

  • -h | --help:打印帮助信息并退出。
  • -d <path> | --data-dir=<path>:设置包含数据和配置文件的目录的路径。

    默认值是驱动程序的当前工作目录。

  • -t <string>:设置要执行的测试的名称。
  • -r <int> | --row=<int>:设置要执行的行号。

    如果没有设置此参数,则将执行所有测试。

  • --learn:启用学习模式。

    必须设置选项 -t。然后目标程序将运行此测试的所有行,并将每行的测试输出值存储在数据文件中。

  • -l | --list:打印由目标程序支持的测试列表。

Coco v7.2.0©2024 The Qt Company Ltd.
Qt 及其相关标志是芬兰和/或全球其他国家的 The Qt Company Ltd. 的商标。所有其他商标均为其各自所有者的财产。