面向对象自动化测试工具Loadrunner11_第1页
面向对象自动化测试工具Loadrunner11_第2页
面向对象自动化测试工具Loadrunner11_第3页
面向对象自动化测试工具Loadrunner11_第4页
面向对象自动化测试工具Loadrunner11_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件测试技术面向对象的自动化测试工具Loadrunner11复习:面向对象软件测试层次面向对象技术对测试的影响面向对象的单元测试面向对象测试工具QTP9.3面向对象的集成测试把一组相互有影响的类看作一个整体称为类簇。类簇测试主要根据系统中相关类的层次关系,检查类之间的相互作用的正确性。面向对象的集成测试的任务是检测哪些类相互作用时会产生错误。9.3面向对象的集成测试1.基于类间协作关系的横向测试。由系统的一个输入事件作为激励,对其触发的一组类进行测试,执行相应的操作/消息处理路径,最后终止于某一输出事件。应用回归测试对已测试过的类集再重新执行一次,以保证加入新类时不会产生意外的结果。9.3面向对象的集成测试2.基于类间继承关系的纵向测试。首先通过测试独立类(是系统中已经测试正确的某类)来开始构造系统,在独立类测试完成后,下一层继承独立类的类(称为依赖类)被测试,这个依赖类层次的测试序列一直循环执行到构造完整个系统。9.3.1基于UML的集成测试集成测试的UML支持协作图(合作图)序列图(顺序图)协作图协作图(协同图)非常类似在“集成测试”中曾经使用过的单元调用图。顺序图顺序图跟踪通过协作图的执行时间路径粗竖线表示类或类的实例,箭头标号表示类的实例按时间顺序发送的消息还书协作图还书顺序图测试方法基于UML的集成测试其实质是基于调用图和路径的集成方法。设计测试用例覆盖类之间的调用关系。测试要考虑时序关系。9.3.3基于MM路径的集成概念源节点:程序开始处或重新开始点汇节点:语句结束处模块执行路径:源节点到汇节点,中间没有汇节点消息:控制转移A124356B1234C12345A124356B1234C12345MM-路径是穿插出现模块执行路径和消息的序列例:模块执行路径:MEP(A,1)=<1,2,3,6>MEP(A,2)=<1,2,4>MEP(A,3)=<5,6>MEP(B,1)=<1,2>MEP(B,2)=<3,4>MEP(C,1)=<1,2,4,5>MEP(C,2)=<1,3,4,5>13-8跨三个单元的MM-路径A124356B1234C12345A124356B1234C12345MM-路径图给定一组单元,其MM-路径图是一种有向图,其中节点表示模块执行路径,边表示消息和单元之间的返回。注意:MM-路径图是按照一组单元定义的。最低要求所有消息均被覆盖至少一次。模块执行路径:MEP(A,1)=<1,2,3,6>MEP(A,2)=<1,2,4>MEP(A,3)=<5,6>MEP(B,1)=<1,2>MEP(B,2)=<3,4>MEP(C,1)=<1,2,4,5>MEP(C,2)=<1,3,4,5>13-8跨三个单元的MM-路径A124356B1234C12345A124356B1234C12345例:MM-路径图从图13-8中导出的MM-路径图MEP(A,2)MEP(B,1)MEP(C,1)MEP(B,2)MEP(C,2)MEP(A,3)MEP(A,1)实线箭头表示消息,虚线箭头表示返回。9.4面向对象的系统测试系统测试应该尽量搭建与用户实际使用环境相同的测试平台,应该保证被测系统的完整性,对临时没有的系统设备部件,也应有相应的模拟手段。系统测试时,应该参考OOA分析的结果,对应描述的对象、属性和各种服务,检测软件是否能够完全"再现"问题空间。1.功能测试2.强度测试测试系统的能力最高实际限度,即软件在一些超负荷的情况,功能实现情况。如要求软件某一行为的大量重复、输入大量的数据或大数值数据、对数据库大量复杂的查询等。3.性能测试4.安全测试9.4.1面向对象的系统测试5.恢复测试采用人工的干扰使软件出错,中断使用,检测系统的恢复能力,特别是通讯系统。恢复测试时,应该参考性能测试的相关测试指标。6.安装/卸载测试7.可用性测试:测试用户是否能够满意使用。8.基于UML的系统测试9.5面向对象软件的测试和传统测试的比较测试的单元不同集成测试不同系统构成不同LoadRunner11

