本文翻译自:Coco Test Engine – The New Era of Code Coverage Analysis
原文作者:Qt Group首席软件工程师Sébastien Fricker 我们的Coco 7重大更新带来了一个长期以来备受期待的功能——测试数据生成(即Coco Test Engine),这为代码覆盖率分析工具Coco增添了强大的新工具。为此,我们采访了Coco的首席开发者Sébastien Fricker,深入探讨了这次更新及其如何使代码覆盖率分析得到改善。 简而言之,测试数据生成功能通过以下方式简化代码分析流程,使代码质量保障变得更加简单: 快速达到尽可能高的覆盖率
在代码覆盖率分析中消除重复
自动收集包括边缘案例的测试数据
介绍Coco Test Engine——概览视频
采访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的测试数据生成通过三种方式简化编写数据驱动的测试: 将测试代码与测试数据分离。许多测试框架并不支持数据驱动测试,这意味着开发者需要为每个测试数据编写单独的函数。如果支持,测试数据生成和单元测试代码就需要放在同一个文件中,这就要求数据符合C++语法,同时也增加了单元测试代码的体积。
数据编辑器让在电子表格格式中查看和编辑测试变得简单。
这一套工具不仅能够帮助发现新的测试案例,还简化了随代码变化更新测试数据和测试者进行数据验证的流程。
“Coco Test Engine让您更有信心地去进行代码重构。你可以专注于常规案例,让Coco覆盖其他所有案例。” 比如说,您打算重写一段代码——这种重构工作是常有的事。如果您在没有适当单元测试的情况下进行修改,可能会引入许多问题。 Coco通过测试数据生成自动执行单元测试和验证代码修改。这得益于我们有一份参考代码:被重构的代码本应该是能够正常运行的。因此,测试案例生成便能产生有效的测试数据,用于测试的参考。 这本质上能够让您在重构代码更加得心应手。您只需让它自动产生一套测试,等到覆盖率达到较高水平后,就可以全心修改代码,而让测试引擎自动处理那些需要检测的各种异常数据。 问:哪些行业能从改善的代码覆盖率分析中获得最大的价值? 无论你正在开发的应用或软件多简单,这种方法都是有用的。简单的代码在许多关键系统中起着至关重要的作用,比如医疗设备、航空和汽车等。一般来说,对于安全性要求极高的行业和软件,高代码覆盖率以及测试数据生成功能是必不可少的。 以航空业为例。这个行业有着非常高的标准,某些情况下要求100%的代码覆盖率。如果无法实现,则每一行未覆盖的代码都需要有充分的解释。 将覆盖率从10%提升到11%相对容易,但随着覆盖率的增加,提高到更高水平变得越来越困难。如果从50%提升到51%只需要几分钟,那么达到90%可能需要花费一个小时。当你试图实现100%的覆盖率时,测试所需的时间将呈指数级增加。Coco能够帮你更快达到所需的覆盖水平,它利用测试者提供的数据,并通过自动寻找新的测试案例来补充完善。 但仅仅找到测试数据还不够,还需要对数据的质量进行审核。继续以计算器为例,用户可以轻松地提供“4/2”这样的除法输入数据,结果是“2”。通过让Coco发现新的测试,它可能会找到例如“1/0”的除法案例。但这个输出的正确结果是什么呢?是“无限大”?“非法表达式”?还是“错误:除数不可为零”? 输出结果需要符合用户的预期,只有人才能做出这样的决定——应用程序本身无法自行决定。这就是为什么每个测试数据实例都会添加一个验证标志,它允许你标记数据为已审核,而不只是因为它是之前函数调用的输出而默认它就是正确的。 “对于某些产品,将代码覆盖率提高到100%可能需要几个月的时间。Coco让你更快达到所需的覆盖率,并帮助对剩余代码进行解释。”
问:Coco Test Engine在实际中是如何工作的? C. 使用数据编辑器创建一些测试案例,并像正常应用程序那样调试它 在使用Coco的测试数据生成功能时,需要考虑的一点是:初始设置可能需要一些时间,因为你需要验证算法提供的更多测试数据。但随着时间的推移,你会发现它带来的好处绝对远大于投入。