背景技术
自动化测试覆盖率是指在执行自动化测试过程中,每个应用被使用的比例。覆盖率是度量测试完整性的一个手段,是测试有效性的一个度量。现有用于获取覆盖率主要采用Jenkins、EMMA等工具。
Jenkins,之前叫做Hudson,是基于Java开发的一种持续集成工具,用于监控秩序重复的工作,包括:
1、持续的软件版本发布/测试项目。
2、监控外部调用执行的工作。
Jenkins是一个持续集成工具。它可以根据设定持续定期编译,运行相应代码;运行单元测试和集成测试;将运行结果发送至邮件,或展示成报。
Jenkins提供了自动编译,打包功能,通过第三方的静态扫描插件扫描代码规则和质量,然后运行单元测试,邮件发送或展示单元测试和各个阶段的报告。通过配置定时时间,或者在SVN中配置钩子自动触发任务的运行(编译,静态扫描,打包,单元测试,报告)。
EMMA是一个用于检测和报告JAVA代码覆盖率的开源工具。它不但能很好的用于小型项目,很方便地得出覆盖率报告,而且适用于大型企业级别的项目。EMMA是一个开源、面向Java程序测试覆盖率收集和报告工具。它通过对编译后的Java字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率结果进行展示。EMMA所使用的字节码插装不仅保证EMMA不会给源代码带来“脏代码”,还确保EMMA摆脱了源代码的束缚,这一特点使EMMA应用于功能测试成为了可能。
EMMA有许多优点,它支持许多种级别的覆盖率指标:包,类,方法,语句块(basicblock)和行,特别是它能测出某一行是否只是被部分覆盖,如条件语句短路的情况。它能生成text,xml,html等形式的报告,以满足不同的需求,其html报告提供下钻功能,能够从package开始一步步链接到用户所关注的某个方法。EMMA能和Makefile和Ant集成,便于应用于大型项目。特别还需指出的一点是,EMMA的效率很高,这对于大型项目来说很重要。
Emma它通过对编译后的Java字节码文件进行插装,在测试执行过程中收集覆盖率信息,获得测试覆盖率过程中,类、方法等覆盖的百分比报告,可以方便测试人员更好的评估测试。测试人员通过对照覆盖率报告与测试用例设计文档,需求文档可以迅速找到测试的不足。通过与开发人员进行讨论,可以更好的评估测试力度,并指导进一步的测试。因此在功能测试中引入覆盖率信息,能够完善测试结果报告,确保测试质量和力度,保证测试按质、按量地完成。
EMMA是通过向.class文件中插入字节码的方式来跟踪记录被运行代码信息的。EMMA支持两种模式:On the fly和Offline模式。On the fly模式往加载的类中加入字节码,相当于用EMMA实现的application classloader替代原来的application class loader。Offline模式在类被加载前,加入字节码。
On the fly模式比较方便,缺点也比较明显,如它不能为被bootclass loader加载的类生成覆盖率报告,也不能为像J2EE容器那种自己有独特class loader的类生成覆盖率报告。
EMMA也支持两种运行方式:Command line和Ant。命令行一般和Onthe fly模式一起适用,对于简单的项目能够快速产生覆盖率报告。使用Emma进行覆盖率统计的时候存在以下几个缺点:
然而,现有技术并不能很好地获取分布式应用的覆盖率。
对于大型的项目,分布式部署在不同机器上的,不能很方便的收集到该项目下所有应用的覆盖率信息。同时,每次部署程序到不同的路径,每次都需要手工的修改插桩的命令。收集完一次报告之后,若想再一次统计某个时间段的覆盖率信息,第二次统计的信息里面会包含第一次的结果,造成结果不准确。对于企业级多个项目集中式统一迭代部署,统一收集报告的时候中间有很多手工繁琐的操作,不够灵活。特别是,对于自动化测试,现有技术不能方便的和自动化测试,自动部署集成。
发明内容
基于此,有必要针对现有技术不能很好地获取分布式应用的覆盖率的技术问题,提供一种分布式系统中自动化测试覆盖率的测试方法及系统。
一种分布式系统中自动化测试覆盖率的测试方法,包括:
源文件获取步骤,响应于测试启动命令,从预设的与每个应用关联的源代码路径中获取编译每个应用所使用的源文件,多个所述应用部署在不同的设备上;
应用编译步骤,对所述源文件进行编译得到每个应用;
应用部署步骤,根据预设应用配置文件,在与每个应用对应的设备上部署每个应用,所述应用配置文件包括应用与设备的对应关系,以及每个设备的访问标识;
自动化测试启动步骤,触发自动化测试启动命令,以运行关于应用的自动化测试;
报告生成步骤,响应于自动化测试结束命令,根据从所述应用配置文件中所获取的每个设备的访问标识,从每个设备中获取与每个应用相关的单体覆盖率报告,合并所述单体覆盖率报告生成整体覆盖率报告。
一种分布式系统中自动化测试覆盖率的测试系统,包括:
源文件获取模块,用于响应于测试启动命令,从预设的与每个应用关联的源代码路径中获取编译每个应用所使用的源文件,多个所述应用部署在不同的设备上;
应用编译模块,用于对所述源文件进行编译得到每个应用;
应用部署模块,用于根据预设应用配置文件,在与每个应用对应的设备上部署每个应用,所述应用配置文件包括应用与设备的对应关系,以及每个设备的访问标识;
自动化测试启动模块,用于触发自动化测试启动命令,以运行关于应用的自动化测试;
报告生成模块,用于响应于自动化测试结束命令,根据从所述应用配置文件中所获取的每个设备的访问标识,从每个设备中获取与每个应用相关的单体覆盖率报告,合并所述单体覆盖率报告生成整体覆盖率报告。
本发明通过从源代码路径获取源文件,从而自动编译应用,然后将应用部署于对应的设备中,并在执行自动化测试后,从每个设备获取每个应用的覆盖率报告,实现获取分布式系统应用的覆盖率。同时,也与自动化测试很好地整合,使得在自动化测试过程中能实现获取覆盖率报告。
具体实施方式
下面结合附图和具体实施例对本发明做进一步详细的说明。
如图1所示为本发明一种分布式系统中自动化测试覆盖率的测试方法的工作流程图,包括:
步骤S101,响应于测试启动命令,从预设的与每个应用关联的源代码路径中获取编译每个应用所使用的源文件,多个所述应用部署在不同的设备上;
步骤S102,对所述源文件进行编译得到每个应用;
步骤S103,根据预设应用配置文件,在与每个应用对应的设备上部署每个应用,所述应用配置文件包括应用与设备的对应关系,以及每个设备的访问标识;
步骤S104,触发自动化测试启动命令,以运行关于应用的自动化测试;
步骤S105,响应于自动化测试结束命令,根据从所述应用配置文件中所获取的每个设备的访问标识,从每个设备中获取与每个应用相关的单体覆盖率报告,合并所述单体覆盖率报告生成整体覆盖率报告。
步骤S101中,源代码路径可以是SVN(Subvers ion)路径即源代码版本控制系统的源文件路径。用户将源代码保存在源代码路径中供系统自动获取。当获得源代码后,对其进行编译从而生成所需要的应用。
在分布式系统中,一个项目所包括的应用分别部署在不同的设备中。在步骤S103中,根据应用配置文件,确定每个应用所需部署的设备,从而将应用部署的对应的设备上。部署好应用后,在步骤S104中触发自动化测试启动命令,以运行关于应用的自动化测试。在运行的过程中,自动生成关于每个应用的单体覆盖率报告。并在步骤S105中将多个单体覆盖率报告整合成为关于所有应用的整体覆盖率报告。
本发明能够满足分布式系统的覆盖率测试需求,并与自动化测试整合,实现自动化测试的同时获取整体覆盖率报告。
覆盖率报告的生成有多种方式,其中一种方式是采用插桩的方式。程序插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。
在其中一个实施例中,所述步骤S102,还包括:
根据预设的包括至少一个待监测类的监测文件列表,对每个待监测类进行插桩。
本实施例在步骤S102中实现插桩,以对应用进行监测。插桩可以是在编译的同时实现插桩,也可以是在编译结束后进行插桩。具体方式可以采用现有的各种程序插桩技术实现。例如采用emma的emma instr命令,对class进行插桩。
监测文件列表可以是一个配置文件,用于标识需要进行插桩的类作为待监测类,以及被排除不需要插桩的类。
覆盖率报告的生成除了可以采用插桩方式以外,还可以采用监控的方式,例如采用监控方式,其具体方式为:
在设备上启动tomcat,然后在tomcat中启动应用,通过jacoco程序获取每个应用的单体覆盖率报告。
在其中一个实施例中,所述步骤S103,还包括:获取与每个应用关联且为获取覆盖率而设置的配置文件作为测试用配置文件,将测试用配置文件覆盖对应应用所在设备的配置文件。
测试用配置文件是为了获得覆盖率而生成的专门用于测试的配置文件。一般来说,测试用配置文件可以是用于标识该应用所需要访问的数据库或者服务器等相关信息的配置文件。原配置文件所配置的数据库或者服务器等相关信息是用于实际运行应用时所用,然而为了获取覆盖率,其所访问的数据库或者服务器等,可能需要指向对应的测试用数据库或测试用服务器,因此,将原配置文件替换为测试用配置文件。
测试启动命令的生成,可以是用户点击命令按钮或者在命令行中输入命令。然而,为了更好地提高测试效率,还可以是由某些特殊执行所触发。
在其中一个实施例中,还包括:
当所述源文件发生更新,生成所述测试启动命令。
本实施例在用户对源文件进行了更新后,触发生成测试启动命令,从而执行自动化测试并获取覆盖率。
在其中一个实施例中,所述测试启动命令包括项目标识,所述应用配置文件还包括为预设的每个项目标识关联相关应用:
所述步骤S101,具体包括:响应于测试启动命令,从预设的应用配置文件中,获取所述项目标识所关联的应用,作为项目应用,从预设的与每个项目应用关联的源代码路径中获取编译每个项目应用所使用的源文件;
所述步骤S102,具体包括:对所述源文件进行编译得到每个项目应用;
所述步骤S103,具体包括:根据预设应用配置文件,在与每个项目应用对应的设备上部署每个项目应用;
所述步骤S104,具体包括:触发自动化测试启动命令,以运行关于项目应用的自动化测试;
所述步骤S105,具体包括:响应于自动化测试结束命令,根据从所述应用配置文件中所获取的每个设备的访问标识,从每个设备中获取与每个项目应用相关的单体覆盖率报告,合并所述单体覆盖率报告生成整体覆盖率报告。
一个项目包括多个应用,不同的项目所包括的应用也不同。针对不同的项目确定不同的应用及其相应的源文件,从而为该项目专门生成应用并执行自动化测试,从而提高效率,减少资源浪费。
如图2所示为本发明采用插桩方式的一个最佳实施例的工作流程图,采用Emma实现,包括:
步骤S201,基础信息配置。在系统中维护项目和应用之间的对应关系以及应用所在设备的IP和端口信息(即设备的访问标识),并存入数据库,采用对应关系配置,并且在系统上维护好排除和需插桩的文件名称作为监测文件列表,存入数据库。
持续自动执行如下步骤:
步骤S202,自动编译。在Jenkins中配置好分布式系统各个子系统的SVN路径,和账号信息,让其能够通过jenkins自动编译。
步骤S203,自动插桩。在编译后增加触发Shell脚本执行的步骤,Shel l脚本读取数据库中需插桩的文件配置(步骤S201中配置),统一在Jekins服务器上执行emma instr命令对该应用的编译好的class进行插桩。
步骤S204,自动部署。插桩完毕后,执行linux远程拷贝命令,将插桩过后的测试用配置文件拷贝到该应用对应的目录中(步骤S201中配置),并启动应用,测试用配置文件可以预先设置生成。
步骤S205,自动化测试。当分布式系统最后一个应用执行完成S202~S204步骤后,触发自动化脚本运行自动化测试。
步骤S206,收集覆盖率和自动化测试报告。当自动化脚本执行完毕后,(服务器端执行)自动触发远程收集报告的脚本,该脚本读取系统中在步骤S201中配置好的应用IP和端口信息,进行远程收集报告并合并多台机器上的,邮件自动发送覆盖率报告信息。
对于步骤S206,具体包括:
1)从数据库中读取每个应用所在的IP和端口
2)程序控制依次执行emma远程收集报告命令收集每个应用的覆盖率报告,按IP和端口生成.ec文件。一个应用对应一个.ec文件
3)执行emma提供的merge命令,把该项目下的每个应用的.ec文件进行合并,生成最终的项目的.ec文件。
4)利用步骤3)中的合并后.ec文件,执行emma自带的report命令生成项目的覆盖率报告
5)解析测试报告,将报告覆盖率信息插入数据库。
6)触发程序发送自动化测试报告和覆盖率报告。
如图3所示为本发明采用监控方式的一个最佳实施例的工作流程图,采用jacoco实现,包括:
初次使用配置:
步骤S301,jvm监控配置,在每个应用的Tomcat都配置,端口和IP信息;
步骤S302,基础信息配置。在系统中维护项目和应用之间的对应关系以及应用所在设备的IP和端口信息(即设备的访问标识),并存入数据库,采用对应关系配置,并且在系统上维护好排除和需插桩的文件名称作为监测文件列表,存入数据库。
持续自动执行如下步骤:
步骤S303,自动编译。在Jenkins中配置好分布式系统各个子系统的SVN路径,和账号信息,让其能够通过jenkins自动编译。
步骤S304,自动部署。执行linux远程拷贝命令,将插桩过后的测试用配置文件拷贝到该应用对应的目录中(步骤S302中配置),并启动应用,测试用配置文件可以预先设置生成。
步骤S305,自动化测试。当分布式系统最后一个应用执行完成S303~S304步骤后,触发自动化脚本运行自动化测试。
步骤S306,收集覆盖率和自动化测试报告。当自动化脚本执行完毕后,(服务器端执行)自动触发远程收集报告的脚本,该脚本读取系统中在步骤S302中配置好的应用IP和端口信息,进行远程收集报告并合并多台机器上的,邮件自动发送覆盖率报告信息。
如图4所示为本发明一种分布式系统中自动化测试覆盖率的测试系统的结构模块图,包括:
源文件获取模块401,用于响应于测试启动命令,从预设的与每个应用关联的源代码路径中获取编译每个应用所使用的源文件,多个所述应用部署在不同的设备上;
应用编译模块402,用于对所述源文件进行编译得到每个应用;
应用部署模块403,用于根据预设应用配置文件,在与每个应用对应的设备上部署每个应用,所述应用配置文件包括应用与设备的对应关系,以及每个设备的访问标识;
自动化测试启动模块404,用于触发自动化测试启动命令,以运行关于应用的自动化测试;
报告生成模块405,用于响应于自动化测试结束命令,根据从所述应用配置文件中所获取的每个设备的访问标识,从每个设备中获取与每个应用相关的单体覆盖率报告,合并所述单体覆盖率报告生成整体覆盖率报告。
在其中一个实施例中,所述应用编译模块,还用于:
根据预设的包括至少一个待监测类的监测文件列表,对每个待监测类进行插桩。
在其中一个实施例中,所述应用部署模块,还用于:获取与每个应用关联且为获取覆盖率而设置的配置文件作为测试用配置文件,将测试用配置文件覆盖对应应用所在设备的配置文件。
在其中一个实施例中,还包括:
测试启动命令生成模块,用于当所述源文件发生更新,生成所述测试启动命令。
在其中一个实施例中,所述测试启动命令包括项目标识,所述应用配置文件还包括为预设的每个项目标识关联相关应用:
所述源文件获取模块401,具体用于:响应于测试启动命令,从预设的应用配置文件中,获取所述项目标识所关联的应用,作为项目应用,从预设的与每个项目应用关联的源代码路径中获取编译每个项目应用所使用的源文件;
所述应用编译模块402,具体用于:对所述源文件进行编译得到每个项目应用;
所述应用部署模块403,具体用于:根据预设应用配置文件,在与每个项目应用对应的设备上部署每个项目应用;
所述自动化测试启动模块404,具体用于:触发自动化测试启动命令,以运行关于项目应用的自动化测试;
所述报告生成模块405,具体用于:响应于自动化测试结束命令,根据从所述应用配置文件中所获取的每个设备的访问标识,从每个设备中获取与每个项目应用相关的单体覆盖率报告,合并所述单体覆盖率报告生成整体覆盖率报告。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。