LoadRunner的简介2

测试准备工作1

LoadRunner测试流程3一、性能测试准备了解项目背景制定测试计划,参于人员有人数,各自的任务,测试范围和目标测试模型测试数据系统信息测试环境其他性能测试目标手动测试存在的问题测试人员压力产生被测系统是否有足够的测试资源?

测试人员客户机如何调度和同步测试用户?如何搜集和分析测试结果?如何完成回归测试?分析?123.20所有人注意:点击按钮WebserverDatabaseserver调度员自动化测试解决方案被测系统WebserverDatabaseserver压力产生Vuser主机解决测试资源的限制利用图表工具分析测试结果利用录制的脚本进行回归测试AnalysisController运行大量的“VirtualUsers”在不同的机器上利用“VirtualUsers”代替实际测试人员通过“Controller”管理“Vusers”二、LoadRunner概述Mercury公司的压力测试工具LoadRunner,是目前软件负载测试的工业标准。支持多种协议,包括HTTP、WAP、winsock、Tuxedo、Oracle……通过模拟多个用户并发负载,并进行实时监控的方式来进行测试与其它负载测试工具的不同在于,LoadRunner的每一个虚拟用户所占用的系统资源较少,适合于用较少的负载测试机器来达到大规模的负载测试所要求的并发压力。LoadRunner适用于网络应用的负载测试LoadRunner特点能很轻松地创建虚拟用户能创建真实的负载定位性能问题分析结果精确定位问题所在完整的企业应用环境支持提示:建议安装过程关闭360等杀毒软件。否则可能出现安装后,用Controller创建场景报错:FailedtoConnecttoLoadRunnerController,控制器无法使用。LoadRunner组件LoadRunner包含很多组件,其中最常用的有VisualUserGenerator(VuGen)、Controller,Analysis。Mercury虚拟用户生成器(VuGen)—创建脚本VuGen

通过录制应用程序中典型最终用户执行的操作来生成虚拟用户。VuGen将这些操作录制到自动虚拟用户脚本中,以便作为负载测试的基础。

MercuryLoadRunnerController—设计和运行场景

Controller是用来创建、管理和监控负载测试的中央控制台。使用Controller可以运行用来模拟真实用户执行的操作的脚本,并可以通过让多个Vuser(虚拟用户)同时执行这些操作来在系统中创建负载。

MercuryAnalysis—分析场景

MercuryAnalysis提供包含深入的性能分析信息的图和报告。使用这些图和报告,可以标识和确定应用程序中的瓶颈,并确定需要对系统进行哪些更改来提高系统性能。LoadRunner原理LoadRunner的工作原理:

LR的工作原理是通过用户执行被测程序的客户端,在VuGen中录制被测系统的客户端和服务器的协议交互,生成脚本,然后在Controller中控制LoadGenerator,按照一定的配置(场景),模拟一定数量的用户,对服务器产生压力,同时对被测系统涉及的操作系统,数据库,中间件等资源进行监控,收集压力情况下的资源信息,测试结束后形成测试结果和监控数据,在结果分析器中进行分析,最后生成测试结果报告。1.2LoadRunner运行的典型场景LoadRunner运行的典型场景LoadRunner常用术语场景(Scenario):场景即测试场景。在LoadRunner的Controller部件中,可以设计与执行用例的场景,设置场景的步骤主要包括:在Controller中选择虚拟用户脚本、设置虚拟用户数量、配置虚拟用户运行时的行为、选择负载发生器(LoadGenerator)、设置执行时间等。

