一种面向嵌入式系统分区应用程序软件的仿真测试方法

文档序号:6402321阅读:224来源:国知局
专利名称:一种面向嵌入式系统分区应用程序软件的仿真测试方法
技术领域
本发明提出一种面向嵌入式系统分区应用程序软件的仿真测试方法,特别是涉及一种面向综合模块化嵌入式系统分区应用程序软件的仿真测试方法,它是一种嵌入式软件仿真测试方法,其主要面向综合模块化嵌入式系统分区应用程序软件,它与嵌入式软件测试技术、嵌入式软件脚本技术以及软件故障注入技术有关,属于软件测试技术领域。
背景技术
近几年,随着嵌入式系统功能日趋复杂,系统的软硬件结构也不断发生变化。嵌入式系统软件由传统功能单一,软硬件紧密耦合的结构向模块化、多层次、开放式的软件体系结构转化。其中:模块化指软件系统的功能由一个或多个模块组成,每个模块分时间占用系统资源并得到执行,与传统嵌入式系统软件独占硬件资源的结构相区分;多层次指软件系统分为硬件层、模块支持层、操作系统层和应用层多个层次,图1描述了一个模块化分区嵌入式软件体系结构。每个分区中都可能包含不同的操作系统,命名为分区操作系统,其与核心操作系统位于操作系统层。在这种多层次的软件结构中,核心操作系统用于分时调度每个分区应用程序,而分区操作系统则在相应分区处在运行状态下时负责调度分区内的各个任务。开放式指软件将不再与硬件紧密耦合。多层次的软件结构通过模块支持层和核心操作系统层将各种不同的硬件设备操作封装并抽象成了统一的操作系统应用接口,因此使分区应用程序也不再与硬件紧密耦合。分区应用程序可以在任意一个符合综合模块化嵌入式软件接口规范的系统中运行。以上特点给嵌入式软·件的测试带来了新的挑战。以综合模块化航空电子系统(IMA)为例,其具有通用性、经济性和高可靠性等优点的同时,也大大提高了系统的复杂度,从而提高了软件测试和验证的难度。IMA系统的开发和设计需要符合ARINC653规范,该规范明确了嵌入式系统中核心操作系统(COS)、分区操作系统(POS)和分区应用程序(PA)等概念。而对于分区应用程序,在进行系统集成测试前往往难以得到应用程序与其他交联模块的运行状态和参数。在实际开发和测试过程中,会发生诸如没有足够的处理器资源运行所需应用、数据的传输延迟导致信号不能及时响应等故障,此类故障只有在进行系统集成后才能暴露,而系统集成阶段的测试难以进行故障定位,增加了解决问题的难度和成本。另外,有些故障可能需要重新设计系统结构才能解决,从而严重影响系统的交付时间。与此同时,对分区应用程序进行软件测试存在巨大的障碍。每个分区应用程序虽然能够独立运行,但缺乏与其他分区的交联,很难实施对分区应用程序各项功能的全面测试。当前对于分区应用程序的测试,通常在系统内部总线级别上独立开发一个测试模块,通过模拟内部总线数据来实现对其他嵌入式分区功能的模拟,但这种方法需要重新设计硬件软件,费用高、通用性差,不易采用。
由此可知,嵌入式系统从原有的单个操作系统运行多个应用逐步发展为有一个核心操作系统和多个分区操作系统及分区应用程序协同才能实现预期的功能需求。软件测试作为保证软件质量的重要手段,必须能够对此类应用进行全面的测试,才能保证系统的整体质量。

