鉴源论坛 · 观模丨基于搜索的测试生成

news2024/10/1 19:42:08

作者 | 孙海英 华东师范大学软件工程学院讲师

          苏亭 华东师范大学软件工程学院教授

版块 | 鉴源论坛 · 观模

测试用例自动生成,简称测试生成(Test Generation),是指针对给定的被测对象,例如代码单元、接口、系统等,使用相关算法计算测试用例集合的方法。测试生成的本质是测试设计自动化,无需研发人员参与测试,全部由计算机替代人类完成。测试生成方法与当前在产业界中广泛应用的基于测试框架的自动化测试技术有着本质的差别。后者是测试执行的自动化,还需要依靠研发人员设计测试用例。

从对测试生成问题进行数学建模的角度看,当前主流的测试生成方法可分为基于随机的测试生成、基于符号执行的测试生成、基于搜索的测试生成和基于模型检测的测试生成。基于搜索的测试生成将测试生成问题建模为最优化问题,其核心思想是针对期望达到的测试目标,以相关目标(成本)函数为指引,使用搜索算法在输入域中寻找最优解作为测试用例。

01 概述

基于搜索的测试生成(Search-Based Software Testing, SBST)产生于1976年[1],由于当时测试生成领域关注于基于符号执行的解决方案,因此,在其提出后的十几年里,SBST并未得到重视和发展。直到1990年,研究人员Korel在其发表的论文中,提出SBST可以有效解决当时在符号执行方法中难于处理的复杂数据结构符号化运算的问题[2],SBST才被关注并得以深入研究,应用于各种测试活动中。

02 方法说明

结构测试是面向代码的测试方法之一,被广泛应用于工业实践。其中,分支覆盖是结构测试中最为知名的测试覆盖准则之一。结构测试是最早应用SBST的测试活动,也是产生SBST这一方法的源起点。因其奠基性地位,我们以Korel的SBST方法为切入点,说明SBST的核心思想。

2.1 分支函数

Korel方法以满足分支覆盖为测试生成目标。注意到,代码中产生分支的循环判断条件和选择判断条件等分支谓词可以被转换为符合其逻辑关系的一系列简单的关系表达式:

其中,E1和E2是算术表达式。我们将简单的关系表达式称为分支表达式。为了覆盖分支,可以采用最优化方法计算使得分支表示式判定结果为真时的输入数据。具体地说,结合最优化理论中成本函数的含义可知,以分支覆盖为目标的成本函数如果构造为能够衡量候选输入与期望覆盖分支之间的远近,那么,其中距离最近的输入即为分支表达式的解。基于此,Korel定义了分支函数:

不同形式的分支表达式有不同形式的分支函数,如表1所示。分支函数具有如下特性:

1)当分支函数的值为正值(0如果rel是<)时,分支表达式不成立,该分支的取值为假;

2)当分支函数的值为负值(0如果rel是<=)时,分支表达式成立,该分支的取值为真。

因此,满足分支覆盖的测试生成问题就转为找到使得分支函数值为负值的输入。

表1 Korel定义的分支函数

2.2 测试生成过程

以分支覆盖为测试目标的SBST就是在分支函数指导下,搜索距离期望分支最近的输入数据的过程,基本的搜索过程包含以下步骤:

1)生成被测代码的控制流图;

2)计算满足分支覆盖的路径集合;

3)任选一条期望覆盖的路径;

4)随机生成一组输入数据并执行,记录该输入执行时的路径信息,将路径信息与期望覆盖的路径进行比对,找到两者之间发生偏差的分支,为该分支构造分支表达式;

5)逐一改变输入变量的值进行尝试, 直至找到使得分支表达式的值为负(0如果rel是<=)时的输入,即为所需的测试输入数据;

6)重复3)-5),直到2)中所有路径都被覆盖。