负载发生器(LoadGenerator):用来产生压力的机器,受Controller控制,可以使用户脚本在不同的主机上执行。在性能测试工作中,通常由一个Controller控制多个LoadGenerator以对被测试系统进行加压。虚拟用户(VirtualUser/Vuser):对应于现实中的真实用户,使用LoadRunner模拟的用户称为虚拟用户。性能测试模拟多个用户操作可以理解为:这些虚拟用户在跑脚本,以模拟多个真正用户的行为。虚拟用户脚本(Vuserscript):通过VuserGenerator录制或开发的脚本。这些脚本用来模拟用户的行为。

事务(Transaction):测试人员可以将一个或多个操作步骤定义为一个事务,可以通俗的理解事务为“人为定义的一系列请求(请求可以是一个或者多个)”。在程序上,事务表现为被开始标记和结束标记圈定的一段代码区块。Loadrunner根据事务的开头和结尾标记,计算事务响应时间、成功/失败的事务数。思考时间(ThinkTime):即请求间的停顿时间。实际中,用户在进行一个操作后往往会停顿然后再进行下一个操作,为了更真实的模拟这种用户行为而引进该概念。在虚拟用户脚本中用函数lr_think_time()来模拟用户处理过程,执行该函数时用户线程会按照相应的time值进行等待。事务响应时间:事务响应时间是一个统计量,是评价系统性能的重要参数。定义好事务后,在场景执行过程和测试结果分析中即可以看到对应事务的响应时间。通过对关键或核心事务的执行情况进行分析,以定位是否存在性能问题。集合点(Rendezvous):设集合点是为了更好模拟并发操作。设了集合点后,运行过程中用户可以在集合点等待到一定条件后再一起发后续的请求。集合点在虚拟用户脚本中对应函数lr_rendezvous()。打开案例三、LoadRunner测试流程第一步第二步第三步第四步第五步制定测试方案创建VU脚本定义场景运行场景分析结果测试方案制定准备测试环境尽量使用与客户真实环境相近的环境需要测试的内容哪些客户经常使用的功能需要进行测试的页面准备测试基础数据准备一个生命周期的数据,供测试使用脚本如何加载测试单个脚本测试,验证是否存在性能问题根据客户使用各脚本的频率,组合所有脚本反应真实的客户使用情况。创建Vuser脚本Loadrunner脚本开发步骤:录制基本脚本

增强/编辑脚本

配置运行时设置

试运行脚本创建Vuser脚本—录制基本脚本1.启动LoadRunner选择开始

程序

HPLoadRunner

LoadRunner,打开HPLoadRunner11窗口。2.打开VuGen在LoadRunnerLauncher窗格中,单击Create/EditScripts,链接启动VirtualuserGenerator起始页。创建Vuser脚本—录制基本脚本3.创建一个空白Web脚本选择File

New菜单,或点击按钮,打开NewVirtualUser对话框,显示可供选择脚本的协议。如果是B/S结构,就要选择Web(HTTP/HTML)协议。如果是C/S结构,则可以根据后端数据库的类型来选择,如MSSQLServer协议用于测试后台数据库为SQLServer的应用;对于没有数据库的WINDOWS应用,可以选择WindowsSockets协议。根据选择协议的不同,VirtualUserGenerator会使用不同的方式和界面引导用户完成脚本的录制。创建Vuser脚本—录制基本脚本4.录制前的设置选择Web(HTTP/HTML),点击Create按钮,打开StartRecording对话框。VuGen的脚本分为三个部分:Vuser_init,Action,Vuser_end。其中Vuser_init和Vuser_end都只能存在一个,而Action可分成无数多个部分创建Vuser脚本—录制基本脚本在StartRecording对话框,点击Options按钮,进入录制选项设置。1)Recording

HTTP/HTMLlevel中设置脚本的显示形式:HTML。

基于浏览器的应用程序推荐使用HTML-basedscript。不是基于浏览器的应用程序推荐使用URL-basedscript。基于浏览器的应用程序中包含了JavaScript或HTTPS安全协议,建议使用URL-basedscript。创建Vuser脚本—录制基本脚本2)Advanced

Supportcharset中设置编码格式:UTF-8

提示:录制Web脚本时,生成的脚本中存在乱码?在回放脚本之前:Vuser-->运行时设置-->浏览器-->浏览器仿真-->更改-->使用浏览器-->语言下来选择“中文(中国)”。创建Vuser脚本—录制基本脚本5.录制