发明内容
1、目的:针对上述问题,本发明提出基于虚拟分区和实时脚本技术的综合模块化嵌入式系统分区应用程序软件自动测试方法,提供一种面向综合模块化嵌入式系统分区应用程序软件的仿真测试方法。该方法在分区嵌入式软件应用程序的开发和集成测试阶段实施,能够测试或验证分区应用程序的执行顺序、调度性能、接口通讯功能。其思路是利用核心操作系统本身的运算和存储单元,通过虚拟分区的方式来在线模拟其他分区应用程序的动态行为,对被测应用程序施加测试激励并接收响应。2、技术方案:(I)功能原理:本发明与综合模块化嵌 入式系统应用程序的开发过程紧密结合,其基于主机/目标机架构,如图2所示。其中测试开发端为被测软件的开发平台,同时也是本测试方法的管理平台,主要负责测试设计、管理和结果分析。数据服务端负责测试实施过程中的数据管理,执行测试激励数据发送和测试响应数据收集工作。分区应用程序则直接运行在测试执行端,即被测硬件执行平台。在测试过程中,运行于测试执行端的虚拟分区程序将根据数据服务端所发送的测试指令和测试配置执行各种测试动作,记录测试数据并回传到数据服务端。一次测试可以将多个测试执行端连接与主机端连接在一个通讯网络里进行。(2)技术方案:由于综合模块化分区嵌入式系统中使用资源配置信息文件管理系统的各种资源(如CPU时间、内存、I/O接口等),测试人员可以根据被测对象的特点和资源需求,定制相应的资源配置信息文件。本发明以该配置信息文件和分区应用程序作为输入,在特定的硬件平台上对分区应用程序的运行环境进行模拟,并利用虚拟分区与分区应用程序进行交互,实时监控分区应用程序的通讯数据。本发明的总体技术方案如图3所示,具体步骤描述如下:步骤一:构建测试模型为了能够准确详细地描述分区应用程序及其运行环境,需要利用分区应用程序的相关配置信息文件,构建测试模型。对于综合模块化嵌入式系统,有两类配置信息文件对系统的资源配置做出规划。其中:(I)模块配置信息,用于配置整个模块化嵌入式系统中所执行的分区数量以及为每个分区应用程序所分配的内存地址、IO空间地址、CPU时间片等硬件资源信息,以及分区端口之间的通讯连接信息。对于具有外部总线的硬件平台,还定义了哪些分区应用程序需要对外部总线进行访问,包括访问的接口类型、接口配置等信息。(2)分区配置信息,其主要定义了分区内进程或任务的数量、优先级、调度方式、执行时间等,还记录了分区应用程序所需的内存空间数量、IO空间类型、端口访问权限和方式等信息。在本方法中,除了要导入分区应用程序自身的分区资源配置信息文件外,还需要导入与分区应用程序有关的模块资源配置信息文件。利用分区配置信息文件和模块配置信息文件构建测试模型的方法如下:(I)读取被测分区应用程序的分区配置信息文件,首先构建被测分区应用程序模型,根据配置信息中的分区内进程数量和端口访问信息,构建分区应用程序模型中的进程模型,为每个进程模型创建相应端口 ;根据分区应用程序的端口数量、端口类型、端口访问权限,构建分区应用程序模型中的相应端口,并将分区应用程序模型端口与进程模型端口相连接。(2)读取与被测分区应用程序有数据交互的其他分区应用程序的分区配置信息文件,读取信息与构建模型内容与被测分区应用程序类似。(3)读取模块配置信息文件,构建模块模型。通过模块配置信息中的分区端口连接信息,将模块模型中各分区模型的端口相连接;将模块配置信息文件中的内存地址、IO空间地址、CPU时间片信息记录在分区模型的属性中;将分区应用程序与外部总线的连接信息记录在外部设备模型中。(4)将模块模型、分区模型和外部设备模型集成,构成测试模型。步骤二:利用测试模型,生成测试框架在测试模型中包含了分区应用程序的资源使用情况以及分区应用程序所在模块的资源使用情况。结合测试模 型中的配置信息,可生成运行在测试硬件平台上的测试框架。本步骤包含以下操作:(I)根据与分区模型,生成虚拟分区代码;根据测试模型中的分区模型信息,生成虚拟分区代码。其中根据测试模型的分区模型信息,生成指定数量的虚拟分区,根据分区的端口数量、端口类型和端口访问权限生成相应的端口创建、端口配置和端口删除代码。(2)根据分区模型,为虚拟分区生成分区配置信息文件;根据测试模型中的分区模型信息,生成虚拟分区配置信息文件。其中根据测试模型的分区模型信息,生成指定数量的配置信息文件,根据分区的端口数量、端口类型和端口访问权限在配置信息文件中做相应配置。(3)根据模块模型和外部设备模型,生成测试模块配置信息文件;根据模块模型和外部设备模型,生成测试模块配置信息文件。其中包括虚拟分区与被测分区应用程序的连接信息,虚拟分区与被测分区应用程序的内存地址、IO空间地址和CPU时间片信息。测试模块配置信息文件与原模块配置信息文件的区别在于前者会根据虚拟分区中数据激励和采集的要求,配置相应的端口和访问信息。(4)根据分区应用程序的分区资源配置和模块资源配置信息,对整个测试系统的可调度性进行评估。通过以上步骤后,即可得到完整的测试框架,接下来需要测试人员编写测试脚本,即进入软件测试中的测试用例构建环节。步骤三:编写测试脚本通过以上步骤建立了测试框架,但还没有实现完整的测试用例,用户通过周期调用及事件注册API函数,将已编写好的脚本注册到测试框架中相应的事件,其中包括:(I)分区端口的数据收发;(2)按预定周期及延时的触发控制; (3)帧格式及数据的解析运算;(4)数据的记录和传输;完成测试脚本后,脚本代码将与虚拟分区代码一同编译成可加载的模块文件;步骤四:对分区应用程序实施测试完成以上工作后,测试人员与开发人员调试系统类似的方式模拟运行测试框架和分区应用程序;在整个测试框架构建工作完成后,各虚拟分区将按测试脚本指定的时序和过程进行自动化测试并记录测试过程中产生的各种数据,其中包括:(I)分区应用程序的加载和卸载数据,包括触发时间、执行时间;

