赞
踩
1、 xmind 思维导图评审,主要是测试人员 2、测试用例需要评审,测试人员,开发人员,产品人员 3、需求文档,项目组所有的人员,都会到场
3.4 有没有写过测试计划,具体包括哪些内容?
参考答案 1: 测试计划内容: (1)目的和范围 (2)规程 (3)测试方案和方法 (4)测试的准入和准出 (5)测试计划(流程、时间安排、对应人员) (6)测试的环境配置和人员安排 (7)交付件 华测教育专属 华测教育专属 华测教育专属 华测教育专属 华测教育专属 华测教育专属 华测教育专属 华测教育专属 华测教育专属 15 参考答案 2 我们公司之前按照考核要求写过测试计划,不过后面老大觉得太耽误工作进度, 后面一般都不再写测试计划,而是写版本计划,这个在版本计划,每个人的任务列出来, 负责人列出来,自己根据自己的情况分配时间,然后汇总,大家一起开个小会评审就可以了。
3.5 用例包含哪些部分,哪些用例设计方法,你一般常用哪些方法?
原来我们用例包含 测试项目,用例编号、测试标题、优先级、预置条件、操作步骤、测试数据、预期结果 黑盒测试用例设计方法:主要是等价类、边界值、错误推测法、判定表、因果图、正交表、 流程分析法、状态迁移法、异常分析法。 常用的:等价类、边界值、判定表、流程分析法、错误推测法。 等价类是指某个输入域的子集合,在该子集合中, 各个输入数据对于揭露程序中的错误都是等效的, 并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试,因此,可以把全部 输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件, 就可以用少量代表性的测试数据取得较好的测试结果, 等价类划分可有两种不同的情况有效等价类和无效等价类。 边界值的话就是对等价类划分方法的补充。测试工作经验告诉我,大量的错误往往是发生在输入或输 出范围的边界上而不是发生在输入输出范围的内部,因此的话针对各种边界情况来设计测试用例,可 以查出更多的错误,使用边界值分析方法设计测试用例的话,首先应该确定边界情况,通常输入和输 出等价类的边界,就是应着重测试的边界情况应当选取正好等于,刚刚大于或刚刚小于边界的值作为 测试数据,而不是选取等价类中的典型值或任意值作为测试数据。 对于错误推断法,这个是基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的去设计测试用例的方法的,主要就是列举出程序中所有可能有的错误和容易发生错误 的特殊情况去根据这些情况来选择测试用例,例如,在单元测试时曾列出的许多在模块中常见的错误 以前产品测试中曾经发现的错误等,这些就是经验的总结。还有,输入数据和输出数据为 0 的情况。 输入表格为空格或输入表格只有一行。这些都是容易发生错误的情况,可选择这些情况下的例子作为 测试用例。 前面介绍的等价类划分方法和边界值分析方法都是着重考虑输入条件但都没有考虑输入条件之间的 联系,相互组合等等的情况。考虑输入条件之间的相互组合,可能会产生一些新的情况, 但是要检查输入条件的组合并不是一件容易的事情,即使把所有输入条件划分成等价类, 他们之间的组合情况也相当多,因此的话可以考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例,这就需要用到因果图(逻辑模型)。 因果图方法最终生成的就是判定表它适合检查程序输入条件的各种组合情况。
3.6 TestLink 工具使用?
(1)创建用户,并给新创建的用户指定权限。 (2)创建测试用例,对测试用例进行增、删、改、查 (3)把测试用例关联到对应的测试计划中。 (4)把测试用例指派给对应的测试人员。 (5)对应的测试人员,查看被指派的测试用例,并执行测试用例。
3.7 如何提交一个好的 BUG
对 BUG 有一个清晰明了的描述; 详细描述 BUG 重现的步骤 对于产生 BUG 的环境进行描述; 提交 BUG 相关的图片和日志; 定位好 BUG 的等级; 将预期结果与实际结果进行对比。
3.8 提 bug 需要注意哪些问题?
3.9 bug 怎么管理的,bug 的生命周期或者是 bug 的状态
原来 bug 是用禅道来管理的 原来我们公司 bug,提交 bug 直接给对应的开发人员,对应开发人员修复完成,交给测试复测, 复测通过关闭 bug,不通过打回给对应开发。 提交-开发人员(已激活未确认)-开发进行确认,状态变成已激活,已确认,开发修复完成, 标注状态是已修复,测试人员复测通过,已关闭,打回给对应开发,已经激活。
3.10 提交 bug 包含哪些内容
所属产品、所属模块、所属项目、影响版本、指派人员 截止日期、严重程度、优先级、bug 类型、bug 环境 Bug 标题、重现步骤、附件
3.11 你提交的 bug,开发不认可怎么办?
首先我会再看需求文档,是不是我的理解有误,如果是我对需求理解错的话我就去关闭 bug。 如果是 bug 再去让其他测试人员看看听下他们的意见,然后自己先再三去复测,并目保存好截图和日 志,确定这是一个 bug 之后我就去跟开发说明白,并且给他看 bug 重现的截图以及日志,如果开发还 是不认可的话我就跟产品或项目经理说明白情况。
3.12 对应无法重现 bug,应该怎么处理?
首先,我会多测几次,测了好多次都无法重现的话我就先把 bug 挂起,并且留意一下,看看往后的测 试中,如果在后面的测试中重现 bug 就激活,如果经过几个版本都还没发现的话就关闭 bug。
3.13 界面中的乱码可以是哪里导致的?
(1)数据库中的编码设置 (2)前端页面编码 (3)后台代码也会编码
3.14 bug 的级别有哪些,级别如何判断
1、致命:对业务有至关重要的影响,业务系统完全丧失业务功能,无法再继续进行, 或业务系统丢失了业务数据且无法恢复,影响公司运营的重要业务数据出错。 2、严重:对业务有严重的影响,业务系统已经丧失可部分的重要的业务功能,或业务系统 丢失了业务数据且可以恢复,一般业务数据出错。 3、一般:对业务有较小的影响,业务系统丧失了较少的业务功能, 例如:界面错误,打印或显示格式错误。 4、提示:对业务没有影响,不影响业务过程正常进行, 例如:辅助说明描述不清楚,提示不明确的错误提示。
3.15 测试中,如何判断是前端的 bug 还是后端的 bug 呢?
通常可以利用抓包工具来进行分析。可以从三个方面进行分析:请求接口、传参数、响应。 1)请求接口 un 是否正确如果请求的接口 ur 错误,为前端的 bug 2)传参是否正确如果传参不正确,为前端的 bug 3)请求接口 u 和传参都正确,查看响应是否正确如果响应内容不正确,为后端 bug 4)也可以在浏览器控制台输入 js 代码调试进行分析
3.16 项目上线后发现 bug,测试人员应该怎么办
看严重级别:严重还是不严重 严重的:紧急变更上线 不严重:修复好后跟下个版本一起上线 用户会通过运维反馈到项目组这边,项目经理会根据功能模块的负责人,分给对应的开发与测试。 测试人员:编写对应的测试用例、测试环境中重现 bug、提交 bug、 交给开发进行修复、修复完成 bug、进行 bug 的复测。 如果测试环境无法重现,可以导入生产环境的包到测试环境中测试, 还是不能复现,查看生产环境的日志去定位问题。
3.17 如何保证质量
(1)需求要吃透,多问,多去了解。 (2)严格按照测试流程去执行:多考虑用户测试场景,使用测试用例设计方法,多评审。 (3)要有良好的测试执行:要求用例执行率达到 100%,多轮测试,进行探索性测试, 需要测试之间交叉测试,用工具来管理我们的测试工作(禅道, testlink, excel,tapd) (4)不断的反思与提升。
3.18 产品是怎么上线的?
一般我们会选择晚上上线,开发测试还有产品全部到场,进行上线测试。 首先,开发将代码打包到生产环境的服务器中,如果数据表有变化,就会运行 sql 文件, 对表的一些操作,接着,我们测试就开始先测试主体业务功能以及新增的功能模块; 测试通过之后,我们会在界面上把上线测试的数据删除,正常上线。 如果发现 bug,开发人员当场修复 bug,修复成功之后我们测试再复测,通过就可以正常上线 如果发现了 bug 开发人员在上线规定时间之前都还没有修复好的话,就看问题的严重性, 如果严重就延期上线,如果我们是迭代版本的话我们还需要版本回滚。 如果不严重,产品跟客户觉得可以上线,就正常上线。
11.1 ui 自动化怎么测试
(1)我们做 U 自动化测试使用 Python+ seleniun+ unittest 工具 主要对自动化进行规划,把数据、代码、资源、公共方法进行分离,方便后续维护; 具体是通过元素定位、断言、参数化和封装来实现; 其中元素定位的方法,主要是 css 定位,也会用一些 xpath 定位,还有 id、name、 class 等 断言,主要是用 Assert 来判断实际结果是否与预期结果相符; 参数化,可以用列表、字典、导入 excel 表格库(xlrd)对数据进行参数化; 对于封装,一般我会对元素还有公共的模块进行封装。 比方说:原来我们有一个申请借款的功能模块 首先我们先进行自动化框架分类,分成测试数据、需要定位的元素、公共方法(比如说,一些数据的 操作、excel 操作,我们会封装成一个公共方法)。先采用 css 定位,把申请借款所对应的元素定位 出来,里面有很多内嵌页面,还有下拉框元素的定位操作,对应申请借款的数据,我们都会保存在 excel 表中,从 excel 表格中去获取数据。申请完成以后,我们会设置一个断言,还有进行数据库的 检查。我们会把元素封装到资源库,还有就是模块的封装,申请借款会用到登录模块,我们首先会封 装好登录功能。借款申请完成后,会从数据库中删除相关的数据实现数据闭环,再关闭界面。 运行自动化脚本,我们是用 unittest 框架去运行,编写测试集,一般我们是编写 unittest 脚本, 去执行所有测试用例。 我觉得自动化中最难的在于元素的定位、内嵌界面、时间控件,这些需要一些 js 操作去除元素属性, 进行操作。 自动化中发现的问题: 在申请借款中,开发人员写了调试代码的弹出框,没有删除,导致我们自动化脚本跑不通 充值过程中, 添加新的支付方式,开发修改了代码,导致原有充值失败,这些都是我们原来自动化发现的问题。原 来也用了一些 Robotframework 的自动化测试框架,这个比较简单一些,因为部分关键字、框架已经 封装好了,只需要调用就行,但是不好的地方,就是扩展性会差一些。 编写完成以后,可以用 Jenkins 持续集成去定时跑自动化测试用例,再去查看运行日志。 总的来说 RF( Robot Framework)比较简单方便上手比较快,如果公司对自动化要求不高的话可以选 择 RF 框架来做,如果比较高的话就选用 unittest 框架来做。 (2)原来我们自动化测试主要是用的 python+ selenium+ pytest 框架做的 主要对自动化进行规划,把数据、代码、资源、公共方法进行分离,方便后续维护; 自动化测试其实主要通过几个方面元素定位,参数化,断言,模块的封装,数据闭环等来实现的 其中元素定位主要是 cs 定位也会用一些 xpath,id,name,classname,ink 等等定位,还有 js 定位 和 jQuery 定位都会用到; 参数化主要是用列表、字典、以及导入 excel 表格库(xlrd)对数据进行参数化; 断言:主要是用 assert 断言来判断实际结果是否与预期结果相符; 对于封装,我主要会对界面上的元素,一些公共方法(数据库操作,读取 excel 数据公共方法等),还 有测试数据(变量,字典,列表 exce 表等)和一些元素操作,测试用例等等进行封装; 最后闭环的话,就是都要把新增的数据删除,打开的界面都要关闭,就比如原来我们做的自动化测试, 有一个申请借款的功能模块, 首先,我们先进行自动化框架模块的分类划分,分成需要定位的元素 page_element,公共模块 common(比如说数据库操作,读取 excel 数据的操作,都会封装成一个公共模块的)、测试数据 data、 测试用例、元素操作 element_action、执行用例以及报告文件等等这些模块。 先导入 selenium 包,采用 css 定位,把申请借款所对应的元素定位出来,里面有一些内嵌界面,需 要先进入内嵌界面 --driver.switch_to.frame(),还有下拉框元素的定位操作(定位下拉框的话首先 要导入 select 包,通过 index,value,visible_text 进行 选取值: Select(变量). Select_by_value(‘’)把定位到的所有界面元素封装到 page_element 模 块里面,方便后期维护。 对于申请借款的数据,申请借款的一些标题,利率等等,我们都会保存在 excel 表中,对于 excel 表格操作,导入 xlrd 包把读取数据公共方法,保存到公共模块 common 中,方便以后从 exell 表中 获取数据,申请借款成功以后,我们会添加一个断言,获取界面 title 值,去判断界面的提示,当然 也可以获取提示申请成功 text 内容去判断,也会做数据库断言,检查数据库数据,导入数据库操作 包 pymysql,把数据操作,封装到公共方法, 去调用(数据库操作步骤:1 打开数据库连接,2 建立游标,3 执行游标(sql),4 返回获取的数据) 申请借款模块需要调用到登录模块,我们先把登录模块封装好,放到元素操作 element_action 模块 中,方便维护,借款申请完成后,我们会从数据库中删除相关数据实现闭环,减低后续维护,再关闭 所有打开的界面。 我们运行自动化脚本的时候是用的 pytest 框架进行 导入 patent,导入 yamail 包 定义一个主函数 if _name_=“_main_”,pytest.main()所有的用例脚本,定义生成对应的 HTML 报告 到 report 目录下,最后通过 yagma 定义发送邮件 定义发送邮箱的登录信息-定义邮件主题,内容,附件位置–发送邮件到测试人员邮箱中 当后续出现错误用例,也会调用 pytest–if 来运行失败的测试用例 我觉得自动化中最难的在于 元素的定位、内嵌界面、时间插件,这些需要一些 js 操作,去除元素属性,进行操作自动化中发现的问题: 在申请借款中,开发人员写了调试代码的弹出框,没有删除,导致我们自动化脚本跑不通; 充值过程中,添加新的支付方式,开发修改了代码,导致原有充值失败
11.2 什么是自动化测试?
把一些简单,重复的工作,用自动化去实现,减少成本原来手工完成事情,通过自动化脚本去替代
11.3 什么样的项目合适做自动化(至少三个)
功能需求,需求稳定,界面稳定,不会频繁变动,才可以做 版本迭代次数比较多,做出来才有意义 项目周期比较长(大项目)意义
11.4 自动化测试流程是什么?
1、前期项目组会评估项目是否合适做自动化测试,例外就是看下哪些模块需要做自动化,适合做 2、人员安排,分工 3、确定测试框架 4、各自领取自己负责模块(根据功能来进行划分,功能测试的模块) 整理功能模块的用例,把能做自动化的用例提炼出,规整成自动化用例文档, 准备数据,整理数据,管理 资源,环境的准备 5、搭建测试环境 6、脚本开发
11.5 自动化实现的比例,1-2 年。
2 年以内,把原来手工做的事情 15-30%用自动化脚本去替代 2 年以上,实现 40-70%
11.6 自动化测试用例的来源
手工编写测试用例 把原来手工的测试用例,当成自动化测试用例
11.7 自动化测试的优点与缺点
优点: 1、对程序的回归测试更方便 2、可以运行更多更繁琐的测试 3、提高测试效率和准确性,节约时间成本 4、可以执行一些手工测试困难或不可能进行的测试(例如,对于大量用户的测试,可以通过自动化测 试模拟同时有许多用户,从而达到测试的目的) 5、自动化测试不存在执行过程中的疏忽和错误,从而增加软件信任度 缺点: 1、不能取代手工测试 2、手工测试比自动测试发现的缺陷更多 3、对测试质量的依赖性极大 4、由于自动测试比手动测试更胞弱,所以维护会受到制,从而会制约软件的开发 5、工具本身无想像力
11.8 你们自动化覆盖率有多少?
2 年以内,把原来手工做的事情 30%用自动化脚本去替代 2 年以上,实现 40-70% 当时覆盖的确实也不是很多,差不多 30-40%的样式吧
11.9 自动化测试环境的搭建是怎样的?
1、首先要安装 Python 2、然后安装编写代码工具 pycharm 3、导入 selenium 库(pip install seleniun 在 pycharm 安装 selenium3 下载源码包 4、下载浏览器驱动(谷歌.火狐等),把驱动程序发到 Python 根目录下
11.10 seleniun 的原理是什么?
我们用的 selenium3x 以上的版本,对于 selenium2x 以上的版本原理是这样的: Selenium2.0 则是把 selenium1.0 中 selenium RC 替换为了 WebDriver WebDriver 利用浏览器原生的 API,封装成一套更加面向对象的 SeleniumWeb Driver API 直接操作浏览器页面里的元素,甚至操作浏器本身(截屏,回口大小,启动,关闭,安装插件,配置 证书之类的),由于使用的是浏览器原生的 API 速度大大提高,而且调用的稳定性交给了浏览器厂商 本身,显然是更加科学,然而带来的一些副作用就是,不同的浏器厂商,对 Web 元素的操作和呈现多 少会有一些差异,这就直接导致了 SeleniumWebDriver 要分浏览器厂商不同,而提供不同的实现, 例如 Firefox 就有专门的 FirefoxDriver, Chrome 就有专门的 ChromeDriver 等等
11.11 Selenium2 与 Selenium1 的区别是什么?
Selenium1.0 使用的是 Javascript 注入技术与浏览器打交道,需要 Selenium 启动一个 Server,将 操作 Web 元素的 AP 调用转化为一段段 Javascript,在 Selenium 内核启动浏览器之后注入这段 Javascript,开发过 Web 应用的人都知道, Javascript 可以获取并调用页面的任何元素,自如的进 行操作,由此才实现了 Selenium 的目的:自动化 Web 操作,这种 Javascript 注入技术的缺点是速 度不理想,而且稳定性大大依赖于 Selenium 内核,对 API 翻译成的 Javascript 质量高低 Selenium2.0 则是把 selenium1.0 中 selenium RC 替换为了 Web Driver WebDriver 利用浏览器原生的 API,封装成一套更加面向对象的 SeleniumWebDriverAPI 直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装播件,配 置证书之类的),由于使用的是浏览器原生的 AP,速度大大提高,而且调用的稳定性交给了浏览器厂 商本身,显然是更加科学,然而带来的一些副作用就是,不同的浏览器厂商,对 Web 元素的操作和呈 现多少会有一些差异,这就直接导致了 SeleniumWebDriver 要分浏览器厂商不同,而提供不同的实 现例 Firefox 就有专门的 Firefox Driver, Chrome 就有专门的 ChromeDriver 等等
11.12定位元素的 8 个方法是什么?
1、通过 id 定位 find_element_by_id() 2、通过 name 定位 find_element_by_name() 3、通过 class name 定位 find_element_by_class_name() 4、通过 css 定位 find_element_by_css_selector() 5、通过 link 定位 find_element_by_link_text(‘文本’)没有空格一般 a 链接 6、通过 partial_link 定位 find_element_by_partial_link_text(部分文本)–般有空格 a 链接 7、通过 xpath 定位 find_element_by_xpath() 8、通过 tag_name 定位 find_element_by_tag_name()
11.13 定位不到元素,你碰到过哪些?
怎么解决的? 1、像页面加载延迟的问题,这个需要通过等待延迟的方式来处理。 2、不过有时候,页面加载完成,但是元素暂时还不可见,导致定位不成功 这个可以选择使用显示等待来处理,这里需要用到 WebDriverWait 类来实现 3、还有就是像内嵌网页的问题,需要使用 driver.switch_to.frame(name/index)这个函数来跳转到 处理。 4、还有要注意多窗口问题,动态 id 问题等的问题,对于多窗口处理,可以使用 driver.switch_to.window()的方式来进行处理,而对于动态 id 的问题,需要注意的是有些 id 跟数 字有关,可能会动态变化,可以使用 xpath 也可以使用 css_select 属性定位或者样 式定位,或者可以通过父元素来找元素,或者通过兄弟节点来找对应的元素。等等 5、还有要特别注意滚动条的问题,这里通过调用 js 代码来实现的,driver.execute_script(js) 6、再这就是有时候会碰到某些元素的是不可见的,比如 display 属性为 none 这就需要通过 java Script 修改 display 的值。 js ='document. querySelectorAll(“select”)[1]. style. display=“block”; driver.execute_script(js)
11.14 元素定位,有时候定位得到,有时候定位不到,可能是什么原因,你会怎么处理?
1、可能是网络问题,导致页面加载延迟,这个可以做延迟等待,一般选择隐式等待,在脚本前面加 上 driver.implicitly_wait(20)。 2、也有可能是页面结构发生变化导致的,这个时候最好选择通过 xpath 或 css 结合属性进行或者样 式定位可能会好点,或者采用 JQuery 定位的方式来进行定位元素
11.15 对于不可见/隐藏的元素,你如何定位,如何处理?
我们可以通过 javaScript 修改 display 的值,来实现 #修改元素的属性 #我们需要通过 javaScript 修改 display 的值。 js='document.querySelectorAll(‘select’)[1].style.display=“block”;’ driver.execute_script(js)
11.16 如果元素经常变动你怎么做?
1,少用绝对路径,多用 css 或者 jQuery 定位 2,单个元素属性进行封装
11.17 自动化如何破解验证码
1,开发去掉验证码 2,开发设定一个万能验证码 3,python 导入 pillow 和 OCR 模块 pytesseract
11.18 数据驱动有没有了解过,具体怎么做的?
1、其实就是把数据与脚本分离,好处就是方便维护管理,后期数据有变动,只要改 excel 表的数据就可以,脚本不用动 2、封装一个读取 excel 表格的函数方法,调用这个函数来读取数据。 3、然后利用 ddt 模型,使用 dt 内部装饰器来实现数据引用 我们当时就是这么做的。
11.19 参数化的类型有哪些?
自动化脚本如何实现数据的参数化? 把测试数据,通过变量或者文件进行保存,通过修改文件或者变量,达到数据参数化目的 测试过程,减低数据维护成本 1、像测试用例数据这块,我们都是放在 excel 表格中的 2、常用的变化比较小的配置数据,比如数据库连接的配置,报告的路径,用例的路径等等 这些放在 config 配置文件中,利用全局变量来管理的。对于全局变量的数据,直接导入 config 某块, 调用就可以。目的是以便于测试数据改变时,直接修改变量就行了
11.20 随机数如何操作?
1.首先都要 import random 随机整数: random randint(10002000),有时需要转化成字符串类型: str(random randint(1000, 2000)) 随机字符串:“join( random.sample(‘abcdefghijk’6)),有时前面固定字母了: ‘ldh’+”.join(random sample(‘abcdefghijk’,6))
11.21 自动化中如何去操作 excel 表格?
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数软件测试工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上软件测试开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-Peb1pxF7-1712855647967)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。