在StartRecording对话框,点击OK按钮,开始录制。系统自动弹出IE,加载登录界面。

在录制的过程中,屏幕上有一个悬浮的录制工具栏,是脚本录制过程中测试人员和VuGen交互的主要平台。创建Vuser脚本—录制基本脚本实例操作:登录系统

订票

注销操作被测系统的每一个步骤都被记录,在录制的过程中,可以在相应的步骤插入action、事务、检查点、集合点等信息。录制完成后单击按钮,Loadrunner开始生成脚本,生成的脚本如图所示。

两种脚本查看方式:ScriptView

可以查看全部录制的脚本代码TreeView

可以查看每个URL获取来的页面创建Vuser脚本—增强/编辑脚本1.插入事务

插入事务是用于把功能分为若干部分,在统计性能指标时,可以对不同的事务分别作统计。可以在录制的时候,逐步插入。也可以在录制完成之后,在脚本中插入。

在录制时插入操作:录制某个功能开始前

单击插入事务的起始点

录制,直到某个功能结束

插入事务的结束点。创建Vuser脚本—增强/编辑脚本在脚本插入方式:插入事务起始点:单击某个功能起始前的空白处

右键鼠标

insert

starttransaction

命名

OK。系统自动在脚本语句中插入如下语句:lr_start_transaction("登录");插入事务结束点:单击某个功能结束后的空白处

右键鼠标

insert

endtransaction

命名(与起始点的名字一致)

OK。系统自动在脚本语句中插入如下语句:lr_end_transaction("登录",LR_AUTO);创建Vuser脚本—增强/编辑脚本2.参数化参数化的作用是在进行场景执行的时候,每个不同的虚拟用户可以按照参数的读取策略读取到参数值,以模拟不同用户在提交或者读取不同的数据。确定需要参数化的常量对脚本进行参数化还原初始字符串创建Vuser脚本—增强/编辑脚本①确定需要参数化的常量打开脚本,首先要确定哪些常量需要参数化。1)选中参数化内容

右击鼠标

在右键菜单上选择replacewithaparameter。2)在弹出窗口填写参数名称创建Vuser脚本—增强/编辑脚本②对脚本进行参数化3)单击窗口的properties按钮,设置parameter的properties创建Vuser脚本—增强/编辑脚本③还原初始字符串通过VuGen,可以还原最初录制的字符串从而撤消参数化。在脚本视图中,右键单击该参数并选择“Restoreoriginalvalue()”。设置完成后,该参数被还原为初始字符串。创建Vuser脚本—增强/编辑脚本3.插入集合点插入集合点是一种增大并发压力的方式。脚本运行时,只有当到达集合点的虚拟用户数满足设置要求时,才会继续往下运行。系统自动在脚本语句中插入语句:lr_rendezvous(“订票")

在录制时插入操作:录制某个功能开始前

单击插入集合点

命名

OK在脚本的插入方式:单击需要插入集合点的功能开始前的空白处右键鼠标

insert

rendezvous

命名

OK。注意:集合点只能插入Action部分的脚本中,不能插入vuser_init和vuser_end两部分脚本中。创建Vuser脚本—增强/编辑脚本4.关联

关联的含义是,在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求。常用的关联技术有三种:录制中关联、录制后关联、手动关联。创建Vuser脚本—增强/编辑脚本录制中关联设置录制前的recordingoptions

correlation,可以勾选LR已有的关联规则,也可以新建规则;录制过程中,关联自动在脚本体现。创建Vuser脚本—增强/编辑脚本录制后关联关联的使用可以在脚本录制完成后,回放一次脚本,然后在脚本的菜单的vuser

scanscriptforcorrelations进行设置通过回放脚本和扫描关联,系统尝试找到录制与执行时服务器响应的差异部分,找到需要关联的数据,并建立关联。创建Vuser脚本—增强/编辑脚本

手动关联

录制前关联与录制后关联都属于自动关联的范畴。如果出现自动关联不能解决的问题,就需要使用手动关联的方法。手动关联的一般步骤如下:1)录制两份脚本,保证业务流程和使用的数据相同。2)使用WinTiff工具比较两份脚本,对两份脚本中不同的地方进行判断,找到需要关联的数据。

