Coco Test Engine:代码覆盖率分析的新时代

本文翻译自:Coco Test Engine – The New Era of Code Coverage Analysis

原文作者:Qt Group首席软件工程师Sébastien Fricker

审校:Felix Zhang

我们的Coco 7重大更新带来了一个长期以来备受期待的功能——测试数据生成(即Coco Test Engine),这为代码覆盖率分析工具Coco增添了强大的新工具。为此,我们采访了Coco的首席开发者Sébastien Fricker,深入探讨了这次更新及其如何使代码覆盖率分析得到改善。

简而言之,测试数据生成功能通过以下方式简化代码分析流程,使代码质量保障变得更加简单:

  1. 快速达到尽可能高的覆盖率
  2. 在代码覆盖率分析中消除重复
  3. 自动收集包括边缘案例的测试数据

采访Coco的首席开发者Sébastien Fricker

问:你们想通过代码覆盖率分析解决什么问题?  

过去,软件开发者必须自行创建单元测试和测试数据。这本身就是一项艰巨的任务,效果也并非最佳,因为自己创建的数据往往覆盖不到应该测试的所有边缘案例。

比如说,你正在开发一个计算器应用。为了测试它,你可能会为简单的表达式编写单元测试,然后手动输入测试数据:1+2、3*4、3/2、3-2等,来看计算器输出什么结果。

即使是这样简单的案例,以前也需要花费大量手工努力去准备测试案例和进行分析。通常,测试代码可能比实际的产品代码还要庞大。对于一小段源代码,可能需要写一大堆单元测试来达到100%的覆盖率。

这就是为什么开发者通常只关注常规的测试案例(比如典型用法、正常流程、正确数据等),而忽略许多边缘案例(比如错误案例、非法输入、中断的流程等)。举个例子,对于我们的计算器应用,可能会忽略除以零(1/0)、空表达式或不合法的输入(如一个带有多个小数点的数字1.2.3)。

最终,你可能会花费大量时间寻找测试案例来提高对代码质量的信心,但由于在测试中忽略或遗漏了一些案例,最终还是无法实现高覆盖率。由此,功能质量和开发功能所花费的时间之间的权衡也让人难以取舍。

测试数据生成是如何帮助解决这个问题的呢? 

测试数据生成功能正如其名,Coco Test Engine能够自动生成测试数据,有助于提升测试质量,覆盖广泛的边缘或错误案例。通过运行算法,Coco Test Engine能够发现那些通常难以覆盖到的案例,或补充完善现有测试套件。

Coco的测试数据生成通过三种方式简化编写数据驱动的测试:

  1. 将测试代码与测试数据分离。许多测试框架并不支持数据驱动测试,这意味着开发者需要为每个测试数据编写单独的函数。如果支持,测试数据生成和单元测试代码就需要放在同一个文件中,这就要求数据符合C++语法,同时也增加了单元测试代码的体积。
  2. 数据编辑器让在电子表格格式中查看和编辑测试变得简单。
  3. 这一套工具不仅能够帮助发现新的测试案例,还简化了随代码变化更新测试数据和测试者进行数据验证的流程。

“Coco Test Engine让您更有信心地去进行代码重构。你可以专注于常规案例,让Coco覆盖其他所有案例。”

在哪些情况下,测试数据生成特别有用?

比如说,您打算重写一段代码——这种重构工作是常有的事。如果您在没有适当单元测试的情况下进行修改,可能会引入许多问题。

Coco通过测试数据生成自动执行单元测试和验证代码修改。这得益于我们有一份参考代码:被重构的代码本应该是能够正常运行的。因此,测试案例生成便能产生有效的测试数据,用于测试的参考。

这本质上能够让您在重构代码更加得心应手。您只需让它自动产生一套测试,等到覆盖率达到较高水平后,就可以全心修改代码,而让测试引擎自动处理那些需要检测的各种异常数据。

问:哪些行业能从改善的代码覆盖率分析中获得最大的价值?

无论你正在开发的应用或软件多简单,这种方法都是有用的。简单的代码在许多关键系统中起着至关重要的作用,比如医疗设备、航空和汽车等。一般来说,对于安全性要求极高的行业和软件,高代码覆盖率以及测试数据生成功能是必不可少的。

以航空业为例。这个行业有着非常高的标准,某些情况下要求100%的代码覆盖率。如果无法实现,则每一行未覆盖的代码都需要有充分的解释。

将覆盖率从10%提升到11%相对容易,但随着覆盖率的增加,提高到更高水平变得越来越困难。如果从50%提升到51%只需要几分钟,那么达到90%可能需要花费一个小时。当你试图实现100%的覆盖率时,测试所需的时间将呈指数级增加Coco能够帮你更快达到所需的覆盖水平,它利用测试者提供的数据,并通过自动寻找新的测试案例来补充完善。

