具体实施方式
以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
在本文中使用的术语“包括”及其变形表示开放性包括,即“包括但不限于”。除非特别申明,术语“或”表示“和/或”。术语“基于”表示“至少部分地基于”。术语“一个示例实施例”和“一个实施例”表示“至少一个示例实施例”。术语“另一实施例”表示“至少一个另外的实施例”。术语“第一”、“第二”等等可以指代不同的或相同的对象。下文还可能包括其他明确的和隐含的定义。
如上所述,目前,Cucumber只能为相应的测试生成Json、Html等格式的测试报告,然而这种测试报告均是可编辑的,不具有防篡改的特性,容易造成报告造假的情形。另外,这样的测试报告的显示样式也非常单一,无法根据用户需求定义所需要的章节、颜色和输出顺序等,因此也无法对不同的部分以不同的格式来进行显示,从而造成测试人员基于这样的测试报告来检查数据的用户体验较差,效率较低。此外,这样的测试报告通常包含大量的数据,大小通常可达到几兆到几十兆,因此在例如批量执行时,例如仅作为示例在将测试报告从测试执行机器传输到测试管理工具时、在测试管理工具处保存测试报告时、以及将测试报告从测试管理工具发送给测试人员时,相应的传输效率和存储效率都非常低,无法很好地满足测试人员所需的传输和存储需求。
为了至少部分地解决上述问题以及其他潜在问题中的一个或者多个,本公开的示例实施例提出了一种用于为软件测试结果生成PDF报告的方法,包括:为待生成的PDF报告获取格式模板文件,以便将所述格式模板文件转换为第一Java对象,所述格式模板文件定义了所述PDF报告的多个部分的显示格式,并且所述格式模板文件是可配置的;获取关于被测软件系统的Json测试报告,以便将所述Json测试报告转换为多个第二Java对象;根据所述多个第二Java对象之间的层级关系,按照从上级到下级的顺序分别运行所述多个第二Java对象,以便确定是否在相应的第二Java对象中读取到感兴趣的关键字段;响应于在所述相应的第二Java对象中读取到感兴趣的关键字段,在所述相应的第二Java对象中提取与所述关键字段相关联的一个或多个数据;以及基于所述第一Java对象,将所提取的数据以相应的格式渲染到PDF报告中的相应位置。以此方式,能够为被测文件生成按需定制的、不可篡改的测试报告,进而能够提高测试报告传输效率和存储效率方面的性能,而且这种测试报告的可读性更好,用户更友好,因此用户体验也更高。
图1示出了用于实现根据本发明的实施例的用于为软件测试结果生成PDF报告的示例系统100的示意图。在如图1中所示的示例中,系统100包括自动化测试设备110和服务器120。自动化测试设备110和服务器120可以通过网络130(例如,因特网)进行数据交互。在本公开中,自动化测试设备110用于使用Cucumber测试工具对被测软件系统进行测试,服务器120用于为该被测软件系统的测试结果生成PDF报告,自动化测试设备110和服务器120均可由诸如台式计算机、膝上型计算机、平板电脑、笔记本电脑之类的计算设备实现。在如图1所示的实施例中,服务器120可经由网络130与自动化测试设备110进行通信,以从自动化测试设备获取关于被测软件系统的Json测试报告。在一些实施例中,自动化测试设备110和服务器120也可在同一计算设备上实现。服务器120可以包括一个或多个处理器1201以及与该至少一个处理器1201耦合的一个或多个存储器1202,存储器1202中存储有可由该一个或多个处理器1201执行的指令,该指令在被该一个或多个处理器1201执行时执行如下所述的方法400。注意,在本文中,自动化测试设备110可以是服务器120的一部分或者也可以独立于服务器120。自动化测试设备110或服务器120的具体结构例如可以如下结合图6所述。
图2示出了根据本公开的实施例的示例性Json测试报告中所包括的关键字段之间的层级关系的示意图。
使用Cucumber测试工具对被测软件系统进行测试所生成的Json测试报告通常包括多个关键字段,这些关键字段按照一定层级关系组成该Json测试报告。如图2所示,每个Json测试报告可包括一个或多个Feature(功能),每一个Feature用于描述Json测试报告中的一个测试用例(case)。每一个Feature可包括多个Element(要素),每一个Element的类型(Type)可以是Background(背景)或Scenario(场景),这些Element均用于描述对被测软件系统的测试行为,其中类型为Background的Element用于描述要在所有Scenario中重复发生的步骤,但是这些步骤对于描述各个场景而言并不是必需的,因为它们是附带的细节。每一个Scenario中可包括多个Step(步骤),每个步骤用于描述对被测软件系统的测试操作。每一个Step可包括Result(结果),其用于通过Status(状态)描述该步骤的执行结果是成功(pass)还是失败(failure),通过errorMsg(错误消息)描述在其执行过程中收到的错误消息,并通过duration(持续时间)来描述从开始执行该步骤到得到该执行结果的时长。每一个Step还可包括多个Row(行),用于描述该步骤的可变输入参数,以及每行中单元格(Cell)内容。每一个Step还可包括Output(输出),用于描述执行该步骤后需要输出的内容,输出系统会判断该输出的内容是以表格的格式还是单元格格式输出。每一个Step还可包括多个Comment(注释),其用于描述测试人员编写测试案例时针对相应的Scenario所作的注释。另外,每一个Feature、Element和Step还都包括一些公共字段(本系统抽象为Baseinfo),例如Keyword(关键词)、Name(名称)、Description(描述)、多个Tag(标签)等,其分别用于描述当前字段的关键词、标题、作用和标签等为何,例如在该字段为Feature时,该关键词就是Feature,当该字段为Scenario时,该关键词就是Scenario。每一个Element还可包括After(测试步骤后相关操作),其用于描述需要在每个Scenario之后执行的操作,After可包括Match,其用于描述执行结果中与期望不匹配的内容,并且Match可包括多个Argument(参数),以描述输出的哪些测试结果不匹配。
在Json测试报告中,以上提到的一个或多个字段的内容可以为空,这取决于具体的测试内容。
Json测试报告可被转换为多个Java对象,每一Java对象均与一个相应的测试案例相关联,并且这些Java对象之间根据Cucumber的输出格式标准,定义了层级关系。例如,可将图2所示的Json测试报告转换为以下多个java对象:Feature.java、Elements.java、Steps.java、After.java、Match.java、Result.java、Output.java、Rows.java、Comments.java、Arguments.java、Cells.java等,但Feature.java作为所有对象的最外层,包含其他子对象。
为了便于更好地理解以上内容,如图3A和3B所示,分别提供了Json测试报告中关于Feature和Scenario的示例。在图3A所示的示例中,通过基本信息中的keyword可知该字段是对Feature的描述,该feature的名称(name)为“Start FIX proxy(启动Fix代理服务)”,其description(描述)为空,id为“start-fix-proxy”,uri为“features/logon/logon.feature”,该feature包括类型为“Background”的element,该background的名称(name)为空,description(描述)也为空,并且该background包括step,该step的关键词为“*”,名称为“Run FIX proxy in background with…(静默运行FIX代理服务)”,将关键字与name中提取内容作为一个Step的具体描述输出到PDF中,该step具有output。
在图3B所示的示例中,通过基本信息中的keyword可知该字段是对类型(type)为Scenario(场景)的要素的描述,该Scenario的名称(name)为“Logon(登录)”,其description(描述)为“Logon order entry & drop copy session(登录命令输入和删除复制会话)”、id为“Start fix proxy; logon(启动fix代理;登录)”,该Scenario包括两个标签,其名称分别为“@CASE=Logon001”和“@=FIX”,为了区分测试ID,系统设计@CASE=作为设置测试ID的方法,@=为其他Tag,Tag支持多个。setting file ./features/hkex.cfg(使用设置文件./features/hkex.cfg运行FIX代理)”的步骤(step),该步骤包括match(匹配),并且该match包括argument。
在本公开中,由于Json测试报告的这种组织结构,在生成相应的PDF报告时可有利地利用这种结构来根据需要提取所需的数据。
图4示出了根据本公开的实施例的用于为软件测试结果生成PDF报告的方法400的流程图。方法400可由如图1所示的服务器120执行,也可以在图6所示的电子设备600处执行。应当理解的是,方法400还可以包括未示出的附加框和/或可以省略所示出的框,本公开的范围在此方面不受限制。
在步骤402,为待生成的PDF报告获取格式模板文件,以便将该格式模板文件转换为第一Java对象。
在本公开中,该格式模板文件可定义待生成的PDF报告的多个部分的显示格式,例如该格式模板文件可定义该PDF报告中需要包括的各个页面(包括封面页和目录页)的页面布局、页面中每一章节的布局、所包括的各个表格的显示格式、单元格的显示格式等等。关于各个页面的页面布局的定义可包括对该页面的尺寸大小、页边距、页眉页脚、纸张方向等的定义。关于页面中每一章节的布局的定义可包括关于该章节的标题的格式、该章节中包括的文字或段落的对齐方式(例如,为水平对齐还是垂直对齐等)、字体、字体颜色、背景颜色、是否采用边框以及边框宽度等的定义。关于各个表格的显示格式的定义可包括关于各个表格的行、表头、表格内容、高亮以及无需显示的字段等的定义。关于单元格的显示格式的定义可包括各单元格的对齐方式、边框样式、是否缩进等方面的定义。在本公开中,格式模板文件还可定义PDF报告需要对相应的Json报告中的哪些章节进行显示以及哪些章节不进行显示。
在本公开中,为了便于使用,可预先建立多个通用的格式模板文件以供进行选择。例如,这些通用的格式模板文件可包括但不限于:打印完整的测试用例以及测试结果的第一通用格式模板文件,仅打印测试用例但不打印测试结果的第二通用格式模板文件,打印测试用例和测试结果的简要内容的第三通用格式模板文件,以报表模式打印测试用例和测试结果中的概要内容的第四通用格式模板文件等。在需要生成PDF报告时,可根据实际的需求从这些通用的格式模板文件中进行选择。例如仅作为示例,可根据需要该PDF报告的查看用户的身份来进行选择,例如对于测试人员可选择第一通用格式模板文件,对于管理人员可以选择第四通用格式模板文件。
此外,在本公开中,格式模板文件是可配置的,例如可根据实际使用的需求对该格式模板文件中定义相关的格式进行修改,以便得到更好的用户体验。
由于XML文件具有易读,强格式校验等特点,因此在本公开中,可将格式模板文件设计为采用XML格式。在设计格式模板文件时,可使用XSD文件根据业务逻辑为该XML格式模板文件定义一套schema,通过此种方法,在有新的需求时,可以灵活的更改XSD文件定义,并能自动生成对应的Java对象文件。并且,可以使用该XSD文件对格式模板文件进行强制验证。
在一些实施例中,可例如使用Jaxb将步骤402中获取的格式模板文件转换为第一Java对象。
在步骤404,获取关于被测软件系统的Json测试报告,以便将该Json测试报告转换为多个第二Java对象。
在本公开中,Json测试报告为使用Cucumber测试工具对被测软件系统进行测试所生成的报告。被测软件系统可以是web应用、桌面应用、移动应用或应用程序接口交易相关系统等。
在一些实施例中,可使用fastjson将Json测试报告转换为多个第二Java对象,第二Java对象可包括前面针对图2的讨论中提到的那些Java对象。
应了解,使用Cucumber测试工具所生成的Json测试报告通常包括一个或多个测试用例(通常是包括多个测试用例),如前所述,Json测试报告中的一个Feature对应于一个测试用例,并且该Json测试报告还可包括与每一个测试用例相对应的测试结果,因此其包含了大量的数据。通常,一个Json测试报告通常可达到几兆到几十兆。因此,在本公开中,可将Json测试报告以测试用例为单位分批加载到内存中,并将加载到内存中的测试用例转换为多个相应的第二Java对象。也就是说,在本公开中,可先将Json测试报告中的第一测试用例加载到内存中,以将该第一测试用例转换为多个相应的第二Java对象,并基于这些第二Java对象提取所需的数据形成PDF报告与第一测试用例相对应的部分的内容,然后再将该Json测试报告中的第二测试用例加载到内存中,以将该第二测试用例转换为多个相应的第二Java对象,并基于这些第二Java对象提取所需的数据形成PDF报告与第二测试用例相对应的部分的内容,并以此类推直到完成整个PDF报告的渲染。
通过这种方法,可防止内存过高使用,并且可以避免由于将Json测试报告全部加载到内存中可能引起的内存泄露的问题。
在步骤406,根据多个第二Java对象之间的层级关系,按照从上级到下级的顺序分别运行多个第二Java对象(即,在步骤404中得到的多个第二Java对象),以便确定是否在相应的第二Java对象中读取到感兴趣的关键字段。
例如仅作为示例,感兴趣的关键字段可包括以下中的一个或多个:与当前测试用例(即当前加载到内存中执行的测试用例)的一级标题相关联的关键字段、与当前测试用例的一个或多个二级标题相关联的关键字段、与当前测试用例中的截图相关联的关键字段、与当前测试用例中的交易消息相关联的关键字段、与当前测试用例中的自定义表格相关联的关键字段、与当前测试用例中的局部高亮处理相关联的关键字段、与当前测试用例的测试结果相关联的关键字段等等。这里提到的交易消息可以是金融信息交互协议消息(Financial Information eXchange message, 此后简称为FIX message)。例如,如果在相应的第二Java对象(例如,Feature.java)中读取到了关键字段“Name(名称)”,则该关键字段“Name”通过相应的分隔符(例如,冒号“:”)分隔的数据包括需要提取的一级标题,该关键字段“Name”则属于与当前测试用例的一级标题相关联的关键字段。又如,如果在相应的第二Java对象(例如,Elements.java)中读取到了关键字段“Name(名称)”,则该第二Java对象中与该关键字段“Name”通过相应的分隔符(例如,冒号“:”)分隔的数据包括需要提取的二级标题,该关键字段“Name”则属于与二级标题相关联的关键字段。又如,如果在相应的第二Java对象(例如,Output.java)中读取到了关键字段“Msg”,则该第二Java对象中与该关键字段“Msg”通过相应的分隔符(例如,冒号“:”)分隔的数据包括需要提取的一个或多个交易消息,并且每个交易消息通过另一个分隔符号分隔(例如,分号“;”)分隔,并且该关键字段“Msg”则与当前测试用例中的交易消息相关联的关键字段。在本公开中,在Json测试报告中,在涉及到测试中引用的截图的情况下,会输出例如[screenshot]之类关键字段,因此如果在相应的第二Java对象中读取到了关键字段“screenshot”,则说明在当前测试用例中涉及到了相应的截图,据此可在相应的路径中提取相关联的截图。如果在相应的第二Java对象(例如,Output.java)中读取到了关键字段“format=table”,则该第二Java对象中与该关键字段“format=table”通过相应的分隔符(例如,冒号“:”)分隔的数据包括需要提取的该自定义表格中的一个或多个列数据,每个列数据可包括相应的列属性数据和列内容数据,并且在该第二Java对象中各个列数据之间可通过另一分隔符号(例如,分号“;”)分隔,并且列属性数据和相应的列内容数据之间可通过例如又一分隔符号(例如,等号“=”)分隔,因此该关键字段“format=table”为与当前测试用例中的自定义表格相关联的关键字段。如果在相应的第二Java对象(例如,Output.java)中读取到了关键字段“Template Tags”,则该第二Java对象中与该关键字段“Template Tags”通过相应的分隔符(例如,冒号“:”)分隔的数据包括需要提取的需进行高亮处理的一个或多个字段,并且需要提取的各个字段之间可通过另一分隔符号(例如,分号“;”分隔),因此该关键字段“Template Tags”为与当前测试用例中的局部高亮处理相关联的关键字段。当然,本公开中的关键字段并不限于以上示例中提到的这些关键字段,而是还可包括其他指示可提取相关数据的其他关键字段。
在步骤408,响应于在相应的第二Java对象(即,在步骤404中得到的多个第二Java对象)中读取到感兴趣的关键字段,在相应的第二Java对象中提取与关键字段(即在步骤406中读取到的关键字段)相关联的一个或多个数据。
在本公开中,感兴趣的关键字段可以是与格式模板文件中提到的多个部分相关联的字段。
在一些实施例中,步骤408可包括响应于在相应的第二Java对象中读取到与截图相关联的关键字段(例如,前面提到的关键字段“screenshot”),在该第二Java对象中获取该截图的名称。然后,根据所获取的名称从用于保存与该Json测试报告相关联的截图的路径中获取该截图,以供在步骤410中基于所述第一Java对象,将所述截图以贴图形式渲染到所述PDF报告的相应位置。在该实施例中,该路径用于指示用于保存相关联的截图的文件夹所在的位置。
步骤408还可包括响应于在相应的第二Java对象中读取到与交易消息相关联的关键字段(例如,前面提到的关键字段“Msg”),基于与该关键字段相关联的该语句中的相应分割符号,在该第二Java对象中提取以自然语言方式描述的一个或多个交易消息,以供在步骤410中基于第一Java对象,以相应的格式将所提取的一个或多个交易消息渲染到所述PDF报告的相应表格中,每一交易消息包括该交易消息的字段和相应的数据值。
在本公开中,交易消息主要指的是FIX message。应了解,FIX message有专门的规范,一般使用数字来代表其背后的字段。例如仅作为示例,在某个应用中可使用数字8来代表字段BeginString。因此,这种数字对于用户而言就像魔法数字,其无法不知道其在该应用中的真正含义,如果将这种数字直接打印到PDF报告中则不方便测试人员找出问题,而且需求人员也无法知道FIX message的具体内容,因此在本公开中可对FIX message进行翻译后再打印到相应的PDF报告中。在本公开中,为了能够完成这种翻译,可将Json测试报告扩展为对于FIX message,输出三条相应的结果,其中第一条结果是使用FIX message格式描述的一个或多个交易消息,第二条结果是相应的使用自然语言方式描述的一个或多个交易消息,第三条结果是相应的使用二进制格式描述的一个或多个交易消息,每一交易消息可包括该交易消息的字段和相应的数据值。由此,在读取到与交易消息相关联的关键字段时,可基于该规律提取到与每一交易消息相关联的使用自然语言描述的字段以及相应的数据值,从而实现对FIX message进行翻译的作用。
步骤408还可包括响应于在相应的第二Java对象中读取到与自定义表格相关联的关键字段(例如,前面提到的关键字段“format=table”),从该第二Java对象的该关键字段所在语句中提取所述自定义表格所包括的列数。然后,基于该语句中包括的相应分割符号,从该语句中提取该自定义表格的一个或多个列数据,以供在步骤410中基于第一Java对象,以相应的格式将该一个或多个列数据渲染到PDF报告中的相应表格中。在该示例中,每个列数据可包括列属性数据和相应的列内容数据。在Json测试报告中,不同的列数据之间可通过例如第一分割符号“;”进行分割,并且每个列数据中包括的列属性数据和相应的列内容数据之间可例如通过第二分割符号“=”来分隔。因此,在本公开中,需要提取的自定义表格的一个或多个列数据在关键字段“format=table”后的第一分割符号冒号之后,并且基于第二分割符号“;”和第三分割符号“=”可以从相应语句中在该第一分割符号之后的描述中提取出该自定表格中各个列数据。
步骤408还可包括响应于在相应的第二Java对象中读取到与局部高亮处理相关联的关键字段(例如,前面提到的关键字段“Template Tags”),基于该第二Java对象的关键字段所在语句中出现的相应分割符号,从该语句中提取需要高亮处理的一个或多个第一字段。然后将所提取的一个或多个第一字段保存到高亮映射文件中。在本公开中,可使用高亮映射文件用于维护在基于第一Java对象(即在步骤402中得到的第一Java对象)渲染PDF报告时需要根据相应的高亮显示方式进行高亮显示的多个字段。在本公开中,在待生成的PDF报告中的所有表格中都需要以高亮方式显示的字段也可被保持在该高亮映射文件中。例如,还可通过格式模板文件定义了PDF报告中的所有表格中都需要高亮显示的多个第二字段,并将这些第二字段在格式模板文件被加载到内存时被保存在这些高亮映射文件中。在本公开中,加入高亮映射文件中的关键字段都会被实现高亮处理。
在本公开的方法中,还可实现将测试用例的测试结果中有错误的数据以高亮方式进行显示。因此,该方法还可包括如果在测试用例的测试结果中读取到与相应的期望值不匹配的数据(例如,可从Match.java中读取到该数据),基于第一Java对象(即步骤402中得到的第一Java对象),将该不匹配的数据以高亮方式渲染在PDF报告中。
在步骤410,基于第一Java对象(即在步骤402中得到的第一Java对象),将所提取的数据以相应的格式渲染到PDF报告中的相应位置。
由于格式模板文件定义了待生成的PDF报告的多个部分的显示格式,因此基于该格式模板文件的第一Java对象可确定所提取的每一数据的相应格式,并据此来将该数据渲染到PDF报告中的相应位置。
在一些实施例中,在执行步骤408之后并在执行步骤410之前,还可先判断所提取的数据中是否包括中文字符。在本文中,中文字符可以是简体中文字符,也可以是繁体中文字符。响应于确定所提取的数据中包括中文字符(不论是是否全部为中文字符),将所提取的数据格式化为中文字体,以供在步骤410基于第一Java对象,将经格式化的中文字体以相应的格式渲染到所述PDF报告的相应位置。由于中文字体可以准确地渲染出英文字符,因此在本公开中只要在所提取的数据中包括中文字符,不管该所提取的数据中是否也包括英文字符,都将其格式化为中文字体来进行渲染。
在一些实施例中,还可基于所提取的所有数据确定与Json测试报告相关联的统计数据,以便基于这些统计数据生成测试结果汇总页面。这些统计数据至少包括Json测试所包括的测试用例的总数、Json测试报告所包括的每一测试用例的名称、每一测试用例所包括的场景的总数、每一测试用例所包括的场景的通过率、每一测试用例所包括的场景的失败率、执行每一测试用例所花费的时间、执行所有测试用例所花费的总时间等。
通过采用上述手段,本公开能够容易地为被测软件系统生成按需定制的、不可篡改的PDF报告,进而使得可以更好地满足测试人员所需的传输和存储需求,而且这种测试报告对于普通用户而言可读性更好,用户更友好,因此用户体验也更好。例如,图5示出了根据本公开的实施例生成的示例性PDF报告的一部分的示例图,与图3A和3B相比,可以看出根据本公开的实施例生成的PDF报告的格式布局更为直观,并且可以实现有针对性进行高亮显示,因此更易于用户理解,可读性更好,有助于用户更高效地检查数据,因此用户体验更好。
图6示出了可以用来实施本公开内容的实施例的示例电子设备600的示意性框图。例如,如图1所示的服务器120可以由电子设备600来实施。如图所示,电子设备600包括中央处理单元(CPU)601,其可以根据存储在只读存储器(ROM)602中的计算机程序指令或者从存储单元608加载到随机存取存储器(RAM)603中的计算机程序指令,来执行各种适当的动作和处理。在随机存取存储器603中,还可存储电子设备600操作所需的各种程序和数据。中央处理单元601、只读存储器602以及随机存取存储器603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
电子设备600中的多个部件连接至输入/输出接口605,包括:输入单元606,例如键盘、鼠标、麦克风等;输出单元607,例如各种类型的显示器、扬声器等;存储单元608,例如磁盘、光盘等;以及通信单元609,例如网卡、调制解调器、无线通信收发机等。通信单元609允许设备600通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
上文所描述的各个过程和处理,例如方法400,可由中央处理单元601执行。例如,在一些实施例中,方法400可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由只读存储器602和/或通信单元609而被载入和/或安装到设备600上。当计算机程序被加载到随机存取存储器603并由中央处理单元601执行时,可以执行上文描述的方法400的一个或多个动作。
本公开涉及方法、装置、系统、电子设备、计算机可读存储介质和/或计算机程序产品。计算机程序产品可以包括用于执行本公开的各个方面的计算机可读程序指令。
计算机可读存储介质可以是可以保持和存储由指令执行设备使用的指令的有形设备。计算机可读存储介质例如可以是――但不限于――电存储设备、磁存储设备、光存储设备、电磁存储设备、半导体存储设备或者上述的任意合适的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:便携式计算机盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、静态随机存取存储器(SRAM)、便携式压缩盘只读存储器(CD-ROM)、数字多功能盘(DVD)、记忆棒、软盘、机械编码设备、例如其上存储有指令的打孔卡或凹槽内凸起结构、以及上述的任意合适的组合。这里所使用的计算机可读存储介质不被解释为瞬时信号本身,诸如无线电波或者其他自由传播的电磁波、通过波导或其他传输媒介传播的电磁波(例如,通过光纤电缆的光脉冲)、或者通过电线传输的电信号。
这里所描述的计算机可读程序指令可以从计算机可读存储介质下载到各个计算/处理设备,或者通过网络、例如因特网、局域网、广域网和/或无线网下载到外部计算机或外部存储设备。网络可以包括铜传输电缆、光纤传输、无线传输、路由器、防火墙、交换机、网关计算机和/或边缘计算设备。每个计算/处理设备中的网络适配卡或者网络接口从网络接收计算机可读程序指令,并转发该计算机可读程序指令,以供存储在各个计算/处理设备中的计算机可读存储介质中。
用于执行本公开操作的计算机程序指令可以是汇编指令、指令集架构(ISA)指令、机器指令、机器相关指令、微代码、固件指令、状态设置数据、或者以一种或多种编程语言的任意组合编写的源代码或目标代码,所述编程语言包括面向对象的编程语言—诸如Smalltalk、C++等,以及常规的过程式编程语言—诸如“C”语言或类似的编程语言。计算机可读程序指令可以完全地在用户计算机上执行、部分地在用户计算机上执行、作为一个独立的软件包执行、部分在用户计算机上部分在远程计算机上执行、或者完全在远程计算机或服务器上执行。在涉及远程计算机的情形中,远程计算机可以通过任意种类的网络—包括局域网(LAN)或广域网(WAN)—连接到用户计算机,或者,可以连接到外部计算机(例如利用因特网服务提供商来通过因特网连接)。在一些实施例中,通过利用计算机可读程序指令的状态信息来个性化定制电子电路,例如可编程逻辑电路、现场可编程门阵列(FPGA)或可编程逻辑阵列(PLA),该电子电路可以执行计算机可读程序指令,从而实现本公开的各个方面。
这里参照根据本公开实施例的方法、装置(系统)和计算机程序产品的流程图和/或框图描述了本公开的各个方面。应当理解,流程图和/或框图的每个方框以及流程图和/或框图中各方框的组合,都可以由计算机可读程序指令实现。
这些计算机可读程序指令可以提供给通用计算机、专用计算机或其它可编程数据处理装置的处理单元,从而生产出一种机器,使得这些指令在通过计算机或其它可编程数据处理装置的处理单元执行时,产生了实现流程图和/或框图中的一个或多个方框中规定的功能/动作的装置。也可以把这些计算机可读程序指令存储在计算机可读存储介质中,这些指令使得计算机、可编程数据处理装置和/或其他设备以特定方式工作,从而,存储有指令的计算机可读介质则包括一个制造品,其包括实现流程图和/或框图中的一个或多个方框中规定的功能/动作的各个方面的指令。
也可以把计算机可读程序指令加载到计算机、其它可编程数据处理装置、或其它设备上,使得在计算机、其它可编程数据处理装置或其它设备上执行一系列操作步骤,以产生计算机实现的过程,从而使得在计算机、其它可编程数据处理装置、或其它设备上执行的指令实现流程图和/或框图中的一个或多个方框中规定的功能/动作。
附图中的流程图和框图显示了根据本公开的多个实施例的系统、方法和计算机程序产品的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或指令的一部分,所述模块、程序段或指令的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。在有些作为替换的实现中,方框中所标注的功能也可以以不同于附图中所标注的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或动作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本公开的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。