一种Java卡代码覆盖率分析方法和装置制造方法

文档序号:6624908阅读:236来源:国知局
一种Java卡代码覆盖率分析方法和装置制造方法
【专利摘要】本发明提供一种分析Java卡Java代码(含Java卡平台和应用)覆盖率的方法和装置。提供的方法包括:对class文件插入标记覆盖的字节码,其中覆盖标记数据为Native数据存储在JCVM中,在不违背JCVM规范的前提下对Java卡Converter进行调整,卡模拟器运行过程中覆盖标记数据存储了代码的运行情况,测试结束后JCVM按一定格式输出覆盖标记数据,分析class文件并和该数据对应,即可得到覆盖率百分比。提供的系统以Eclipse插件和Ant任务两种形式与用户交互。该方法在Java卡上使用字节码插桩技术,对JCVM的代码和速度影响小,支持不带源码分析,支持语句覆盖和分支覆盖。
【专利说明】一种Java卡代码覆盖率分析方法和装置

【技术领域】
[0001]本发明涉及智能卡领域,具体说明一种Java卡代码覆盖率分析方法和装置。

【背景技术】
[0002]代码覆盖率统计技术包括两大类,一类是通过Java虚拟机对代码运行进行跟踪记录,一类是对源代码或者字节码即class文件进行插桩(Instrumentat1n),在关键位置插入代码或字节码,用于记录是否被运行到(参见附图3)。对class文件插桩的方法无需使用源代码,适用于无法得到源代码的情况。
[0003]目前针对PC上的Java有较多商用和开源代码覆盖率分析工具,而针对Java卡的代码覆盖率分析工具则很少。Java卡针对资源有限的设备,使用Java卡虚拟机,在PC上编译得到的class文件字节码需要通过Java卡Converter转换之后使用。无法直接利用现有的代码覆盖率工具。
[0004]目前国内使用代码覆盖率统计技术中第一类在Java虚拟机中跟踪代码运行的技术对Java卡代码覆盖率工具进行了实现(参见硕士学位论文《JAVA卡代码覆盖率数据源机制的研究与计算》,作者张淋淋,((Java卡代码覆盖率度量技术的研究与实现》,作者赵攀峰),该方案需要在Java卡虚拟机(JCVM)中做大量工作,包括对运行时在每一条指令处做判断,根据CAP包内容对字节码控制流进行分析,将运行记录和类中具体字节码、代码行位置进行对应。JCVM中需要增加较大代码空间,同时JCVM运行时进行字节码分析和判断也会降低执行速度。


【发明内容】

[0005]本发明在Java卡上使用Instrumentat1n代码覆盖率统计技术,在class文件中插入覆盖率统计所需字节码,class插桩和class的解析都可在PC上做,减轻JCVM的代码空间负担,并且插入字节码只在特定位置对覆盖标记数据进行赋值,而不需要在每条指令处进行分析和判断,对速度的影响很小。
[0006]难点在于Java卡虚拟机不在PC上,覆盖标记记录无法在PC上存储,且PC上编译得到的字节码需要Java卡Converter转换后使用,插桩class文件是否能通过Converter的检查和转换,转换后能否在JCVM上正常运行,插桩内容转换后会不会被破坏,以及class文件分析和转换后的覆盖标记记录是否还能正确对应等。
[0007]为实现上述发明目的,本发明采用的技术方案步骤如下:
[0008]a.对Java卡class文件插入覆盖率分析字节码,包括对Native方法进行调用以获得Native覆盖标记数据,每个插桩点在覆盖标记数据相应位置进行标记。由JCVM对覆盖率数据进行存储。
[0009]b.在不违背JCVM规范的前提下对Java卡Converter进行部分调整,使用该Converter对插入字节码后的class文件进行转换。以保证插桩后的class文件能通过Converter检查,并能正常运行和使用。
[0010]C.需要进行覆盖率统计时如运行测试结束后,通知JCVM按一定格式输出各类对应的覆盖率标记数据。
[0011]d.由PC端软件分析插桩前class文件,和步骤c输出的覆盖率标记数据对应,步骤a中的class插桩和此时的解析使用同一套class解析代码,在步骤b的转换过程保证不会丢掉插桩内容,故解析时每个桩的位置可和原class对应上。计算可得到语句覆盖和分支覆盖结果,并通过class中debug信息得到对应源代码每行的覆盖情况。
[0012]本发明采用的技术方案具体操作如下:
[0013]步骤1:对Java源代码进行编译,得到class文件;
[0014]步骤2:对class文件插入覆盖率分析所需字节码;
[0015]步骤3:对插桩后class文件进行Java卡字节码转换,得到JCA文件;
[0016]步骤4:将JCA文件转换得到mask, c文件;
[0017]步骤5:将mask, c文件置于Java卡虚拟机工程中重新编译;
[0018]步骤6 Java卡虚拟机工程运行卡模拟器;
[0019]步骤7:运行要检查测试完备性包含的测试;
[0020]步骤8:通知JCVM输出覆盖率标记数据;
[0021]步骤9:输出覆盖率统计报告。
[0022]在技术方案步骤a中,通过class文件字节码运行控制流分析,在每个指令块(同一块中字节码要么都被执行要么都不被执行)中插桩,在相应位置进行标记,如将布尔数组对应元素置I。插桩位置和内容根据Java卡虚拟机规范限制做调整,插桩实现上需要注意一些细节,如:
[0023]JCVM对〈clinit〉中的字节码有严格限制,故对〈clinit〉方法的插桩做调整。
[0024]JCVM不支持的一些Java特性不能使用,如序列化机制,TRANSIENT关键词等。
[0025]在步骤b中,对Java卡Converter的检查和转换流程进行调整,考虑新插入字节码的影响(根据Java卡版本不同对应虚拟机规范以及Converter不同,实现可能略有变化),如:
[0026]调整Converter中严格的检查,新插入的变量没有对应行号不需要调试信息,故需调整Converter的检查,如将error改为warning。
[0027]Converter中进行指令转换时,会获取class中局部变量表内容计算局部变量的startpc,需调整计算方法,考虑插桩字节码的长度。
[0028]通过以上方案,本发明提供了完整的Java卡的Instrumentat1n覆盖率分析方法,并且在实施例中分别和Eclipse与Ant结合,可极大地方便Java卡开发项目通过代码覆盖率评价测试覆盖程度及检查冗余代码。

【专利附图】

【附图说明】
[0029]图1是根据本发明中Java卡Java代码覆盖率分析方法实现的Eclipse环境下的覆盖率分析系统。
[0030]图2是根据本发明中Java卡Java代码覆盖率分析系统提供的Ant任务编写的build, xml的任务流程,完成从编译到测试到输出覆盖率报告的完整过程。
[0031]图3是本发明使用了的Java代码Instrumentat1n插桩技术,该图来源于((EclEmma on JaCoCo》,Marc R.Hoffmann, 28.03.2012,其中 probearray 在本发明中使用了JCVM中的Native数据。

【具体实施方式】
[0032]以下结合实施例及附图作进一步的详细说明。
[0033]本发明提供一种以Eclipse插件形式和用户交互的覆盖率分析系统,参见图1,包括如下装置:
[0034]装置A:Eclipse插件:提供图形用户界面,包括源代码editor中不同颜色高亮显示是否覆盖,覆盖率View显示覆盖统计百分比等,以及类似于Eclipse中“run”和“debug”的另一种“ Coverage ”工程启动方式。
[0035]装置B:覆盖率分析代理:该系统的核心部分,实现对class的插桩,class文件分析,输出覆盖率统计结果等,并提供覆盖率分析操作的各种Ant任务,如对class文件插桩“instrument”,通知JCVM输出覆盖率数据“ jcexport”,获得覆盖率统计报告“import”。
[0036]装置C JCVM:提供Native方法,存储每个类的覆盖率标记结果于Native数据中,在收到通知消息后按约定格式输出各类对应的覆盖率标记数据。
[0037]装置D:Java卡Converter:将java编译得到的class文件按Java卡虚拟机规范要求转换后提供给Java卡使用,根据覆盖率插入字节码内容对Converter的检查和计算流程做相应调整。
[0038]使用该系统用户在Eclipse上的Java卡代码开发环境下操作即可,操作流程简单,参见图1,包括以下步骤:
[0039]前期准备Java卡开发人员在原有构建过程中加入插桩任务,进行字节码转换,在JCVM中重新编译后得到覆盖率分析插桩之后的Java卡模拟器。将模拟器交由需要进行覆盖率统计的人员进行统计。以下步骤中User step I和User step 2顺序可交换。
[0040]User step 1:将 Java 卡 Java 代码工程以 “Coverage” 方式启动。
[0041]User step 2:运行卡模拟器,对卡模拟器运行测试。
[0042]User step 3:在Eclipse中停止“Coverage”方式运行,或者点击“dump”按钮临时查看当前结果,都可在Eclipse的界面中看到覆盖率分析统计结果,如果有源代码可在Editor中看到每行代码不同颜色显示覆盖、未覆盖、部分覆盖,并且在Coverage View显示覆盖率百分比情况。
[0043]该系统还提供了覆盖率分析操作所需的各Ant任务,用户只需将Java卡代码编译、覆盖率插桩、Converter转换、运行测试、通知输出覆盖率数据、得到覆盖率报告等任务写在build, xml中,可一次Ant执行则完成所有的构建、测试并得到覆盖率报告。参见图2,具体步骤如下:
[0044]步骤21:调用Java提供的Ant任务对Java源代码进行编译,得到class文件。
[0045]步骤22:调用本发明系统提供的Ant任务“ instrument”,对class文件插入覆盖率分析所需字节码。
[0046]步骤23:调用Java卡开发工具套件提供的Ant任务“Convert”,使用本发明修改后的Converter,对插桩后class文件进行Java卡字节码转换,得到JCA文件。
[0047]步骤24:调用Java卡开发工具套件提供的Ant任务“Maskgen”,将JCA文件转换得到mask, c文件。
[0048]步骤25:将mask, c文件置于JCVM工程中进行编译。因C开发IDE如VS Stud1会提供本地命令,Ant可对本地命令进行调用,故可在build, xml中编写调用本地命令的任务。
[0049]步骤26 JCVM工程运行卡模拟器,该步骤类似于步骤25,可在Ant中调用本地命令。
[0050]步骤27:运行要检查测试完备性包含的测试,如JUnit测试,测试工具的测试等,JUnit测试提供了 Ant任务,测试工具测试根据情况可使用其提供的本地命令。
[0051]步骤28:调用本发明系统提供的Ant任务“jcexport”,通知JCVM输出覆盖标记数据。
[0052]步骤29:调用本发明系统提供的Ant任务“r印ort”,输出覆盖率统计报告。
[0053]上述步骤包括了从Java编译、覆盖率分析插桩、Java卡模拟器运行、测试、输出覆盖率报告的全过程,整个过程可在一个Ant流程中完成,用户一次操作即可走完所有步骤得到覆盖率统计报告,可极大地方便项目中进行回归测试并统计覆盖率,在项目的开发阶段和测试阶段都可提高效率。
[0054]从上述两个实施例来看,根据本发明提供的Java卡Java代码覆盖率分析方法实施的系统,可和代码开发环境Eclipse紧密结合,也可使用Ant自动执行所需的各任务,实用性强、灵活性高。
[0055]本发明提供的Java卡Java代码覆盖率分析方法也不只局限于上述两个实施例,可根据本发明提供的方法应用到其它实施例中。因此,任何熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。
【权利要求】
1.一种分析Java卡代码覆盖率的装置,包括Eclipse插件模块、覆盖率分析代理模块、Java卡虚拟机和Java卡转换器,其中: Eclipse插件模块提供图形用户界面; 覆盖率分析代理模块实现对class的插桩,class文件分析,输出覆盖率统计结果,并提供覆盖率分析操作的各种Ant任务; Java卡虚拟机提供Native数据结构,存储每个类的覆盖标记数据于Native数据中,提供Native方法,供插入字节码调用以获得Native数据,在收到通知消息后按约定格式输出各类对应的覆盖标记数据; Java卡转换器将java编译得到的class文件按Java卡虚拟机规范要求转换后提供给Java卡使用,根据覆盖率插入字节码内容对Java卡转换器的检查和计算流程做相应调整。
2.如权利要求1所述的装置,其特征在于具体操作步骤如下: 步骤I):在Eclipse插件模块中对Java源代码进行编译,得到class文件; 步骤2):由覆盖率分析代理模块在class文件中插入覆盖率分析所需字节码; 步骤3):由Java卡转换器对插入覆盖率分析所需字节码后的class文件进行Java卡字节码转换,得到JCA文件; 步骤4):由Java卡转换器将JCA文件转换得到mask, c文件; 步骤5):将mask, c文件置于Java卡虚拟机工程中重新编译; 步骤6) Java卡虚拟机工程运行Java卡模拟器; 步骤7):运行要检查测试完备性包含的测试,可以是任何编程语言在任何测试工具中的测试; 步骤8) =Eclipse插件模块调用覆盖率分析代理模块通知Java卡虚拟机输出覆盖标记数据; 步骤9):由覆盖率分析代理模块分析class文件,和覆盖标记数据相对应,输出覆盖率统计报告。
3.一种分析Java卡Java代码覆盖率的方法,应用于权利要求1所述的装置中,包括以下步骤: a.对Java卡class文件插入覆盖率分析字节码,包括对Native方法的调用以获得Native覆盖标记数据,每个插入点在Native覆盖标记数据相应位置进行标记; b.在不违背Java卡虚拟机规范的前提下对Java卡转换器进行部分调整,使用该转换器对插入覆盖率分析字节码后的class文件进行转换; c.需要进行覆盖率统计时,通知Java卡虚拟机按一定格式输出各类对应的覆盖标记数据; d.分析class文件并和覆盖标记数据对应,计算得到覆盖率百分比,通过class文件中debug信息可得到对应源代码每行的覆盖情况。
4.如权利要求3所述的方法,其特征在于步骤a进一步包括: 1)插入的覆盖率分析字节码通过调用Native方法获得可存储所有插入点标记数据的Native数据结构; 2)通过class文件字节码运行控制流分析,在每个顺序指令块中插入覆盖率分析字节码,将覆盖标记数据相应位置进行标记。 3)插入覆盖率分析字节码范围和内容根据Java卡虚拟机规范限制做调整。
5.如权利要求3所述的方法,其特征在于步骤c中,PC端覆盖率分析工具和Java卡虚拟机工程进行通讯,每次需要获得覆盖率数据时发送消息给Java卡虚拟机,Java卡虚拟机按约定的格式输出各类对应的覆盖标记数据。
6.如权利要求3所述的方法,其特征在于步骤d中,由PC端覆盖率分析工具分析插入覆盖率分析字节码前的class文件,和Java卡虚拟机输出的覆盖率标记数据对应。
【文档编号】G06F11/36GK104375932SQ201410427514
【公开日】2015年2月25日 申请日期:2014年8月27日 优先权日:2014年8月27日
【发明者】巫瑞 申请人:北京中电华大电子设计有限责任公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1