(2)分区应用程序的调度数据,包括任务切换时间、分区应用的时间片长度;(3)分区应用程序间的通讯数据,包括各端口的标号、接收和发送时间以及数据帧内容;(4)分区应用程序执行过程中的异常和错误发生时间、错误状态信息;步骤五:收集测试数据并进行分析在测试过程中,虚拟分区通过高速外总线将测试数据实时传送到数据服务端保存,在测试结束后,测试开发端从数据服务端获取测试数据并进行分析。3、优点及功效:以虚拟分区和实时脚本技术实现的模块化分区嵌入式软件应用程序的测试方法,其思路是利用系统配置对被测分区应用程序的真实运行环境进行模拟,并通过实施脚本技术对被测软件进行激励施加、响应收集和状态监控的自动化测试过程,其优势在于:1、纯软件的开发成本较设计专用测试硬件小,且测试软件可在不同测试对象条件下重用;2、虚拟分区运行于指定硬件平台,具有同等的操作接口的权限,可以操纵功能模块所访问的内存、寄存器等存储或运算单元,更有利于模拟各种正常、边界、异常类型的数据;3、虚拟分区可以监控被测分区软件的各类接口输出数据,以及在存储单元内部的输出数据,更有利于功能软件的状态监控;4、虚拟分区能够监控被测分区的故障及处理过程,为被测软件的运行安全监控提供更多的判断依据。5、虚拟分区与实时脚本技术相结合,可以实现动态的状态激励和故障注入工作。


图1综合模块化嵌入式系统软件体系结构图;图2测试系统总体结构图;图3测试总体技术方案图;图4测试开发端功能模块图;图5测试执行端系统结构图6虚拟分区功能结构图;图7测试开发端测试插件与开发平台关系图;图8测试实施过程图;图9数据服务实施方案具体实施例方式本发明利用虚拟分区和实时脚本技术,对综合模块化嵌入式系统分区应用程序软件进行仿真测试。本发明以分区应用程序配置信息文件、模块配置信息文件和分区应用程序作为输入,在真实硬件平台上对分区应用程序的运行环境进行模拟,并利用虚拟分区与分区应用程序进行数据交互,实时激励并采集响应。同时位于虚拟分区内部的实时脚本可以对分区应用程序进行故障注入和状态监控。测试系统的总体结构如图2所示。图1为综合模块化嵌入式系统软件体系结构图。 测试开发端实施方案测试开发端具有良好的用户界面和丰富的数据分析工具,选用MicrosoftWindows操作系统作为测试开发端的操作系统。测试开发端的主要功能均使用开发平台插件的形式实现,能够有效利用分区应用程序的编译和调试环境。测试人员可无需安装和学习其他的平台技术,通过使用与系统开发人员统一的程序界面完成测试工作。测试开发端的实施方案如图7所示。其主要包括应用管理、测试管理、资源管理、数据通讯和结果分析模块,每个模块都以插件的形式插入到系统开发平台的相应功能模块中。而各功能模块的详细结构及其关系如图4所示,其主要分为管理层和核心层,其中每个管理层模块都有对应的核心层功能实现,详细内容介绍如下:(I)应用管理模块应用管理模块是对分区应用程序的管理模块,其中包含对被测分区应用程序本身及其相应的分区配置信息文件等。作为开发平台的插件,该模块跟踪开发平台项目管理模块,将编译好的分区应用程序和分区配置信息文件复制到单独的文件夹管理。如果某个分区应用程序和分区配置信息文件因为修改而发生了改变,应用管理会自动将最新的文件复制到单独文件夹中。管理模块将单独文件夹中的内容作为测试系统的输入管理起来,记录其对应关系。(2)测试管理模块测试管理模块主要包含测试模型和测试框架的生成功能。在开发人员完成分区应用程序的开发阶段后,利用测试管理插件,自动生成分区应用程序的测试模型及测试框架。测试管理模块首先读取应用管理模块所管理的被测分区应用程序及分区配置信息文件,构建测试模型。然后根据模型生成虚拟分区代码、端口访问代码及虚拟分区的分区配置信息文件。(3)资源管理模块资源管理模块主要管理测试管理模块所生成的测试框架,同时,测试人员编写的测试脚本也在此处管理。在测试开始执行过程中,资源管理模块通过数据通讯模块将测试脚本、测试框架等下载到硬件平台执行。

