Page 298 - 《软件学报》2021年第6期
P. 298

1872                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         列标识回溯到种子文件,继续根据对应策略生成测试用例完成测试过程;当最终执行输出出现不一致时,该模块
         将记录异常,我们对异常原因进行分析得出报告.
         2.3   评估指标制定
             为了提高种子质量,我们设立了一定的评估指标.由于多数机器人机械臂的开发与运动和坐标系息息相关,
         但无论是运动规划还是坐标系转化都将涉及到数据的可靠性与实用性,基于此,我们制定了数据优化和差值合
         理两个指标.
         2.3.1    数据优化
             测试用例生成模块可以根据测试需求,即 ROS 中的所有消息类型依照策略生成尽可能多的数据对应文件
         作为测试用例;该部分文件的生成多数不考虑数据在实际开发应用过程中的合理性;数据优化指标的制定即为
         测试模块祛除不符合实际应用的数据,如 nan,inf,-inf 等过大或过小的数据,保留有意义的实验数据以此达到数
         据优化的目的.实现过程中,在差异信息比较时插入条件判断,符合该条件的用例才有可能成为能被保留下的高
         质量用例.
         2.3.2    差值合理
             不同程序对数据精度的处理可能存在差异,为了避免这种差异对结果的影响,我们设定差值合理指标;将经
                                                                                             −5
         过差分模糊测试得出的数据差值进行对比,设计条件判断语句,如差异过小则忽略不计,即两者差值小于 10 的
         数据,我们认为不是异常数据;若达到一定差异值则该部分用例符合该评估指标.对于该指标中阈值的设置也是
         所依据的;计算机里面的数字是由二进制保存的,在计算机内部有些数字不能准确的保存,于是就保存了一个最
         靠近的数字.计算机表示浮点数(float 或 double 类型)都有一个精度限制,对于超出了精度限制的浮点数,计算机
         会把它们的精度之外的小数部分截断.Python 3.5 之后,比较两个 float 是否相等不能仅仅依靠全等来判断;
         PEP485 提案中提出可以使用近似相等的方法,传入需要比较的两个数和可以容忍的小值,当他们两者的差值小
                                                     −5
         于容忍值时,就可以认为它们相等,这个容忍值一般为 10 .
             基于上述两个指标,我们进一步定义了差异信息的评估系统.测试后得出的差异数据进行数据评估,同时符
         合两个指标的数据证明其种子质量较高;该部分数据将通过标记序列回溯找到种子文件,并将其按上一模块字
         典保存的格式规则进行保存,此时字典内数据阈值将被更新;种子生成模块将按更新后的阈值范围继续生成测
         试用例,进一步执行测试过程.经过评估后的种子质量将远高于经过初始变异的种子,也将进一步提高实验效率
         以及实验结果的准确性.

         3    整体设计

             在本节我们将主要介绍图 3 中的关键组成部分以及各部分具体都是如何实现的.
         3.1   基础模块
             基础模块是整个模糊过程的初始模块,负责完成对输入的处理及最终测试用例文件的生成,主要由输入处
         理和种子生成两部分组成.
         3.1.1    输入处理
             输入处理分为文件加载及字典转化两个步骤.ROS 在文件的存储及处理上有自己特殊的文件系统级,不同
         功能组件分别放在不同的文件夹中,运行期间会根据实际的需要再将它们重新组织在一起.CLI 接口主要负责
         接收由界面传来的参数,并传递给输入处理过程;数据处理算法如图 4 所示,首先通过加载消息类型导入 ROS
         的.msg 格式消息文件,文件声明了 ROS 消息的各个域,可以用来生成基于不同编程语言的承载消息的源代码.
         接下来创建字典存储函数,将上一步加载进来的参数保存为类型字典;即可以存储消息类型的基本属性,如类型
         是否复杂、是否有父模块、是否是数组类型,如果是,数组大小、数据阈值范围等信息.
   293   294   295   296   297   298   299   300   301   302   303