Cantata中文网站 > 使用教程 > Cantata AutoTest怎么生成测试用例 Cantata AutoTest生成的用例覆盖率不足是什么原因
Cantata AutoTest怎么生成测试用例 Cantata AutoTest生成的用例覆盖率不足是什么原因
发布时间:2026/07/31 17:30:04

  Cantata AutoTest可以从C/C++源代码中分析可执行路径,并按照选定的结构覆盖目标自动生成测试脚本和测试向量。处理“Cantata AutoTest怎么生成测试用例Cantata AutoTest生成的用例覆盖率不足是什么原因”时,不能只看生成了多少条用例,还要确认源码模型、覆盖规则、函数调用控制和测试运行环境是否完整,否则用例能够执行,覆盖率仍可能停在目标值以下。

  一、Cantata AutoTest怎么生成测试用例

 

  AutoTest生成用例前,会先解析源文件并建立代码模型。测试脚本中可以包含输入参数、全局数据、预期返回值、函数调用顺序以及被调用接口的控制信息。生成后的用例仍可在测试用例编辑器或C/C++代码编辑器中继续修改。

 

  1、准备Cantata测试工程

 

  开始生成用例前,要保证Cantata能够按照项目真实参数解析被测代码。包含目录、宏定义、编译器类型和条件编译配置不完整时,生成结果会与实际构建产生偏差。

 

  ①在Cantata工作区中打开现有C/C++工程,或创建新的测试工程。

 

  ②将被测源文件和相关头文件加入工程。

 

  ③配置项目使用的编译器、包含目录和预处理宏。

 

  ④执行一次源码分析或工程构建。

 

  ⑤确认目标源文件没有解析错误。

 

  Cantata可以从一个或多个源文件生成测试,也能从只有函数声明的头文件建立初始测试框架。源代码解析后会形成用于生成结构化测试的代码模型,并在测试工程内创建对应的测试脚本和构建文件。

 

  工程里同时存在多个构建变体时,先明确本次测试使用哪一组宏和编译选项。某段代码在当前变体中根本没有参与编译,AutoTest自然不会为它生成可执行路径。

 

  2、选择需要测试的函数或源文件

 

  ①在项目资源管理器中选中目标源文件。

 

  ②打开Cantata测试生成功能。

 

  ③选择需要建立测试的函数。

 

  ④将测试类型设置为【AutoTest】。

 

  ⑤指定测试脚本名称和保存位置。

 

  ⑥进入自动生成参数设置。

 

  可以为单个函数生成隔离单元测试,也可以选择多个函数建立集成范围更大的测试。范围越大,函数之间的状态和调用关系越复杂,求解路径需要处理的数据也会更多。

 

  只想补齐现有用例的覆盖缺口时,不必重新生成整套脚本。AutoTest也可以在已有测试基础上补充用例,用于覆盖尚未执行的边界和代码路径。

 

  3、选择结构覆盖目标

 

  AutoTest会根据覆盖规则集决定需要求解到什么程度。覆盖目标越高,需要区分的条件组合通常越多。

 

  ①打开AutoTest生成设置。

 

  ②在【覆盖规则集】中选择目标等级。

 

  ③普通逻辑检查可以选择语句覆盖或判定覆盖。

 

  ④对条件独立性有要求时选择MC/DC相关规则集。

 

  ⑤检查是否同时要求函数入口覆盖。

 

  ⑥保存本次生成配置。

 

  AutoTest支持按函数入口、语句、判定和MC/DC等覆盖指标生成测试。所选规则集会影响路径求解深度以及最终生成的用例数量。

 

  如果项目要求判定覆盖,生成时却用了语句覆盖规则,最终语句可能全部执行,判定的真假分支仍然没有走全。这种情况不是生成失败,而是初始目标设低了。

 

  4、设置函数调用控制方式

 

  被测函数调用外部接口、底层驱动或硬件访问函数时,需要决定哪些调用执行真实代码,哪些调用由Wrapper控制。

 

  ①查看被测函数调用的外部函数。

 

  ②对不适合在单元测试中直接执行的接口启用Wrapper。

 

  ③设置调用时需要返回的数据。

 

  ④配置输入参数和输出参数检查。

 

  ⑤多次调用同一函数时,分别设置各次调用行为。

 

  ⑥保存后执行AutoTest生成。

 

  Cantata的调用控制可以拦截被测代码向其他对象发出的调用,并检查参数、调用顺序和返回值。调用没有得到合适控制时,部分路径可能因为硬件状态、外部资源或返回条件无法进入。

 

  5、生成、构建并运行用例

 

  ①启动AutoTest生成。

 

  ②打开生成报告,查看已生成路径和警告信息。

 

  ③在【测试用例编辑器】中检查输入值和预期结果。

 

  ④构建测试可执行程序。

 

  ⑤在主机或目标环境中运行测试。

 

  ⑥打开覆盖率结果查看未覆盖位置。

 

  AutoTest生成的测试最初以通过为目标,并为每条用例提供对应的代码路径描述。生成报告还会估算这些用例执行后能够达到的覆盖范围。

  二、Cantata AutoTest生成的用例覆盖率不足是什么原因

 

  覆盖率不足时,要先比较“预计覆盖率”和“实际覆盖率”。预计值已经不足,问题多半出在代码可测试性或生成配置;预计值达到目标,实际执行却没有达到,则要重点检查构建、运行和调用控制。

 

  1、覆盖规则集选择得过低

 

  语句覆盖只要求每条可执行语句至少运行一次,并不保证每个判定的真假结果都执行,更无法直接满足MC/DC。

 

  可以重新打开生成设置,提高覆盖规则集后再生成。别在低覆盖目标下反复增加普通输入值,那样可能多出不少用例,真正缺失的条件组合还是没有补上。

 

  2、源码解析环境与实际构建不一致

 

  头文件路径、宏定义或编译器选项发生变化后,AutoTest使用的代码模型可能已经过期。

 

  ①清理旧的源码分析结果。

 

  ②重新检查工程编译配置。

 

  ③更新条件编译宏。

 

  ④重新解析目标源文件。

 

  ⑤再生成测试脚本。

 

  例如某个分支由宏控制,测试工程没有定义该宏,这段代码在生成阶段就不会进入模型。覆盖报告中看到的源文件和实际发布程序也可能因此对不上。

 

  3、存在不可达或不可满足的路径

 

  部分分支在当前函数入口和数据约束下永远无法成立,或者必须依赖外部状态才能进入。AutoTest无法求出有效输入时,会在生成报告中记录相应警告和测试性问题。

 

  这类情况要结合代码检查。逻辑确实不可达,可以评估是否属于冗余代码;路径应当可达,则要检查输入约束、全局状态或函数调用模拟是否限制得太严。

 

  4、输入数据范围设置不合理

 

  指针、数组、枚举和带范围限制的整数比较容易影响路径求解。输入范围太窄,边界分支进不去;完全不限制复杂指针和对象状态,又可能让生成过程难以得到可执行组合。

 

  可以先查看未覆盖条件需要什么数据,再针对相关参数补充边界值。结构体内部字段、静态数据和全局变量也要一起检查,别只改函数形参。

 

  5、Wrapper返回值挡住了后续分支

 

  外部函数的返回值常常决定被测代码往哪条路径走。如果Wrapper始终返回成功值,异常处理分支就不会执行;始终返回错误值,正常流程又可能被截断。

 

  同一个调用可以建立多个Wrapper实例,让不同测试分别返回成功、失败、超时或边界状态。调用顺序不一致时,还要检查当前用例预期的调用次数是否与实际代码一致。

 

  6、覆盖对象被排除或运行提前结束

 

  覆盖配置可能排除了某些源文件、函数、宏展开代码或运行上下文。测试程序发生异常退出、断言中止或目标通信失败时,后半段覆盖数据也可能没有正常回传。

 

  查看报告时不要只看总百分比,可以逐层打开文件、函数和具体代码项。Cantata能够对覆盖缺口进行定位,并支持在不同测试来源和构建变体之间汇总覆盖数据。

 

  三、覆盖率不足时怎样逐步补齐

 

  找到未覆盖代码后,不建议立刻整套重新生成。先利用生成报告判断属于配置问题、不可达路径还是缺少测试数据,再决定修改现有用例或补充新的AutoTest用例。

 

  1、从生成报告定位原因

 

  ①打开【AutoTest生成报告】。

 

  ②查看未生成路径对应的警告。

 

  ③记录相关函数、条件和数据对象。

 

  ④对照覆盖率视图找到同一位置。

 

  ⑤判断是代码不可达还是测试环境未建立。

 

  生成报告给出的预计覆盖率低于目标时,优先解决其中的测试性警告。预计值正常而执行结果偏低,则回到测试日志中检查失败用例、Wrapper调用和目标运行情况。

 

  2、针对缺口补充最小用例

 

  先修改最接近未覆盖路径的一条用例,调整输入、全局状态或调用返回值。这样比重新生成大量重复用例更容易维护。

 

  自动生成用例完成后仍要进行人工检查。结构覆盖达到100%,只能证明相应代码结构被执行过,不能单独证明业务需求已经得到完整验证。测试内容还要结合需求、异常处理和实际使用场景继续确认。

  总结

 

  “Cantata AutoTest怎么生成测试用例Cantata AutoTest生成的用例覆盖率不足是什么原因”需要从代码模型、覆盖规则、输入数据、调用控制和运行环境几个方面综合判断。自动生成能够快速建立测试基础,但覆盖缺口仍要结合生成报告和代码逻辑逐项处理,才能让用例既达到目标覆盖,也具备稳定的回归价值。希望本文对大家使用Cantata AutoTest生成用例和排查覆盖率不足有所帮助。

135 2431 0251