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,一经查实,立即删除!

相关文章

springboot mybatis mysql新增后返回id(ai生成)

在Spring Boot项目中使用MyBatis和MySQL时,若想在插入数据后返回生成的ID,可以在Mapper接口的插入方法上使用Options注解,并设置useGeneratedKeys属性为true,同时指定keyProperty为实体类中对应ID的属性名。 以下是一个简单的示例…

对角线法则的由来

目录 一、前言 二、对角线法则 三、行列式的定义 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)放…

js正则表达式将一个字符串拆分成3个一组,每组添加,

let a123456789.9876543210a.toString().replace(/\B(?(\d{3})(?!\d))/g, ",")//输出结果:123,456,789.9,876,543,210num.toString(): 将数字 num 转换为字符串。 .replace(/\B(?(\d{3})(?!\d))/g, ,): .replace() 是字符串对象的方法,用…

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内核的调度队列与…

Java代码中如何在JSONObject按put顺序排序

编写java代码时&#xff0c;发现在JSONObject 对象中put 一些数据后&#xff0c;输出JSONObject对象信息时&#xff0c;展示的json信息中&#xff0c;排序发生了变化。 以下为部分代码&#xff1a; JSONObject expDataJson new JSONObject();JSONObject expJson new JSONObj…

如何基于Redis实现消息队列

Redis可以用作消息队列的实现方案,有以下几种实现方案: 一 列表(List)作为消息队列 List如何实现消息队列,详情见这篇文章:基于Redis List实现消息队列 二 发布/订阅(Pub/Sub) 发布/订阅是一种消息通信模式,其中消息生产者(发布者)发送消息,而消息消费者(订阅者…

【教师资格证考试综合素质——法律专项】教师法笔记以及练习题

《中华人民共和国教师法》 一&#xff0e;首次颁布&#xff1a;第一部《中华人民共和国教师法》于1993年10月31日由第八届全国人民代表大会常务委员会第四次会议通过&#xff0c;1994年1月1日起执行。 二&#xff0e;历次修改&#xff1a;2009年8月27日第十一届全国人民代表…

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

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

vue实现全屏screenfull-封装组件

1. 安装依赖 npm install --save screenfull 2. 引用 import screenfull from "screenfull" 3.封装fullScreen/index: <template><div><el-tooltip v-if"!content" effect"dark" :content"fullscreenTips" placement&…

【论文精读】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;豪迈白酒有责任传承丰富的历史文化知识。从酒的起源、酿造技艺、酒器文化到酒礼酒…

谷歌邮箱:2024年最全使用指南及技巧

注册谷歌邮箱时遇到麻烦了吗&#xff1f;收件箱乱得让人头疼&#xff0c;找不到提升效率的方法&#xff1f;或者是在处理多个谷歌邮箱账户时感到手忙脚乱&#xff1f; 掌握Gmail邮箱的使用技巧是每个外贸人员都必须学会的&#xff0c;本文将提供一个实用的谷歌邮箱注册和使用指…

java实战——图书管理项目

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

Linux C语言:指针与数组

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

Contrmix:用于半监督医学图像分割的渐进式混合对比学习

paper:Contrmix: Progressive Mixed Contrastive Learning for Semi-Supervised Medical Image Segmentation | IEEE Conference Publication | IEEE Xplore 摘要:虽然医学图像分割已经取得了令人印象深刻的进展,但它通常受到劳动密集型和昂贵的像素级注释的限制。现有的半监…

什么是浏览器指纹

在数字互联网时代&#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;我们需要先了解直接插入…