为了说明SBST的主要思想,图1给出了能够覆盖示例代码中某条路径(10-11-12-13)的测试输入的搜索计算过程。需要说明的是,为了清晰简便,示例采用了最基本的直接搜索算法,不包含对搜索过程的优化方法,也不包含计算测试预期结果(Test Oracle)的方法。现代的SBST方法采用的搜索优化算法和成本函数远先进和复杂于示例中的方法。

图1 计算覆盖期望路径的测试输入数据示例

03 主流方法

搜索最优解的算法和成本函数的构造是SBST的核心技术。常用的搜索最优解的算法有爬山算法、模拟退火算法和遗传算法。爬山算法、模拟退火属于局部搜索策略,因为这两种方法每次只考虑一个答案,且只在答案的受限毗邻区附近移动,遗传算法则属于全局搜索,同时考察搜索域中多个样本点,是当前SBST的主流。图3给出了基于遗传算法的SBST的主要流程。

图2 基于遗传算法的SBST主要流程

基于遗传算法的SBST首先使用随机方法产生第一代群体,接着对该群体中的个体进行适应性评估,根据选择策略从中挑选出优质个体集合作为亲代用以产生下一代群体。随后,在对亲代进行交叉、变异和重新组合后产生了继承亲代优良基因的子代。之后,子代进入适应性评估,重复上述行为,直至找到最优解或者资源耗尽。在该过程中,用于评估候选者,引导搜索进入有前景的搜索域的适应度函数(fitness function)是关键技术。

适应度函数具有问题相关性。不同的问题需要定义不同的适应度函数。例如,在最坏执行时间测试时,适应度函数被定义为系统执行时间;在自动泊车控制系统中,适应度函数定义为泊车期间,车辆与某个碰撞点之间的最短距离。在结构测试时,适应度函数常被定义为满足期望的覆盖准则,例如分支覆盖[3]。当前被广泛使用的以满足分支覆盖为目的的适应度函数由研究人员Wegener提出[4]。该适应度函数有两个数值指标,一是接近层级(Approach Level),另一个是分支距离(Branch Distance)。接近层级是指没有被给出的输入执行路径覆盖的与目标点相关的控制节点数量。与目标点越接近,接近层级越低。分支距离用于衡量输入执行期望分支的邻近程度,采用了改进的分支函数定义[5]。最终的适应度值是将分支距离归一化并加上接近层级的结果。分支距离的归一化方法有多种,研究人员Arcuri评估和讨论了这些方法对搜索算法的影响[6]。

04 主要挑战

环境交互问题是面向代码的SBST面临的主要困难之一[3][7]。该问题涉及代码中包含与操作系统、文件系统、网络系统、数据库系统的相关交互。环境交互问题通常采用测试替身的方案[8][9]。但是,由于代码重构和使用测试替身后会存在测试代码执行了被测代码实际不可能执行的路径等情况,因而会产生误报。对于误报目前并没有彻底的解决方案,只存在缓解的方法,一是规避导致误报的原因,二是只在必要的时候使用测试替身技术[9]。

参考文献:

[1] W. Miller and D. Spooner, “Automatic generation of floatingpoint test data,” IEEE Transactions on Software Engineering, vol. 2, no. 3, pp. 223–226, 1976.

[2] B. Korel, “Automated software test data generation,” IEEE Transactions on Software Engineering, vol. 16, no. 8, pp. 870–879, 1990.

[3] Phil McMinn. Search-Based Software Testing: Past, Present and Future. Proceedings - 4th IEEE International Conference on Software Testing, Verification, and Validation Workshops, 153 – 163, 2011.

[4] J. Wegener, A. Baresel, and H. Sthamer, “Evolutionary test environment for automatic structural testing,” Information and Software Technology, vol. 43, no. 14, pp. 841–854, 2001.

[5] N. Tracey, J. Clark, K. Mander, and J. McDermid, “An automated framework for structural test-data generation,” in Proceedings of the International Conference on Automated Software Engineering. Hawaii, USA: IEEE Computer Society Press, 1998, pp. 285–288.

[6] A. Arcuri, “It does matter how you normalise the branch distance in search based software testing,” in Proceedings of the International Conference on Software Testing, Verification and Validation. IEEE, to appear, 2010.

