CoGenTe:代码生成器测试工具

发表于:2020-8-18 13:54

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:佚名    来源:今日头条

  1、引言
  代码生成器在基于模型的复杂软件系统的开发过程中起到至关重要的作用。但是由于建模语言的语法和语义的复杂程度较高,代码生成器在具体实现时往往会产生错误。并且,当建模语言更新换代时(大多数领域特定语言通常是这种情况),与之对应的代码生成器也必须进行相应的更新,以应对建模语言中新产生的、或发生变动的构造。此外,第三方代码生成器的源代码可能无法审查(即可能无法对代码生成器进行白盒测试)。这些因素使代码生成器的测试变得十分困难;代码生成器的严格测试需求变得十分迫切,尤其是当其参与到安全性攸关软件的开发过程中时。
  由CoGenTe生成的测试用例不仅可以检测代码生成器的翻译语法,同时还检查了其复杂的语义的正确性。语法覆盖确保了包含某些语法构造的模型能够被代码生成器所接受。在这种情况下,测试用例将只是一个模型,并不包含有关模型行为的任何信息;相比之下,语义覆盖则可确保模型展示的某些行为得到正确的翻译。在这里,一个测试用例包括一个模型、一组用于驱动模型的输入(使其能够表现出正在被测试的行为),以及从该模型得出的输出,这些输入/输出可用于激发模型和代码生成器对比模型和代码生成器生成的相应程序的行为。模型的输入/输出的集成化生成是CoGenTe的主要创新点。这个主要创新点——与语义覆盖指标一起——成为了将CoGenTe与其他基于语法的测试工具以及一些白盒测试工具区分开来的最主要的不同。
  2、CoGenTe架构
  CoGenTe分为两个部分(参见上图):测试生成器(TG,TestGenerator)和测试线束(TH,TestHarness)。TG是一个通用组件,适用于任意代码生成器,它接受两种输入:(i)使用推理规则表达的建模语言的句法和语义元模型,以及(ii)以覆盖元模型的覆盖指标形式出现的测试规范,并由此生成一个可用于测试面向该语言任何代码生成器的测试套件。TH则封装了代码生成器获取输入和生成输出的具体细节,因此会根据被测代码生成器(CGUT,CodeGeneratorUnderTest)的具体细节定制化产生。由于语义表示为推理规则,因此可以利用这些规则的覆盖范围来表示语义覆盖范围;而代码生成器的行为则表现为根据规则构建的推理树(inferencetree)中的一些模式(patterns)。CoGenTe采用了以下覆盖指标:(i)推理深度,以整型n表示(ii)规则覆盖,以一组规则的形式给出(iii)规则相关性覆盖,以一组规则对的形式给出,以及(iv)行为覆盖,以高级行为模式的形式给出。
  TG由三个组件组成:推理树生成器(ITG,InferenceTreeGenerator),约束生成器(CG,ConstraintGenerator)和约束求解器(ConstraintSolver)。这些组件都以标准ML的形式实现:ITG识别与给定覆盖指标相对应的一组测试目标,并使用IPO算法生成一组能够覆盖这些测试目标的推理树;CG则能够从推理树的规则中提取出边缘条件谓词(side-conditionpredicates);随后,CS将利用这些谓词计算出合理的分配信息,并将这些分配信息应用于构建测试用例。TH将以TG生成的测试套件作为输入:给定一个测试用例,TH首先将模型组织成CGUT的输入格式,随后将输入内容提供给CGUT的可执行文件,调用CGUT生成相应的程序。最后,最终的输出结果将与CoGenTe设置的预期输出进行对比,并记录测试用例的执行状态(成功/失败)。
  3、两个研究案例
  词法分析器生成器(LAG,LexicalAnalyzerGenerator):LAG以正则表达式列表R为输入,输出对应的词法分析器LA。给定一个字符串s,LA将生成与(s的)子字符串相对应的单词(Token)序列T,并且该子字符串应当与R中的正则表达式相匹配。利用对应的语义,CoGenTe生成的测试套件确定了Flex和JFlex中的问题所在,即:关于先行运算符’/’的相关实现存在一些问题。表中显示了Flex2.5.35和JFlex1.4.1的一些测试结果。例如:第5行规定对应于正则表达式列表{b/(a|b),a|b}可以匹配输入字符串ba的子字符串b和a与b?/(a|b)和a|b?。但实际情况是:向Flex和JFlex生成的LA中输入ba时,正则匹配不会终止。
  状态流(SF)模拟器和代码生成器:SF是一种应用广泛的图形化语言,主要用于描述嵌入式控制器设计中的分层状态机。SF模型在响应输入事件时,会执行与其当前状态和变换相关的一系列动作,SF的语义则指定了执行这些动作应该按照什么样的顺序进行。根据既定的语义,由CoGenTe生成的测试套件发现了SF仿真器/代码生成器中存在的两个问题:(i)在V6.2.1版本中,如果s为p的唯一子状态,那么当由于其父状态p的历史结(historyjunction)而重新输入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理论上还可以应用于任何模型处理工具,例如语法检查器、优化器和分析器/验证器等。这一发现为作者未来的工作指明了方向。

  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号