语义及代码生成程序_CoGenTe:代码生成器测试工具

CoGenTe 是一个自动黑盒测试工具,专注于测试代码生成器的语义正确性。它采用多种语义覆盖指标生成测试用例,能检测代码生成器如 Flex 和 JFlex 在词法分析器生成,以及 MathWorks 状态流仿真器/代码生成器中的潜在问题。CoGenTe 包含测试生成器和测试线束,后者根据被测代码生成器定制,确保模型行为和代码生成器输出的正确映射。
摘要由CSDN通过智能技术生成
06e11e385b9605f7b1415e9b52344dca.png

摘要

作者在本文中介绍了一款面向代码生成器的自动黑盒测试工具——CoGenTe。代码生成器一般将高级建模语言构造的模型作为输入,经过一系列操作后最终输出可以捕获模型行为的程序。由此可知:代码生成器的输入输出都是具有复杂结构的对象,这些对象不仅具有一定的语法结构,同时还具备相应的执行语义。因此,仅考虑语法结构的传统测试方法并不适用于代码生成器的相关测试。

CoGenTe 结合了多种针对语义的覆盖指标(Coverage Criteria)以满足代码生成器的测试需求。通过结合各种语义覆盖指标,CoGenTe 能够生成具有较高测试潜力的测试用例,这些用例往往能够揭示代码生成器中存在的微小语义错误。目前,CoGenTe 已经发现了一些常用的代码生成器,如(1)面向词法分析器的生成器 Flex 和 JFlex,和(2)与 MathWorks 相关的状态流(SF, State Flow)仿真器/代码生成器中潜在的一些问题。

关键词:自动测试生成;黑盒测试;代码生成器;语义覆盖指标

1 引言

​ 代码生成器在基于模型的复杂软件系统的开发过程中起到至关重要的作用。但是由于建模语言的语法和语义的复杂程度较高,代码生成器在具体实现时往往会产生错误。并且,当建模语言更新换代时(大多数领域特定语言通常是这种情况),与之对应的代码生成器也必须进行相应的更新,以应对建模语言中新产生的、或发生变动的构造。此外,第三方代码生成器的源代码可能无法审查(即可能无法对代码生成器进行白盒测试)。这些因素使代码生成器的测试变得十分困难;代码生成器的严格测试需求变得十分迫切,尤其是当其参与到安全性攸关软件的开发过程中时。

​ 由 CoGenTe 生成的测试用例不仅可以检测代码生成器的翻译语法,同时还检查了其复杂的语义的正确性。语法覆盖确保了包含某些语法构造的模型能够被代码生成器所接受。在这种情况下,测试用例将只是一个模型,并不包含有关模型行为的任何信息;相比之下,语义覆盖则可确保模型展示的某些行为得到正确的翻译。在这里,一个测试用例包括一个模型、一组用于驱动模型的输入(使其能够表现出正在被测试的行为),以及从该模型得出的输出,这些输入/输出可用于激发模型和代码生成器对比模型和代码生成器生成的相应程序的行为。模型的输入/输出的集成化生成是 CoGenTe 的主要创新点。这个主要创新点——与语义覆盖指标一起——成为了将 CoGenTe 与其他基于语法的测试工具以及一些白盒测试工具区分开来的最主要的不同。

2 CoGenTe 架构

d4cceb5a9f37e2ae3c18fec6d440231b.png

CoGenTe 分为两个部分(参见上图):测试生成器(TG, Test Generator)和测试线束(TH, Test Harness)。TG 是一个通用组件,适用于任意代码生成器,它接受两种输入:(i) 使用推理规则表达的建模语言的句法和语义元模型,以及(ii) 以覆盖元模型的覆盖指标形式出现的测试规范,并由此生成一个可用于测试面向该语言任何代码生成器的测试套件。TH 则封装了代码生成器获取输入和生成输出的具体细节,因此会根据被测代码生成器(CGUT, Code Generator Under Test)的具体细节定制化产生。由于语义表示为推理规则,因此可以利用这些规则的覆盖范围来表示语义覆盖范围;而代码生成器的行为则表现为根据规则构建的推理树(inference tree)中的一些模式(patterns)。CoGenTe 采用了以下覆盖指标:(i) 推理深度,以整型 n 表示 (ii) 规则覆盖,以一组规则的形式给出 (iii) 规则相关性覆盖,以一组规则对的形式给出,以及(iv) 行为覆盖,以高级行为模式的形式给出。