[7] A. Panichella, "Beyond Unit-Testing in Search-Based Test Case Generation: Challenges and Opportunities," 2019 IEEE/ACM 12th International Workshop on Search-Based Software Testing (SBST), pp. 7-8, 2019.

[8] A. Arcuri, G. Fraser, and J. P. Galeotti. Automated unit test generation for classes with environment dependencies. In IEEE/ACM International Conference on Automated Software Engineering (ASE), pages 79–90, 2014.

[9] A. Arcuri, G. Fraser and R. Just, "Private API Access and Functional Mocking in Automated Unit Test Generation," 2017 IEEE International Conference on Software Testing, Verification and Validation (ICST), pp. 126-137, 2017.

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

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

相关文章

[附源码]Python计算机毕业设计Django防疫物资捐赠

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;我…

Spring MVC 中的分页 RESTful API 响应

分页允许您将来自Spring MVC的大型RESTful API响应拆分为称为页面的较小块。在这篇文章中&#xff0c;让我们看看如何使用Spring MVC和Spring JPA对来自Spring boot应用程序的JSON响应进行分页。 Spring MVC 中的分页和排序 如前所述&#xff0c;我们可以使用spring 数据 JPA…

急诊预检分诊管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&a…

webpack之性能优化

今天先来看两种性能优化的方式&#xff1a; 第一&#xff1a;抽离css代码并压缩 在没有配置之前&#xff0c;css是一起被打包到js文件里面的&#xff0c;像这样子 因此我们需要将css文件单独抽离出来 npm i mini-css-extract-plugin -D我们是需要在打包的时候去抽离它&#x…

LotuS2:新一代扩增子数据分析神器(更快、更准、更稳定)

一、研究背景 扩增子测序是分析微生物组成熟且成本较低的方法。然而&#xff0c;扩增子数据处理需要生物信息学技能和高计算能力来处理大数据集。此外&#xff0c;只有小部分工具适用于长读长扩增子数据分析。2022年10月Microbiome发表了一种新的扩增子数据处理神器——LotuS2…

0113 链表Day2

剑指 Offer 06. 从尾到头打印链表 输入一个链表的头节点&#xff0c;从尾到头反过来返回每个节点的值&#xff08;用数组返回&#xff09;。 示例 1 输入&#xff1a;head [1,3,2] 输出&#xff1a;[2,3,1] /*** Definition for singly-linked list.* public class ListN…

通过源码来理解Cglib与JDK动态代理

最近在阅读到了Spring源码对于两种动态代理使用在不同场景下的使用&#xff0c;两种方式各有利弊写一篇文加深自己的认识。文中对于源码的涉及较少&#xff0c;更多的是作者自己的理解和举例&#xff0c;然后通过部分源码验证。 首先看两个面试经常会遇到的关于Spring的问题&a…

纳尼?华为首席架构师只用434页笔记,就将网络协议给拿下了

不管是前端还是后端&#xff0c;几乎所有的程序运行都会涉及到网络协议。10 个程序员里面&#xff0c;10 个都说自己学过网络协议&#xff0c;9 个说自己懂网络协议。但真正面试的时候&#xff0c;能回答出相关问题的&#xff0c;可能只有两三个。 金九银十跳槽热季&#xff0…

七、【React-Router6】路由传参 之 search

文章目录1、routes.js2、Message.jsx3、Detail.jsx4、Result5、另外一个可以获取 search 的新 Hook &#xff1a;useLocation项目修改自 上一节 的 Demo 1、routes.js import { Navigate } from react-router-dom import About from ../components/About import Home from ../…

【D3.js】1.18-给 D3 标签添加样式

title: 【D3.js】1.18-给 D3 标签添加样式 date: 2022-12-02 14:44 tags: [JavaScript,CSS,HTML,D3.js,SVG] 标签也可以添加样式。 一、学习目标 如何设置字体大小&#xff1f; .attr(“font-size”,25) 如何填充颜色&#xff1f; .attr(“fill”,“red”) 二、题目 将 text 元…