但仅仅找到测试数据还不够,还需要对数据的质量进行审核。继续以计算器为例,用户可以轻松地提供“4/2”这样的除法输入数据,结果是“2”。通过让Coco发现新的测试,它可能会找到例如“1/0”的除法案例。但这个输出的正确结果是什么呢?是“无限大”?“非法表达式”?还是“错误:除数不可为零”?

输出结果需要符合用户的预期,只有人才能做出这样的决定——应用程序本身无法自行决定。这就是为什么每个测试数据实例都会添加一个验证标志,它允许你标记数据为已审核,而不只是因为它是之前函数调用的输出而默认它就是正确的。

“对于某些产品,将代码覆盖率提高到100%可能需要几个月的时间。Coco让你更快达到所需的覆盖率,并帮助对剩余代码进行解释。”

Coco Test Engine在实际中是如何工作的?

这里有一个流程的简化概述:

A. 使用两个宏编写一小段单元测试代码:

     1. FETCH来获取新的输入数据

     2. CHECK来比较输出和预期结果

B. 编译单元测试

C. 使用数据编辑器创建一些测试案例,并像正常应用程序那样调试它

D. 执行测试探索以找到新案例并提高覆盖率

E. 审查生成的数据,确认输出是否符合预期

在使用Coco的测试数据生成功能时,需要考虑的一点是:初始设置可能需要一些时间,因为你需要验证算法提供的更多测试数据。但随着时间的推移,你会发现它带来的好处绝对远大于投入。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对角线法则的由来

目录 一、前言 二、对角线法则 三、行列式的定义 1. 行列式的定义 2. (全)排列 3. 逆序数 四、由全排列逆序数 到 对角线法则规律 ​编辑 五、参考书目 一、前言 仅限于个人理解,对错没有查证。 二、对角线法则 提起对角线法则,我们更倾向于他是…

Rocky Linux 9.4 部署Zabbix 7.0

文章目录 Zabbix基本概念zabbix介绍zabbix特性zabbix结构 安装Zabbix主机名配置配置Zabbix-Server(1)禁用EPEL提供的Zabbix软件包(2)安装Zabbix Server、Web前端、Agent(3)创建初始数据库(4)Zabbix server配置数据库(5)为Zabbix前端配置PHP(6)启动Zabbix server和agent进程(7)放…

RK3588 代码中导入torch报错

RK3588 代码中导入torch报错 使用RK3588测试官方的YOLOv8,出现下面的问题 发现是dfl函数中导入torch的时候产生的&#xff0c;但是我在python终端上执行导入torch并没有发生报错 Traceback (most recent call last):File "infer.py", line 243, in <module>b…

Linux进程概念(个人笔记)

Linux进程概念 1.冯诺依曼体系结构2.操作系统&#xff08;先描述&#xff0c;再组织&#xff09;3.进程3.1查看进程的方式3.2通过系统调用获取进程标识符3.4查看进程中常见字段状态的指令3.3fork创建子进程3.3.1fork的原理 3.4进程状态3.5进程优先级3.5.1Linux内核的调度队列与…

RK3568技术笔记十二 Android编译方法

Android源码说明 Android源码在SAIL-RK3568开发板光盘->Android->源代码中&#xff0c;由于android源码太大&#xff0c;在进行压缩时&#xff0c;进行分包压缩&#xff0c;因此有4部分&#xff0c;如图所示&#xff1a; 进行解压时&#xff0c;需将4部分压缩包放置同一…

【论文精读】DALLE2: Hierarchical Text-Conditional Image Generation with CLIP Latents

文章目录 一、前言&#xff08;一&#xff09;DALLE2 简介&#xff08;二&#xff09;DALLE2和DALLE的对比&#xff08;三&#xff09;相关模型推出时间 二、文章概要&#xff08;一&#xff09;标题&#xff08;二&#xff09;摘要&#xff08;三&#xff09;引言&#xff08;…

9.华为交换机telnet远程管理配置aaa认证

目的&#xff1a;telnet远程管理设备 LSW1配置 [Huawei]int Vlanif 1 [Huawei-Vlanif1]ip add 1.1.1.1 24 [Huawei-Vlanif1]q [Huawei]user-interface vty 0 4 [Huawei-ui-vty0-4]authentication-mode aaa [Huawei-ui-vty0-4]q [Huawei]aaa [Huawei-aaa]local-user admin pass…

白酒:酒文化的教育价值与实践

酒文化作为中国传统文化的重要组成部分&#xff0c;具有丰富的教育价值。云仓酒庄的豪迈白酒作为酒文化的品牌之一&#xff0c;在传承与发展中不断挖掘和发挥酒文化的教育价值。 首先&#xff0c;豪迈白酒有责任传承丰富的历史文化知识。从酒的起源、酿造技艺、酒器文化到酒礼酒…

