Java FORmal单元TESt生成外文翻译资料

 2022-11-29 11:39:37

英语原文共 8 页,剩余内容已隐藏,支付完成后下载完整资料


Java FORmal单元TESt生成

Larissa Benteslowast;, Herbert Rochadagger;, Eduardo ValentinDagger;, and Raimundo BarretoDagger;

亚马孙联邦大学计算研究所

Email: lgpbentes@gmail.com

Roraima联邦大学计算机科学系

Email: herbert.rocha@ufrr.br

亚马孙联邦大学计算研究所

Email: {ebv,rbarreto}@icomp.ufam.edu.br

摘要:使用基于计算机的系统在过去几年中在多个领域显着增加,主要是考虑到在短短几年内已经爆发的移动平台上运行的应用程序,因此软件验证和测试现在发挥重要作用确保整体产品质量的作用。在本文中,我们描述了一个工作的初步结果,该工作提出了一种使用ESC / Java2和JCute工具的形式验证技术与TestNG框架进行单元测试来验证Java程序的方法。该方法旨在提取ESC / Java2生成的安全属性,使用TestNG框架和JCute提供的丰富的断言来自动生成测试用例,以验证这些测试用例。值得注意的是,人们普遍认识到,针对移动应用程序的自动化测试技术越来越需要,例如:Android或Java Platform,Micro Edition(Java ME)。另外,一个关键的挑战是系统地生成测试用例。我们在公开的基准测试中显示了我们提出的方法的初步结果,并将结果与公认的工具比较,例如CBMC和JavaPathFinder。实验结果表明,我们提出的方法检测到86.04%的正确结果(即,如果一个性质满足其规范或被违反),而CBMC已经发现79.06%,而JPF已经发现93.02%。

关键词:静态分析,模型检查,单元测试,Java程序,Android,注释。

I.介绍

现在,软件应用需要快速开发,满足高水平的品质。正式验证在确保关键应用程序设计中的可预测性和可靠性方面发挥了重要作用。因此,验证和测试的应用是开发高质量软件不可或缺的技术。然而,测试的准备,执行和管理通常需要高昂的成本。处理这种问题的一种方法是将形式验证技术与测试环境相结合[1]。采用模型检查(例如静态分析)的验证技术已经成为许多年来正式验证中的使用较为广泛的技术[2] - [5]。这种情况也促使软件工程师开始重视应用编译器技术,如:代码转换[5]语义和静态分析[6],[7]

模型检测器采用的验证技术中的主要挑战是如何处理状态空间爆炸问题以及与设计人员更加熟悉的测试环境的缺乏集成。为了解决这些问题,一个可行的解决方案是探索测试用例所生成的安全属性的识别。

安全属性通常被表征为“不会有什么不好的事情发生”[3]。例如,互斥属性是典型的安全属性。以这种方式,可以在运行时通过监视系统执行来检测到是否违反安全属性。这种监视通常以受控的方式进行,同时考虑到系统输入和几个执行路径。

在过去几年中,我们观察到在实施阶段应用形式验证技术的趋势[1],[5],[8] - [10]。也就是说,Java是几个领域最受欢迎的编程语言之一,例如:网站,桌面和移动应用程序。Java为应用程序提供了一个灵活的环境,例如能够在物联网中的嵌入式和移动设备上运行的:微控制器,传感器,手机,个人数字助理(PDA),电视机顶盒,打印机等。Java是面向对象的语言,它能够在编译时和运行时提供检查。Java虚拟机(JVM)使语言二进制代码架构独立,如即时编译等功能在特定环境中提供更好的性能。

在Java应用程序的上下文中,我们将Android作为嵌入式和移动设备的操作系统。Android将Java作为用户空间应用程序的主要开发语言,并拥有用于移动和交互式应用程序的扩展库。Android架构基于事件驱动设计。随着移动设备的高需求,Android设备应用测试变得至关重要,因为质量是Android市场取得成功的关键。

在软件开发过程中引入了针对软件质量保证(SQA)的活动。SQA包括其他任务,如查证和验证,以尽量减少错误和风险。在查证和验证的技术之中,测试是最常用的测试之一。因此,除了使用评估,正式技术和严格规范以及验证等其他活动外,测试是提供软件可靠性证据的要素之一[11]

Java软件验证是一个已经被广泛探索的问题,已经有了为达到这个目的而存在的公共工具[10],[12]。软件验证和测试是开发高质量软件的必不可少的技术,主要是在实时和安全系统的背景下,确保系统的正确行为符合规范。在软件测试中,特别是单元测试中,有必要构建调用函数的驱动程序或存根。