TG 由三个组件组成:推理树生成器(ITG, Inference Tree Generator),约束生成器(CG, Constraint Generator)和约束求解器(Constraint Solver)。这些组件都以标准 ML 的形式实现:ITG 识别与给定覆盖指标相对应的一组测试目标,并使用 IPO 算法生成一组能够覆盖这些测试目标的推理树;CG 则能够从推理树的规则中提取出边缘条件谓词(side-condition predicates);随后,CS 将利用这些谓词计算出合理的分配信息,并将这些分配信息应用于构建测试用例。TH 将以 TG 生成的测试套件作为输入:给定一个测试用例,TH 首先将模型组织成 CGUT 的输入格式,随后将输入内容提供给 CGUT 的可执行文件,调用 CGUT 生成相应的程序。最后,最终的输出结果将与 CoGenTe 设置的预期输出进行对比,并记录测试用例的执行状态(成功/失败)。

3 两个研究案例

7babf582a897ee2e4737e40228e0a04c.png

词法分析器生成器(LAG, Lexical Analyzer Generator):LAG 以正则表达式列表 R 为输入,输出对应的词法分析器 LA。给定一个字符串 s,LA 将生成与(s 的)子字符串相对应的单词(Token)序列 T,并且该子字符串应当与 R 中的正则表达式相匹配。利用对应的语义,CoGenTe 生成的测试套件确定了 Flex 和 JFlex 中的问题所在,即:关于先行运算符’/’的相关实现存在一些问题。表中显示了 Flex 2.5.35 和 JFlex 1.4.1 的一些测试结果。 例如:第 5 行规定对应于正则表达式列表{b ∗ /(a | b),a | b ∗}可以匹配输入字符串 ba 的子字符串 b 和 a 与 b ∗ /(a | b)和 a | b ∗。但实际情况是:向 Flex 和 JFlex 生成的 LA 中输入 ba 时,正则匹配不会终止。

b94165ffc4a2f6d1c1c2ad66ee34d8a5.png

状态流(SF)模拟器和代码生成器:SF 是一种应用广泛的图形化语言,主要用于描述嵌入式控制器设计中的分层状态机。SF 模型在响应输入事件时,会执行与其当前状态和变换相关的一系列动作,SF 的语义则指定了执行这些动作应该按照什么样的顺序进行。根据既定的语义,由 CoGenTe 生成的测试套件发现了 SF 仿真器/代码生成器中存在的两个问题:(i)在 V6.2.1 版本中,如果 s 为 p 的唯一子状态,那么当由于其父状态 p 的历史结(history junction)而重新输入 s 时,仿真器将执行默认过渡到状态 s 的条件/变换动作。但实际上:由于历史结点会覆盖默认变换,前面提到的操作并不会被执行。CoGenTe 生成了一个囊括上图模型的测试用例,并检测到了前面提到的错误:输入事件 e1,e2,对应的输出应当为动作序列;但在仿真过程中,该模型实际上将执行动作序列。此错误已在 V7.0 中修复。(ii)仿真器的 V4.0 和 V5.0 版本之间存在着一些语义变化。在 V4.0 中,仿真器可以在变换过程中的所有阶段执行条件/变换动作。因此,如上图中的模型所示:在输入事件 e1,e2 时,仿真器将执行动作序列。而 V5.0 仿真器在执行这个模型时会产生错误,表现为 C2 和 T1 的执行顺序(与“表观图形顺序”相比)发生了混乱。

4 结论

作者在本文中介绍了 CoGenTe——一种用于为基于元模型的代码生成器生成测试的工具。 CoGenTe 结合了作者在代码生成器测试过程中积累的经验教训,是一项具备各种语法和语义覆盖指标的全自动、可扩展的端到端工具。作者注意到:由于 CoGenTe 只需要一种语言的语法和语义的规范(并且与被测工具进行的实际转换操作相独立),因此除用于代码生成器测试之外,CoGenTe 理论上还可以应用于任何模型处理工具,例如语法检查器、优化器和分析器/验证器等。这一发现为作者未来的工作指明了方向。

致谢

本文由南京大学软件学院 2020 级硕士生钱瑞祥翻译转述。

感谢国家重点研发计划(2018YFB1003900)和国家自然科学基金(61832009,61932012)支持!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值