3)找到左边界和右边界字符串,写出关联函数。

4)在脚本中‘需要关联的数据’前面插入关联函数。

5)用关联函数定义的参数取代脚本中‘需要关联的数据’录制两份脚本,保证业务流程和使用的数据相同以登录、退出飞机订票系统为例,分别录制testa、testb脚本对比使用工具

与脚本比较WinTiff工具比较两份脚本,对两份脚本中不同的地方进行判断,找到需要关联的数据。需关闭其中一个脚本找到不同点,查看源代码确定左右边界左边界:userSessionvalue=右边界:>

使用插入新步骤或alt+insert快捷键插入关联函数web_reg_save_param找到替换内容,替换参数创建Vuser脚本—增强/编辑脚本5.其他插入注释:在脚本中插入注释,可以清晰找到需要修改的位置,增强脚本的可读性。插入检查点:在脚本中设置检查点函数,将返回值的结果反映在Controller的状态面板上和Analysis统计结果中,由此可以判断数据传递的正确性。创建Vuser脚本—配置运行时设置在VuGen中,选择

Vuser

Run-timeSettings,可以设定脚本回放过程的一些参数。如IterationCount(迭代次数)、ThinkTime(思考时间)、ErrorHandling(错误处理)、Multithreading(运行方式)等。1.IterationCount(迭代次数)

选择General:RunLogic说明:设定每个Action的迭代次数。创建Vuser脚本—配置运行时设置2.ThinkTime(思考时间)选择General:ThinkTime说明:设定脚本回放时对思考时间的处理方式。创建Vuser脚本—配置运行时设置3.ErrorHandling(错误处理)选择General:Miscellaneous说明:设定遇到错误时的处理方式。Continueonerror遇到错误时继续运行。Failopentransactionsonlr_error_message执行到事务中调用的lr_error_message()函数时将事务的结果置为Failed。Generatesnapshotonerror对错误进行快照。4.Multithreading(运行方式)

选择General:Miscellaneous说明:设定脚本是以多线程方式运行还是以多进程方式运行。RunVuserasaprocess以多进程方式运行。RunVuserasathread以多线程方式运行。创建Vuser脚本—试运行脚本1.脚本录制完毕后,按F5键,或点击菜单中的按钮,可以试运行脚本。回放过程中VuGen在下方同步打印日志。2.如果需要查看不同的日志形式,可以在脚本页面菜单的vuser

runtime-settings

log选择不同的项,回放脚本时将打印不同级别的日志。创建Vuser脚本—试运行脚本3.运行结束后,系统会给出相应的运行结果,可以通过View

TestResults查看回放结果。脚本修改完善的工作完成后,将脚本以有意义的单词命名保存在约定的目录当中。定义场景脚本准备完成后,可以根据场景用例设置场景。Controller控制器提供了手动和面向目标两种测试场景。手动设计场景(ManualScenario):能够更灵活地按照需求来设计场景模型,使场景能更好地接近用户的真实使用。一般情况下使用手动场景设计方法来设计场景。面向目标场景(GoalOrientedScenario):测试性能是否能达到预期的目标,在能力规划和能力验证的测试过程中经常使用。

定义场景—创建场景Controller控制器可以从程序中打开,然后选择保存好的脚本;也可以从VuGen中直接连接到该脚本的控制场景。实例从VuGen中启动Controller的步骤:1.单击VuGen菜单栏的tools

createcontrollerscenario。2.在弹出窗口选择虚拟用户数、运行结果保存目录、负载产生的负载机所在地。定义场景—创建场景3.在CreateScenario窗口中点击OK,启动LoadRunnerController定义场景—设置场景Schedule1.设置场景的基本信息

ScheduleName:设置场景名称。