LeetCode简单题之不同的平均值数目

题目 给你一个下标从 0 开始长度为 偶数 的整数数组 nums 。 只要 nums 不是 空数组&#xff0c;你就重复执行以下步骤&#xff1a; 找到 nums 中的最小值&#xff0c;并删除它。 找到 nums 中的最大值&#xff0c;并删除它。 计算删除两数的平均值。 两数 a 和 b 的 平均值…

[操作系统笔记]连续分配管理方式

内容系听课复习所做笔记&#xff0c;图例多来自课程截图 连续分配管理方式 连续分配&#xff1a;指为用户进程分配的必须是一个连续的内存空间 相应地&#xff0c;非连续分配可以是离散的 对于固定分区分配&#xff0c;需要有一个分区说明表&#xff0c;类似下表&#xff1a; …

【jmeter录制浏览器上特定的单个请求】

目录准备工作jmeter代理设置设置postman代理复制浏览器是特定的url背景&#xff1a;想要对浏览器某一个请求做测试&#xff0c;直接手动输入到jmeter不切实际&#xff0c;一般是使用jmeter代理的方式录制下来&#xff0c;但会有个问题&#xff0c;一般浏览器加载许多其他请求&a…

在虚拟机中安装Linux操作系统详细步骤

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 在虚拟机中安装Linux操作系统详细步骤专栏&#xff1a;《Linux从小白到大神》| 系统学习Linux开发、VI…

达梦数据库表空间误删恢复实操

达梦数据库表空间误删恢复实操1.表空间失效文件检查2.表空间失效文件恢复准备3.表空间失效文件恢复4.表空间失效文件恢复实操1.表空间失效文件检查 表空间恢复失效文件的检查。 语法格式 SP_FILE_SYS_CHECK ();语句功能 在 LINUX 操作系统下&#xff0c;检查是否有数据文件被…

一个已经存在10年,却被严重低估的 Python 库

今天介绍的是一个已经存在十年&#xff0c;但是依旧不红的库 decorator&#xff0c;好像很少有人知道他的存在一样。 这个库可以帮你做什么呢 &#xff1f; 其实很简单&#xff0c;就是可以帮你更方便地写python装饰器代码&#xff0c;更重要的是&#xff0c;它让 Python 中被…

代码随想录刷题Day52 | 300. 最长递增子序列 | 674. 最长连续递增序列 | 718. 最长重复子数组

代码随想录刷题Day52 | 300. 最长递增子序列 | 674. 最长连续递增序列 | 718. 最长重复子数组 300. 最长递增子序列 题目&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或…

2022年NPDP新版教材知识集锦--【第四章节】(6)

《产品经理认证(NPDP)知识体系指南(第2版)》已于2022年4月正式上架发行&#xff0c;新版教材自2022年11月NPDP考试起使用。将新版NPDP教材中的相关知识点进行了整理汇总&#xff0c;包括详细设计与规格阶段相关内容&#xff0c;快来看看吧。 【制造与装配阶段】(全部获取文末) …

SAP-ABAP-企业微信:ZCSM37-后台JOB异常检查主动推送企业微信群

场景&#xff1a;异常JOB主动推送企业微信群 &#xff08;企业微信机器人可百度创建&#xff0c;注意群不能有企业外的人员&#xff0c;否则接口无效&#xff09; 事务代码&#xff1a;ZSM37_CHECK程序名称&#xff1a;ZSM37_CHECK程序目的&#xff1a; ZCSM37-后台JOB异常检…

Java+JSP+MySQL基于SSM的物流公司物流订单管理系统-计算机毕业设计

项目介绍 随着我国经济的高速增长&#xff0c;物流快递的数量也在不断的增加&#xff0c;同时面临的就是如何更加方便快捷和高效的管理物流订单的问题&#xff0c;传统模式的物流订单管理模式明显已经不能够满足当下的需求&#xff0c;于是我们提出了基于B/S的贴心物流公司物流…