java实战——图书管理项目

文章目录 项目所需要的技术栈项目演示项目准备工作环境准备数据库数据准备 前后端交互分析&#xff08;前端代码我们使用现成&#xff09;图书列表界面的创建查看前端发送的请求根据前端接收的返回值来编写model层根据请求编写controller层根据controller编写Service根据Servic…

Linux C语言:指针与数组

一、指针与数组的基本用法 数组指针是指数组在内存中的起始地址&#xff0c;数组元素的地址是指数组元素在内存中的起始地址一维数组的数组名为一维数组的指针&#xff08;起始地址&#xff09; 例如&#xff1a; double x[8]; 因此&#xff0c;x为x数组的起始地址 设指针变…

什么是浏览器指纹

在数字互联网时代&#xff0c;我们的在线活动几乎都会留下痕迹。其中&#xff0c;浏览器指纹就像我们的数字身份证&#xff0c;让网站能够识别和追踪用户。本文将详细介绍浏览器指纹是什么&#xff0c;它如何工作。 一、什么是浏览器指纹 浏览器指纹&#xff08;Browser Fing…

【C语言 || 排序】希尔排序

文章目录 前言1.希尔排序1.1 直接插入排序1.2 直接插入排序的实现1.2.1 直接插入排序的代码实现 1.3 直接插入排序的时间复杂度1.4 希尔排序1.4.1 希尔排序概念1.4.1 希尔排序的代码实现 前言 1.希尔排序 1.1 直接插入排序 在写希尔排序之前&#xff0c;我们需要先了解直接插入…

stable diffusion 局部重绘 reference-only api 接口调试

webUI api payload 插件生成的接口参数不准确&#xff0c;reference-only 的image不是对象&#xff0c;就是不同字符串字段&#xff0c;直接传&#xff0c;不是套image。 综上&#xff0c;那个插件参数不确定&#xff0c;应直接看插件的源码&#xff0c;看它接受什么参数 错误…

Paper Reading: PAMS:通过参数化最大尺度量化超分辨率

PAMS: Quantized Super-Resolution via Parameterized Max Scale PAMS&#xff1a;通过参数化最大尺度量化超分辨率, ECCV 2020 paper: https://arxiv.org/pdf/2011.04212.pdf GitHub: https://github.com/colorjam/PAMS 摘要 深度卷积神经网络&#xff08;DCNNs&#xff09;…

“Photoshop AI插件:StartAI的全面使用攻略

随着人工智能技术的飞速发展&#xff0c;Photoshop作为设计师们不可或缺的工具&#xff0c;也在不断地融入AI技术&#xff0c;以提升设计效率和效果。在2024年&#xff0c;PSAI插件StartAI因其强大的功能和易用性&#xff0c;成为了Photoshop用户的得力帮手。下面来给大家详细介…

CentOS 7x 使用Docker 安装oracle11g完整方法

1.安装docker-ce 安装依赖的软件包 yum install -y yum-utils device-mapper-persistent-data lvm2添加Docker的阿里云yum源 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新软件包索引 yum makecache fast查看docker…

深入浅出 Babel:现代 JavaScript 的编译器

在现代前端开发中&#xff0c;JavaScript 的版本更新速度非常快&#xff0c;新的语法和特性层出不穷。然而&#xff0c;旧版本的浏览器并不总是支持这些新特性。为了确保代码的兼容性和稳定性&#xff0c;我们需要一个工具来将现代 JavaScript 代码转换为旧版本的代码。Babel 就…

信息打点web篇----企业宏观资产打点

前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 专栏描述&#xff1a;因为第一遍过信息收集的时候&#xff0c;没怎么把收集做回事 导致后来在实战中&#xff0c;遭遇资产获取少&#xff0c;可渗透点少的痛苦&#xff0c;如今决定 从头来过&#xff0c;全面全方位…

python安装系列问题

python3.4版本以上安装了python之后自带安装python。 1、换源 以Windows&#xff0c;清华源为例&#xff1a; 直接在user目录中创建一个pip目录&#xff0c;例如&#xff1a;C:\Users\xx\pip&#xff0c;新建文件pip.ini&#xff0c;内容如下: [global] index-url https:/…

C#的Switch语句3(如何为一段代码应用多个case标签)

文章目录 上一篇文章中断函数执行堆叠caseswitch中实用的字符串函数将字符串转换为小写 switch例子 上一篇文章 C#的Switch语句2 中断函数执行 switch语句内部可以使用return语句&#xff0c;这为控制程序流程和函数返回值提供了一种直接的方式。 当在switch语句块中遇到re…