(4)结果分析模块
结果分析模块主要管理测试执行过程中从数据服务端传输到测试开发端的测试数据。将测试结果保存到测试开发端文件系统。 数据服务端实施方案数据服务端提供测试过程中的所需的激励数据和响应数据的存储。数据服务端采用实时操作系统,并挂载大容量的数据存储设备。数据服务端的连接关系如图9所示。在测试实施过程中,虚拟分区通过核心操作系统与被测分区应用程序通讯,而用于激励的测试数据和监控得到的响应数据则通过高速通讯总线(AFDX)与数据服务端通讯,从数据服务端获取激励数据或向数据服务端发送响应数据。 测试执行端实施方案测试执行端是分区应用程序及测试框架所运行的硬件平台,其系统结构如图5所示,主要分为用户层和核心层两部分。其中核心层主要由测试系统的硬件执行平台和核心操作系统组成,而用户层则包含了分区应用程序和虚拟分区以及测试脚本等。(I)核心层核心层是测试系统的底层平台,为用户层提供可执行平台和配置信息的加载等功能,其主要分为以下几个部分:1.硬件层在本测试方法中,硬件层包含了被测分区应用程序运行的真实硬件平台。包括CPU、内存、总线、外部接口设备等。

2.模块支持层模块支持层提供了访问和驱动硬件设备的统一接口,为核心操作系统服务。3.核心操作系统核心操作系统是软件系统的整体调度者,其管理了所有分区应用程序的资源,其中包括CPU时间片、内存区块等。核心操作系统通过读取模块配置信息文件和分区配置信息文件为每个分区应用程序分配相应的软/硬件资源。(2)用户层用户层包含了被测分区应用程序和虚拟分区。在测试过程中,虚拟分区通过核心操作系统提供的通讯接口与分区应用程序进行数据交互,对其施加激励并监控响应。位于虚拟分区内部的测试脚本执行程序则可按照指定的时间和顺序对分区应用程序执行测试用例。虚拟分区是分区应用程序测试过程中的核心组件,虚拟分区可以模拟真实分区行为与分区应用程序进行数据交互,其主要结构如图6所示。虚拟分区功能组件主要分为六个部分,其详细内容介绍如下:(I)定时器定时器组件为调度组件提供精确的时间信号,其需要按照指定的时间或周期为调度组件提供触发事件。(2)任务调度任务调度组件管理所有的脚本任务,其包含周期型或事件型的脚本任务。(3)脚本管理脚本管理组件用于封装现有的脚本解释器,提供统一接口供任务管理器调用。
(4)内存管理内存管理组件负责管理测试过程中分区发送或分区接收数据的保存,同时支持脚本对数据和存储空间的控制。(5)数据存储数据存储组件负责管理测试执行过程中的所有需要保存下来的数据,包括某些事件的执行时间、执行结果等,还包括测试过程中的日志和错误信息。(6)通讯接口通讯接口组件负责访问其他分区和外部接口设备,将需要保存的内容传送到数据服务端。 实施步骤实施步骤如图8、图3所示,本发明一种面向嵌入式系统分区应用程序软件的仿真测试方法,该方法具体步骤如下:步骤一:构建测试模型(I)导入配置信息文件将分区应用程序的分区配置信息文件及分区应用程序所在模块的模块配置信息文件导入到测试系统中。(2)生成测试模型测试系统通过分析分区应用程序及模块的配置信息文件,自动生成测试模型。测试模型使用AADL描述。步骤二:根据测试模型,生成测试框架。利用测试模型中的配置信息,测试系统可以得到整体系统的资源分配情况和被测软件的资源使用情况以及其与其他应用模块的数据交互情况。结合被测系统各层次的配置信息,测试系统进行以下一系列操作:(I)根据与分区模型,生成虚拟分区代码;根据测试模型中的分区模型信息,生成虚拟分区代码。其中根据测试模型的分区模型信息,生成指定数量的虚拟分区,根据分区的端口数量、端口类型和端口访问权限生成相应的端口创建、端口配置和端口删除代码。(2)根据分区模型,为虚拟分区生成分区配置信息文件;根据测试模型中的分区模型信息,生成虚拟分区配置信息文件。其中根据测试模型的分区模型信息,生成指定数量的配置信息文件,根据分区的端口数量、端口类型和端口访问权限在配置信息文件中做相应配置。(3)根据模块模型和外部设备模型,生成测试模块配置信息文件;根据模块模型和外部设备模型,生成测试模块配置信息文件。其中包括虚拟分区与被测分区应用程序的连接信息,虚拟分区与被测分区应用程序的内存地址、IO空间地址和CPU时间片信息。测试模块配置信息文件与原模块配置信息文件的区别在于前者会根据虚拟分区中数据激励和采集的要求,配置相应的端口和访问信息。(4)根据分区应用程序的分区资源配置和模块资源配置信息,对整个测试系统的可调度性进行评估。通过以上 步骤后,被测系统的整体框架已经完成,接下来需要用户编写测试脚本,即进入软件测试中的测试用例环节。步骤三:编写测试脚本,对测试过程中发生的指定事件编写响应动作。编写测试脚本是实现完整的测试用例的主要过程。测试人员通过调用指定的API函数,编写测试脚本。测试脚本函数可以注册到框架中相应的测试事件中,其中包括:(I)虚拟分区端口的数据收发,其中包括:
权利要求
1.一种面向嵌入式系统分区应用程序软件的仿真测试方法,其特征在于:该方法具体步骤如下: 步骤一:构建测试模型 为了能够准确详细地描述分区应用程序及其运行环境,需要利用分区应用程序的相关配置信息文件,构建测试模型;对于综合模块化嵌入式系统,有两类配置信息文件对系统的资源配置做出规划,其中: (1)模块配置信息,用于配置整个模块化嵌入式系统中所执行的分区数量以及为每个分区应用程序所分配的内存地址、IO空间地址和CPU时间片硬件资源信息,以及分区端口之间的通讯连接信息;对于具有外部总线的硬件平台,还定义了哪些分区应用程序需要对外部总线进行访问,包括访问的接口类型、接口配置信息; (2)分区配置信息,其定义了分区内进程和任务的数量、优先级、调度方式、执行时间,还记录了分区应用程序所需的内存空间数量、IO空间类型、端口访问权限和方式信息; 在本方法中,除了要导入分区应用程序自身的分区资源配置信息文件外,还需要导入与分区应用程序有关的模块资源配置信息文件; 利用分区配置信息文件和模块配置信息文件构建测试模型的方法如下: (1)读取被测分区应用程序的分区配置信息文件,首先构建被测分区应用程序模型,根据配置信息中的分区内进程数量和端口访问信息,构建分区应用程序模型中的进程模型,为每个进程模型创建相应端口 ;根据分区应用程序的端口数量、端口类型、端口访问权限,构建分区应用程序模型中的相应端口,并将分区应用程序模型端口与进程模型端口相连接;· (2)读取与被测分区应用程序有数据交互的其他分区应用程序的分区配置信息文件,读取信息与构建模型内容与被测分区应用程序类似; (3)读取模块配置信息文件,构建模块模型;通过模块配置信息中的分区端口连接信息,将模块模型中各分区模型的端口相连接;将模块配置信息文件中的内存地址、IO空间地址、CPU时间片信息记录在分区模型的属性中;将分区应用程序与外部总线的连接信息记录在外部设备模型中; (4)将模块模型、分区模型和外部设备模型集成,构成测试模型; 步骤二:利用测试模型,生成测试框架 在测试模型中包含了分区应用程序的资源使用情况以及分区应用程序所在模块的资源使用情况,结合测试模型中的配置信息,能生成运行在测试硬件平台上的测试框架;本步骤包含以下操作: (1)根据与分区模型,生成虚拟分区代码; 根据测试模型中的分区模型信息,生成虚拟分区代码;其中根据测试模型的分区模型信息,生成指定数量的虚拟分区,根据分区的端口数量、端口类型和端口访问权限生成相应的端口创建、端口配置和端口删除代码; (2)根据分区模型,为虚拟分区生成分区配置信息文件; 根据测试模型中的分区模型信息,生成虚拟分区配置信息文件;其中根据测试模型的分区模型信息,生成指定数量的配置信息文件,根据分区的端口数量、端口类型和端口访问权限在配置信息文件中做相应配置;(3)根据模块模型和外部设备模型,生成测试模块配置信息文件; 根据模块模型和外部设备模型,生成测试模块配置信息文件;其中包括虚拟分区与被测分区应用程序的连接信息,虚拟分区与被测分区应用程序的内存地址、IO空间地址和CPU时间片信息;测试模块配置信息文件与原模块配置信息文件的区别在于前者会根据虚拟分区中数据激励和采集的要求,配置相应的端口和访问信息; (4)根据分区应用程序的分区资源配置和模块资源配置信息,对整个测试系统的可调度性进行评估; 通过以上步骤后,即得到完整的测试框架,接下来需要测试人员编写测试脚本,即进入软件测试中的测试用例构建环节; 步骤三:编写测试脚本 通过以上步骤建立了测试框架,但还没有实现完整的测试用例,用户通过周期调用及事件注册API函数,将已编写好的脚本注册到测试框架中相应的事件,其中包括: (1)分区端口的数据收发; (2)按预定周期及延时的触发控制; (3)帧格式及数据的解析运算; (4)数据的记录和传输; 完成测试脚本后,脚本代码将与虚拟分区代码一同编译成能加载的模块文件; 步骤四:对分区应用程序实 施测试 完成以上工作后,测试人员与开发人员调试系统类似的方式模拟运行测试框架和分区应用程序;在整个测试框架构建工作完成后,各虚拟分区将按测试脚本指定的时序和过程进行自动化测试并记录测试过程中产生的各种数据,其中包括: (1)分区应用程序的加载和卸载数据,包括触发时间、执行时间; (2)分区应用程序的调度数据,包括任务切换时间、分区应用的时间片长度; (3)分区应用程序间的通讯数据,包括各端口的标号、接收和发送时间以及数据帧内容; (4)分区应用程序执行过程中的异常和错误发生时间、错误状态信息; 步骤五:收集测试数据并进行分析 在测试过程中,虚拟分区通过高速外总线将测试数据实时传送到数据服务端保存,在测试结束后,测试开发端从数据服务端获取测试数据并进行分析。
全文摘要
一种面向嵌入式系统分区应用程序软件的仿真测试方法,该方法有五大步骤步骤一构建测试模型;步骤二根据测试模型,生成测试配置信息和虚拟分区代码;步骤三编写测试脚本,对测试过程中发生的指定事件编写响应动作;步骤四对被测分区应用程序实施测试;步骤五收集测试数据并进行分析。本发明在分区嵌入式软件应用程序的开发和集成测试阶段实施,能够测试或验证分区嵌入式软件应用程序的执行顺序、调度性能、接口通讯功能。其思路是利用核心操作系统本身的运算和存储单元,通过虚拟分区的方式来在线模拟其他分区应用程序的动态行为,对被测应用程序施加测试激励并接收响应。它在软件测试技术领域里有广阔的应用前景。
文档编号G06F11/36GK103235756SQ201310140788
公开日2013年8月7日 申请日期2013年4月22日 优先权日2013年4月22日
发明者刁晓栩, 余正伟, 刘斌, 吴玉美, 高猛 申请人:北京航空航天大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1