Scheduleby:选择按场景计划或按用户组计划。RunMode:运行模式2.设置场景的各类参数双击GlobalSchedule中的对应行,可以设置schedule的各类参数。在Controller的ScenarioSchedule中,可以设置场景的各项计划,如虚拟用户的加载方式、释放策略等。定义场景—设置ScheduleInitialize:初始化是指运行脚本中的Vuser_init操作,为测试准备Vuser和LoadGenerator。StartVusers:设置场景Vuser加载方式。定义场景—设置ScheduleStopVusers:设置场景执行完成后虚拟用户释放的策略。Duration:设置场景持续运行的情况。定义场景—设置集合点LR在运行场景的时候,允许测试人员根据项目需要自己设定集合点的并发策略。单击Controller菜单栏的Scenario

Rendezvous,可以查看场景中所有的集合点名称、所属脚本、当前状态和相关的虚拟用户列表信息等,根据系统需求,还可以针对集合点的执行进行设定。1.集合点设置

单击Disable/EnableRendezvous按钮可以选定集合点是否启用。

单击Disable/EnableVUser按钮可以设定一个用户是否参与到集合点中。

单击Policy按钮可以设定集合点执行策略。定义场景—设置集合点2.集合点策略设置第一项:当前所有用户数的X%到达集合点时,开始释放等待的用户并继续执行场景。第二项:当前正在运行用户数的X%到达集合点时,开始释放等待的用户并继续执行场景。第三项:当X个用户到达集合点时,开始释放等待的用户并继续执行场景。TimeoutbetweenVusers:设定一个超时时间,当第一个用户到达集合点时,系统开始计时,如果在这个设定的时间内没有达到指定的用户数,系统就不再等待,释放用户让场景继续执行。定义场景—多机联合产生负载LR允许使用多台机器运行场景来均衡测试机器的负荷。只要一台机器安装了LoadGenerator并启动了LoadRunnerAgentProcess进程,就可以被Controller统一调度来运行场景,Controller负载收集统一的测试信息和执行结果。单击菜单Scenario

LoadGenerator,可以查看到所有已经加载的LoadGenerator信息。Name:LoadGenerator所在的机器名称。Status:标识了Generator目前的状态。Platform:显示了系统的平台名称。单击Add按钮,可以添加新的LoadGenerator;单击Connect按钮,LR的Controller就会尝试去连接选中的LoadGenerator,如果连接成功就在Status字段中显示Ready,如果失败就会显示Failed。定义场景—多机联合产生负载定义场景—设置负载均衡负载均衡是用来解决测试过程中,负载机分配不均的问题。方法为:先选择Scenario

ConvertScenariotothePercentageMode,将场景模式由用户组切换为百分比,然后在已经添加好的LoadGenerators机器列表中选择需要的机器。这样就可以保证负载机均匀地对服务器施压。定义场景—设置IP欺骗IP欺骗技术就是让一个LoadGenerator上的虚拟用户模拟从不同的IP来向服务器发起请求,以达到以假乱真的目的。1.配置IPSPOOFERLR配置动态IP的工具是程序组中的一个小工具IPWizard,它能够指导用户按步骤完成配置过程。在“开始”菜单程序中,找到LoadRunner

Tools

IPWizard,运行IPWizard定义场景—设置IP欺骗Step1:选择下述一项进行设置。第一项:用于创建一个新的设置,首次运行时选用。第二项:调用以前保存的设置。第三项:将设置恢复为原始状态,此选项主要用于使用后释放IP。Step2:输入IP地址。这里主要用来检测新的IP地址加到主机中后,Server的路由表是否需要更新,如果Server和Client在一个网段可以不填。定义场景—设置IP欺骗Step3:添加新的动态IPPrivateAddressSpaces:选择测试环境的IP地址类型。FromIP:要使用IP段的第一个值。Numbertoadd:要使用的IP地址的数目。Submask:子网掩码,一般采用默认设置就可以了。LR只添加那些没有被其他用户使用的IP地址注意:IPSpoofer在连接LoadGenerators之前启用,并且各个LoadGenerator机器必须使用固定的IP,不能使用动态IP。定义场景—设置IP欺骗2.启用IP欺骗

在Controller中勾

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论