整合正式的程序验证和测试已经被采纳为广泛认可的解决方案来提高软件质量。这种整合旨在减轻这些策略的缺点[13],[14],例如,在软件测试中,需要大量人力才能产生有效的测试用例,结果,微妙的错误很难通过测试来检测,在部署目标软件后会导致重大开销。此工作着重于特定的Java属性,探索对象方向和结构程序属性的概念,并提供自动生成主驱动程序的选项,该驱动程序调用由开发人员注释指示的要测试的类方法。

我们描述了一种使用ESC/Java2[15]和JCute[16]工具集成形式验证技术的方法,并通过TestNG1框架为Java程序实现了单元测试。该方法旨在提取由ESC/Java2生成的安全属性,以使用TestNG框架提供的丰富的声明来自动生成测试用例。另外,我们采用JCute工具来使用符号执行来验证测试用例。所提出的方法是在一个名为JFORTES(Java FORmal unit TESt生成)的工具中实现的。我们展示了我们提出的方法的初步结果,目前正在通过公开的基准测试,并将结果与公认的工具(例如CBMC和JavaPathFinder)进行比较。

在本研究中,起到主要作用的是JFORTES方法,这是Java源代码的模型检查技术和测试工具所进行的验证补充技术,特别是集成静态分析和单元测试。我们主张利用测试框架和形式验证技术之间的集成,使我们能够深入到程序验证中,例如实现更好的代码覆盖。

大纲。在第2节中,我们将介绍安全属性,测试用例生成,ESC/Java和JCute工具。第3节总结相关工作。在第4节中,我们描述了将形式验证技术与Java程序的单元测试相结合的拟议方法。第5节显示实验结果。最后,第6节总结了本文并介绍了未来的作品。

II.背景

本节介绍了安全特性,ESC/Java和JCute,并讨论测试用例生成。

  1. 安全特性

非正式的说,线性时间的安全特性指定系统的允许(或期望的)行为[3]。例如,在软件中不能超出数组上界。如果系统不能满足安全特性,则存在展现此故障的有限执行。因此,检查与安全特性相关的系统的正确性是验证系统行为的一种手段。

定义1:(安全特性)给定一个过渡系统,让成为一套坏的状态,就这样,,如果从初始状态S0到坏状态B的转换系统中没有路径,我们可以说TS相对于B是安全的,用表示。除此以外我们说TS不是安全的,用[3]

B.ESC/Java

ESC/JAVA是一个实验性的编译程序检查程序,它可以发现常见的编程错误[15]。扩展静态检查器(ESC)是“静态的”,因为执行检查而不运行程序和“扩展”以捕获比其他传统静态检查器(如类型检查器)更多的错误。通过使用自动定理证明器和ESC/Java中关于程序语义的原因,静态地警告了现代编程语言在运行时捕获的几个错误(空解引用,数组边界错误,转换类型错误)。它还警告了并发程序中的同步错误(竞争条件,死锁)。程序员可以使用注释语言记录设计决策,如果程序违反了这些设计决策,则会产生警告。静态检查改进了软件开发过程,如果早期检测到错误,纠正成本就会降低。ESC/Java架构由以下数据处理阶段组成:

前端。ESC/Java的前端类似于普通的Java编译器,但是可以从ESC/Java注释和Java源代码中分析任何类型的检查。

翻译。根据Dijkstra的守卫命令[17],将每个要检查的常规本体翻译成简单的语言,其中包括以维护形式生成的命令。

VC发生器。为每个受保护的命令生成验证条件(VC)。

定理证明。对于每个R例程,下一阶段调用自动定理证明器。简单地说,在猜想上:

(1)

其中VCR是R的验证条件,BPT是定义R的类T的类型特定的背景谓词,UBP是通用背景谓词,其编译了一些Java基本语义。

后处理。最后的阶段后期处理定理证明者的产出,当证明者无法证明验证条件时产生警告。

C.JCute

执行单元测试引擎(CUTE)[16]是一种系统和自动测试顺序C程序(包括指针)和并发Java程序的工具。该工具引入了一种竞争翻转技术,用于有效地测试和模拟检查并发程序与数据输入。通过综合测试,JCUTE结合了程序的随机测试和符号测试,为自动生成测试用例提供了可扩展的工具,提高了测试覆盖率,避免了冗余测试用例以及虚假警报。该算法首先生成随机输入和时间表,它指定执行线程的顺序。那么该算法在循环中执行以下操作:它使用生成的输入和进度执行代码。同时,该算法计算各种事件之间的竞争条件以及符号约束。它通过重新排序比赛中涉及的事件或分别解决符号约束来回溯并生成新的计划或新的输入,以使用深度优先搜索策略来探索所有可能的不同的执行路径。该工具由两个主要模块组成:仪表模块和执行符号执行的库,解决约束以及控制线程计划。仪器模块在被测程序中插入代码,以便仪表化程序在运行时调用库执行符号执行。

D.测试用例生成

软件测试是以查找故障为目标执行程序的过程[18]。一个成功的测试是可以确定被测程序失败的测试用例。测试用例包括与根据软件规范的预期处理结果相关联的测试数据的分析。单元测试通常基于一组测试用例编写,以确保代码符合其设计并按预期进行操作。

开发单元测试有很多工具。这样的工具允许软件工程师以更有效和简化的方式创建单元测试,有利于更好的组织和代码重用。在这个意义上,TestNG[19]是Java程序的单元测试框架。TestNG的灵感来源于JUnit和NUnit,但是引入了一些新的功能,使其更强大,更易于使用,例如:一组用于测试逻辑条件的断言;注释;它由各种工具和插件(Eclipse,Maven[20]等)支持。该框架的跟踪(测试用例)的成功或失败,可以在测试运行时被查看完成。每个断言测试单个逻辑条件,如果条件求值为FALSE,则失败。我们在本文中讨论的问题是如何创建用于检查安全属性的测试用例?

因此,我们提出了一种创建,由ESC/JAVA自动生成的安全属性指导的测试用例的方法。在我们的例子中,安全属性是由ESC/JAVA生成的验证条件(VC),如:VCs来检查算术溢出和下溢;VCs检查外界数组索引;风险检查除零;VCs检查类型转换;VC来检查死锁等等。所提出的方法(JFORTES)旨在自动转换由ESC/JAVA识别的每个属性,以便最终获得分析代码的新实例,其中包含直接链接到代码的安全属性的测试用例。

III.相关工作

在技术文献中,有几种工具和方法来生成和验证安全属性作为测试用例。许多研究已经解决了这个问题(例如[8],[12] -[14]),旨在从程序的实现级推断安全属性,然后验证这些安全属性。在下面的部分中,我们描述主要作品。然而,这些作品没有考虑到如何缓解解决者/检测者的局限性,以及如何处理模型检查技术和单元测试框架之间的集成,从而使我们能够深入到程序验证中。

  1. CBMC

C界限模型检查器(CBMC)表明在C程序中违反断言,或证明在给定范围内的断言的安全性。CBMC实现了一个输入程序的精确的翻译,用断言注释,并将循环展开到给定的深度,进入公式。如果公式是可满足的,则违反断言的执行存在[8]

有限的模型检查器,如CBMC减少了关于程序路径到约束的问题。给定一个用断言注释的程序,CBMC输出一个CNF公式,解决方案描述导致断言违规的程序路径。为此,需要以下步骤:

前端:首先,命令行前端根据用户提供的参数配置CBMC。C解析器使用现成的C预处理器,并从预处理源中构建解析树。源文件和行信息保留在注释中。

中级表示:CBMC使用GOTO程序作为中间表示。在这种语言中,所有非线性控制流,如if或switch-statements,循环和跳转,被转换为等效的守卫goto语句。该工具根据解析树中的每个函数生成一个GOTO程序。

中端:符号执行是通过热切地退绕一个固定边界的循环来执行的。CBMC还将GOTO语句转换为静态单赋值(SSA)形式。在该过程结束时,该程序被表示为在保护语句中重命名的程序变量的方程组。

后端:该工具使用SMT(Satisfiability Modulo Theories)求解器作为后端,因此得到的等式被转换为CNF公式。由SAT求解器计算的模型对应于在程序中违反至少一个断言的路径,并将模型转换回一个分配序列,以提供反例。因此,如果公式不能令人满意,则在给定的退绕范围内不能违反断言。

CBMC最近为Java字节码添加了实验支持,在上面执行分析。Java程序被视为类文件。没有任何进一步的选择,检查在程序中创建的所有属性。如果可

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[25790],资料为PDF文档或Word文档,PDF文档可免费转换为Word

您需要先支付 30元 才能查看全部内容!立即支付

课题毕业论文、外文翻译、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。