版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
软件测试与改错——掌握有效测试的方法与技术王晓辉maconi@126.co
spm060701@126.com
华北电力大学计算机系目录1.测试的常识与道理2.测试的分类与比较3.测试人员的组织4.企业的测试策略5.测试规范6.软件产品的主要测试内容及技术7.改错的方法8.小结世上不存在没有缺陷的软件1.测试的常识与道理1.1你真的懂测试吗
编程大师说:没有错误的程序世间难求。(《编程之道》)你在学校里学过测试吗?(读到博士可能也不懂测试)你所在的企业重视测试吗?(小公司程序员的技能更加全面)临时抱佛脚行吗?你以为有文档模板就会测试了吗?
如果不懂得有效地进行测试,你不仅得不到功劳,也没人欣赏你的苦劳,你拥有最多的将只是疲劳。
职业软件工程师应当掌握需求开发、系统设计、编程、测试、维护所有技能。1.2测试的目的是什么测试的目的是为了发现尽可能多的缺陷,不是为了说明软件中没有缺陷。
推论:成功的测试在于发现了迄今尚未发现的缺陷。所以测试人员的职责是设计这样的测试用例,它能有效地揭示潜伏在软件里的缺陷。千万不要将“测试”与“演示”混为一谈。例如科研鉴定会。如果产品通过了严格的测试,大家不要不吭气,应当好好地宣传一把。1.测试的常识与道理1.3一些常识和经验之谈测试能提高软件的质量,但是提高质量不能依赖测试。
测试只能证明缺陷存在,不能证明缺陷不存在。“彻底地测试”难以成为现实,要考虑时间、费用等限制,不允许无休止地测试。我们应当祈祷:软件的缺陷在产品被淘汰之前一直没有机会发作。测试的主要困难是不知道如何进行有效地测试,也不知道什么时候可以放心地结束测试。每个开发人员应当测试自己的程序(份内之事),但是不能作为该程序已经通过测试的依据(所以项目需要独立测试人员)。80-20原则:80%的缺陷聚集在20%的模块中,经常出错的模块改错后还会经常出错测试应当循序渐进,不要企图一次性干完,注意“欲速则不达”。2.测试的分类与比较2.1测试方式白盒测试:关心软件内部设计和程序实现,主要测试依据是设计文档黑盒测试:不关心软件内部,只关心输入输出,主要测试依据是需求文档2.2测试阶段单元测试、集成测试、系统测试、验收测试。是“从小到大”、“由内至外”、“循序渐进”的测试过程,体现了“分而治之”的思想。
单元测试的粒度最小,一般由开发小组采用白盒方式来测试,主要测试单元是否符合“设计”。
集成测试界于单元测试和系统测试之间,起到“桥梁作用”,一般由开发小组采用白盒加黑盒的方式来测试,既要验证“设计”又要验证“需求”。
系统测试的粒度最大,一般由独立测试小组采用黑盒方式来测试,主要测试系统是否符合“需求规格说明书”。
验收测试与系统测试非常相似,主要区别是测试人员不同,验收测试由用户执行。
2.测试的分类与比较2.3开发与测试的V型关系如果软件开发过程采用严格的瀑布模型,那么开发与测试有“V”型的对应关系。需求开发
高层设计详细设计编程单元测试集成测试系统测试验收测试2.测试的分类与比较2.4测试内容接口与路径测试。
功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试…测试阶段
主要依据
测试人员、测试方式
主要测试内容
单元测试系统设计文档由开发小组执行白盒测试
接口测试、路径测试
集成测试系统设计文档需求文档由开发小组执行白盒测试和黑盒测试
接口测试、路径测试功能测试、性能测试
系统测试需求文档由独立测试小组执行黑盒测试
功能测试、健壮性测试、性能测试、用户界面测试、安全性测试、压力测试、可靠性测试、安装/反安装测试
验收测试需求文档由用户执行黑盒测试
2.测试的分类与比较2.5问题问题1:有了“黑盒”测试为什么还要“白盒”测试?黑盒测试只能观察软件的外部表现,即使软件的输入输出都是正确的,却并不能说明软件就是正确的。因为程序有可能用错误的运算方式得出正确的结果,例如“负负得正,错错得对”,只有白盒测试才能发现真正的原因。(举一个学生作业的例子)白盒测试能发现程序里的隐患,象内存泄漏、误差累计问题。在这方面,黑盒测试存在严重的不足。
问题2:由于单元测试要写测试驱动程序,非常麻烦,能否等到整个系统全部开发完后,再集中精力进行一次性地单元测试呢?如果这样做,在开发过程中,缺陷会越积越多并且分布得更广、隐藏得更深,反而导致测试与改错的代价大大增加。最糟糕的是无法估计测试与改错的工作量,使进度失去控制。因此为图眼前省事而省略单元测试或者“偷工减料”,是“得不偿失”的做法。问题3:如果每个单元都通过了测试,把它们集成一起难道会有什么不妥吗?集成测试是否多此一举?要把N个单元集成一起肯定靠接口耦合,这时可能会产生在单元测试中无法发现的问题。例如:数据通过不同的接口时可能出错;几个函数关联在一起时可能达不到预期的功能;在某个单元里可以接受的误差可能在集成后被扩大到无法接受的程度。所以集成测试是必要的,不是多此一举。问题4:在集成测试的时候,已经对一些子系统进行了功能测试、性能测试等等,那么在系统测试时能否跳过相同内容的测试?不能!因为集成测试是在仿真环境中开展的,那不是真正的目标系统。再者,单元测试和集成测试通常由开发小组执行。根据测试心理学的分析,开发人员测试自己的工作成果虽然是必要的,但不能作为成果已经通过测试的依据。2.测试的分类与比较2.5问题问题5:既然系统测试与验收测试的内容几乎是相同的,为什么还要验收测试?首先是“信任”问题。对于合同项目而言,如果测试小组是开发方的人员,客户怎么能够轻易相信“别人”呢?所以当项目进行系统测试之后,客户再进行验收测试是情理之中的事。否则,那是客户失职。不论是合同项目还是非合同项目,软件的最终用户各色各样(如受教育程度不同、使用习惯不同等等)。测试小组至多能够模仿小部分用户的行为,但并不具有普遍的代表性。
问题6:能否将系统测试和验收测试“合二为一”?系统测试不是一会儿就能做完的,比较长时间的用户测试很难组织。用户还有自己的事情要做,他们为什么要为别人测试呢?即使用户愿意做系统测试,他们消耗的时间、花费的金钱大多比测试小组的高。系统测试时会找出相当多的软件缺陷,软件需要反反复复地改错。如果让用户发现“内幕”,一是丢脸,二是会吓跑买主。所以还是关起门来,先让测试小组做完系统测试的好。
3.测试人员的组织3.1了解开发人员的测试心理测试的目的是找出尽可能多的缺陷。所以测试是“破坏性”的,而开发却是“建设性”的。开发人员总是喜欢欣赏程序的成功之处,而不愿看到失败之处。让开发者去做“蓄意破坏”的测试,就象杀自己的孩子一样难以接受。开发者对自己的程序印象深刻,并总以为是正确的(自信是应该的)。倘若在设计时就存在理解错误,或因不良的编程习惯而流下了隐患,他本人很难发现这类错误.开发者对自己的程序的功能、接口十分熟悉,他自己几乎不可能因为使用不当而引发错误,这与大众用户的情况不太相似,所以测试自己的程序不具备典型性。
结论:开发人员应当测试自己的程序,这是他分内的工作。但是开发人员在测试自己的程序时,很难做到客观、公正,所以自我测试不具有说服力。
3.2如何组织测试人员:应当视企业的人力资源而定条件特别好的公司,可以为每一个开发人员分配一名独立的测试人员。这样的测试人员职业化程度很高,可以完成单元测试、集成测试和系统测试工作,能够实现开发与测试同步进行。条件比较好的公司,可以设置一个独立的测试小组,该测试小组轮流参加各个项目的系统测试。而单元测试、集成测试工作由项目的开发小组承担。条件一般的公司,养不起独立的测试小组。单元测试、集成测试工作由项目开发小组承担。当项目进展到系统测试阶段,可以从项目外抽调一些人员,加上开发人员,临时组织系统测试小组。条件比较差的公司,也许只有一个项目和为数不多的一些开发人员。那么就让开发人员一直兼任测试人员的角色,相互测试对方的程序。如果人员实在太少了,只好让开发者测试自己的程序,有测试总比没有测试好吧!3.测试人员的组织3.3避免开发人员与测试人员产生矛盾开发人员的注意事项:不要敌视测试人员。要理解测试的目的就是发现缺陷,是测试人员的工作职责。不要以为测试人员吃饱了没事干,存心找茬。不要轻视测试人员,别说人家技术水平差,不配搞开发只好搞测试。测试人员的注意事项:发现缺陷时不要嘲笑开发人员,别说他的程序真臭、到处是Bug。在开发人员压力太大时或心情不好时不要火上浇油,发现缺陷时别大声嚷嚷。请留意另一种极端:如果测试人员与开发人员的关系非常好,可能会导致在测试的时候“手下留情”,这对项目也是一种伤害。
4.企业的测试策略4.1理念:企业的主要目的是获取利润,降低测试成本也是盈利的一种方式。用较低的代价实现有效的测试,不应为了追求完美的测试而不失一切代价。4.2如何合理地减少测试工作量减少冗余的测试白盒测试与黑盒测试的方式虽然不同,但往往有“异曲同工”之妙。在很多地方,白盒测试与黑盒测试会产生一模一样的效果(或者能推理出来),这样的测试是冗余的。在集成测试、系统测试阶段,可能要执行多次“回归测试”。每一次“回归测试”都会存在不少的冗余,应当设法剔除不必要的重复测试工作。
减少无价值的测试无价值的测试通常是由于不懂得测试技术引起的。例如功能测试,在等价区间之中,本来只要测试一个典型的输入就行了,如果有人在此区间测试了100次,那么其中99次就是无价值的。
如何“偷工减料”有一些“短、平、快”的项目,经费本来就少,用户对质量要求也马马虎虎。为了能多挣一点钱,开发方不得不采用“偷工减料”的方式来降低测试代价。偷工减料的途径无非就是减少测试的内容和频度。但不能砍得太狠,否则软件拿不出手。基本方法是找出软件中需要优先测试的部分(见下表),其它次要部分可以忽略或将来再测试。
4.企业的测试策略“偷工减料”方法的测试优先级:哪些功能是软件的特色?
哪些功能是用户最常用的?
如果系统可以分块卖的话,哪些功能块在销售时最昂贵?
哪些功能出错将导致用户不满或索赔?哪些程序是最复杂、最容易出错的?哪些程序是相对独立,应当提前测试的?哪些程序最容易扩散错误?哪些程序是全系统的性能瓶颈所在?哪些程序是开发者最没有信心的?
4.3测试何时结束基于测试用例的规则基于“测试期缺陷密度”的规则基于“运行期缺陷密度”的规则4.4测试奖励机制根据缺陷的危害程度,把奖金分等级。每个新缺陷对应一份奖金,把奖金发给第一个发现该缺陷的人。奖金额要适当,太低了人们不感兴趣,太高了会让项目破产的。5.测试规范5.1测试流程第一步:制定测试计划。该计划被批准后转向第二步。第二步:设计测试用例。该用例被批准后转向第三步。第三步:如果满足“启动准则”,那么执行测试。
第四步:撰写测试报告。
第五步:消除软件缺陷。如果满足“完成准则”,那么正常结束测试。制定测试计划设计测试用例执行测试撰写测试报告消除软件缺陷审批审批回归测试完成测试完成准则启动准则5.测试规范5.2测试启动准则同时满足以下条件,允许开始测试:(1)测试计划已经制定并且通过了审批;(2)测试用例已经设计并且通过了审批;(3)被测试对象已经开发完毕并等待测试。
5.3测试完成准则对于非严格系统可以采用“基于测试用例”的准则。同时满足以下条件允许结束测试:(1)功能性测试用例通过率达到100%;(2)非功能性测试用例通过率达到90%时。对于严格系统,应当补充“基于测试期缺陷密度”的规则:(3)相邻n个CPU小时内“测试期缺陷密度”全部低于某个值m。例如n大于10,m小于等于1。5.4测试文档模板测试计划参考模板测试用例参考模板测试报告参考模板5.5测试计划的参考模板5.6测试用例5.7测试报告的参考模板6.软件系统的主要测试内容及技术6.1接口与路径测试6.2功能测试6.3健壮性测试6.4性能测试6.5用户界面测试6.6信息安全测试6.7压力测试6.8可靠性测试6.9安装/反安装测试6.软件系统的主要测试内容及技术6.1接口与路径测试数据一般通过接口输入和输出,所以接口测试是白盒测试的第一步。每个接口可能有多个输入参数,每个参数有“典型值”、“边界值”、“异常值”之分,所以输入的组合数可能并不少。根据接口的定义,可以推断某种输入应当产生什么样的输出。输出包括函数的返回值和输出参数。如果实际输出与期望的输出不一致,那么说明程序有错误。白盒方式的接口测试和黑盒方式的功能测试,其方法十分相似。一个函数体内的语句可能只有十几条,但逻辑路径可能有成千上万条。想遍历测试几乎是不可能的,不测试或者胡乱找几条路径测试却又不行。对于非严格系统而言,在分析路径方面化费很多精力是不值得的。我认为在构造接口测试的同时已经建立了测试路径。因为每一种输入将产生唯一的输出,输入与输出之间的路径也是唯一的。由于接口测试中的输入是有代表性的,因此相应的路径也具有代表性,不用得着费煞苦心地去找测试路径。路径测试的检查表数据类型、变量值、逻辑判断、循环、内存管理、文件I/O、错误处理由于接口测试是枚举的,有可能漏掉某些状况,导致一些重要的路径没有被测试。预防措施有:观察是否有程序语句从来没有被执行过。如果发生在这种情况,要么是程序有错误,存在无用的代码;要么是接口测试不充分,漏掉了一些路径。要特别留意函数体内的错误处理程序块(如果存在的话),这是最易被人疏忽的路径,隐患最多。6.软件系统的主要测试内容及技术接口与路径测试用例的参考模板6.软件系统的主要测试内容及技术6.2功能测试功能测试的基本方法是构造一些合理输入(在需求范围之内),检查输出是否与期望的相同。如果两者不一致,即表明功能有误。也有例外的情况,如《需求规格说明书》中的某个功能写错了,而实际上软件的功能却是正确的,这时要更改的是《需求规格说明书》。功能测试看起来比较简单,只要看得懂《需求规格说明书》,谁都会做。难点在于如何构造有效的输入。由于输入空间通常是无限的,穷举测试显然行不通。那么随便输入一些东西,碰运气行不行?功能测试有两种比较好的测试方法:等价划分法和边界值分析法。等价划分是指把输入空间划分为几个“等价区间”,在每个“等价区间”中只需要测试一个典型值就可以了。等价划分法来源于人们的直觉与经验,可令测试事半功倍。“缺陷遗漏在角落里,聚集在边界上”。边界值测试法是对等价划分法的补充。如果A和B是输入空间的边界值,那么除了典型值外还要用A和B作为测试用例。例如测试函数f(x)=根号(x)。凭直觉,等价区间应是(0,1)和(1,+∞)。可取典型值x=0.5以及x=2.0进行“等价划分”测试。再取x=0以及x=1进行“边界值”测试。6.软件系统的主要测试内容及技术功能测试用例的参考模板6.软件系统的主要测试内容及技术6.3健壮性测试健壮性是指在异常情况下,软件还能正常运行的能力。健壮性有两层含义:一是容错能力,二是恢复能力。容错性测试通常构造一些不合理的输入来引诱软件出错,例如:(1)输入错误的数据类型。如“猴”年“马”月。(2)输入定义域之外的数值。粗暴一些方式俗称“大猩猩”测试法。除了不能拳打脚踢嘴咬外,什么招术都可以使出来。例如在测试客户机-服务器模式的软件时,把网络线拔掉,造成通信异常中断。恢复测试重点考察一下几项:(1)系统能否重新运行;(2)有无重要的数据丢失;(3)是否毁坏了其它相关的软件硬件。6.软件系统的主要测试内容及技术健壮性测试用例的参考模板6.软件系统的主要测试内容及技术6.4性能测试性能测试即测试软件处理事务的速度,一是为了检验性能是否符合需求,二是为了得到某些性能数据供人们参考(例如用于宣传)。有时人们关心测试的“绝对值”,如数据送输速率是每秒多少比特。有时人们关心测试的“相对值”,如某个软件比另一个软件快多少倍。在获取测试的“绝对值”时,我们要充分考虑并记录运行环境对测试的影响。例如网络环境、计算机主频,总线结构和外部设备都可能影响软件的运行速度。
性能测试的一些注意事项:不要试图让人拿着钟表去测时间,应当编写一段程序用于计算时间以及相关数据。应当测试软件在标准配置和最低配置下的性能。为了排除干扰,应当关闭那些消耗内存、占用CPU的其它应用软件(如杀毒软件)。不同的输入情况会得到不同的性能数据,应当分档记录。例如传输文件的容量从100K到1M可以分成若干等级。由于环境的波动,同一种输入情况在不同的时间可能得到不同的性能数据,可以取其平均值。6.软件系统的主要测试内容及技术性能测试用例的参考模板6.软件系统的主要测试内容及技术6.5用户界面测试绝大多数软件拥有图形用户界面。图形用户界面的测试重点是正确性、易用性和视觉效果。在评价易用性和视觉效果时,主观性非常强,应当考虑多个人的观点。用户界面测试用例的参考模板:6.软件系统的主要测试内容及技术6.6信息安全测试信息安全性(security)是指防止系统被非法入侵的能力,既属于技术问题又属于管理问题。信息安全性测试有如下步骤:(1)为非法入侵设立目标,例如“盗窃某个文件”或“更改数据库记录”等。(2)邀请(或悬赏)一些人扮演黑客,让他们想尽办法入侵系统,实现“目标”。(3)如果有人成功了,请他详述入侵的过程。别忘了给予奖励。信息安全性测试用例的参考模板6.软件系统的主要测试内容及技术6.7压力测试压力测试也叫负荷测试,即获取系统能正常运行的极限状态。了解“极限”是很有价值的,例如潜艇下潜极限深度…。压力测试的主要任务是:构造正确的输入,使劲折腾系统却让它刚好不瘫痪。
压力测试的一个变种是敏感测试。在某种情况下,微小的输入变动会导致系统的表现(如性能)发生急剧的变化。敏感测试目的是发现什么样的输入可能会引发不稳定现象。
压力测试用例的参考模板6.软件系统的主要测试内容及技术6.8可靠性测试可靠性是指在一定的环境下、在给定的时间内、系统不发生故障的概率。由于软件不像硬件那样可以“加速老化”,按此定义,软件可靠性测试可能会花费很长时间。比较实用的办法是,让用户使用该系统,记录每一次发生故障的时刻。计算出相邻故障的时间间隔,注意要去掉非工作时间。这样我们可以方便地统计出不发生故障的“最小时间间隔”、“最大时间间隔”和“平均时间间隔”。其中“平均时间间隔”会让人们大体了解到系统“可靠”的程度。6.软件系统的主要测试内容及技术6.9安装/反安装测试安装/反安装测试的目的:避免“大风浪都挺过来了,却在阴沟里翻了船”目前市面上有非常流行的、专门制作安装/反安装程序的一些工具,如InstallShelled。制作安装/反安装程序不再是件难事,关键是不要麻痹大意。主要测试工作:(1)至少在标准配置和最低配置两种环境下测试;(2)如果有安装界面,应当尝试各种选项,如选择“全部”、“部分”、“升级”等。7.改错的方法7.1要有勇气改错改错是个大悲大喜的过程,一天之内可以让人在悲伤的低谷和喜悦的颠峰之间跌荡起伏。如果改过了成千上万个程序错误,那么少男少女们不必经历失恋的挫折也能变得成熟起来。
软件中的错误通常只有开发者自己才能找出并改掉。如果因畏惧而拖延,会让你终日心情不定,食无味,睡不香。所以长痛不如短痛,要集中精力对付错误。
东北有个林场工人,工作勤奋,一人能干几个人的活。前三十年是伐树劳模,受到周总理的接见。忽有一天醒悟过来,觉得自己太对不起森林,决心补救错误。后三十年成了植树劳模,受到朱总理的接见。若能以此大勇来改错,正是无往而不胜也。我们软件开发人员应当向这位可敬的林场工人学习。7.改错的方法7.2对症下药改错的第一步是找出错误的根源,如同医生治病,必须先找出病因才能“对症下药”。改错过程很像侦破案件,有些坏事发生了,而仅有的信息就是它的确发生了。我们必须从结果出发,逆向思考。一旦找到了根源,我们就知道如何改正了。有人问阿凡提:“我肚子痛,应该用什么药?”阿凡提说:“应该用眼药水,因为你眼睛不好,吃了脏东西才肚子痛。”
根据软件错误的症状推断出根源并不是件容易的事,因为:
(1)症状和根源可能相隔很远。也就是说,症状可能在某一个程序单元中出现,而根源实际上在很远的另一个地方。高度耦合的程序结构加剧了这种情况。
(2)症状可能在另一个错误被纠正后暂时性消失。
(3)症状可能并不是由某个程序错误直接引发的,如误差累积。
(4)症状可能是由不太容易跟踪的人工错误引起的。
(5)症状可能时隐时现,如内存泄漏。
(6)很难重新产生完全一样的输入条件,难以恢复“错误的现场”。
(7)症状可能分布在许多不同的任务中,难以跟踪。
人们把寻找错误根源的过程称为调试(debugging)。
7.改错的方法7.3硬件的调试方法硬件调试据说继承了中医的“望闻听切”诊断方法:(1)望,即用眼睛查看哪些地方是否有破损。(2)闻,即用鼻子闻哪些地方是否有烧焦的味道。(3)听,即用耳朵听哪些地方是否有异常的噪声。(4)切,即用手触摸哪些地方是否异常发烫。据有经验的电器修理工说,“望闻听切”这4招能解决大部分问题。通常软件改错要比硬件改错的代价低,因为后者经常抛弃原来的东西。7.4软件的调试方法软件调试的基本方法是“粗分细找”。对于隐藏得很深的Bug,我们应该运用归纳、推理、“二分”等方法先“快速、粗略”地确定错误根源的范围,然后再用调试工具仔细地跟踪此范围的源代码。如果没有调试工具,那么只好用“土办法”:在程序中插入打印语句如printf,观
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学语文六年级上册教案
- 企业财务审计管理中的风险控制
- 海洋资源验收管理办法
- 企业团队建设行政人事部策略
- 民生改善提案管理办法
- 互联网金融服务招投标合同模板
- 汽车物流仓储协议
- 建筑空调工程延期合同协议书
- 专利权交易合同
- 河道综合治理工程合同
- 上海市虹口区2024学年第一学期期中考试初三物理试卷-教师版
- 2024-2025学年八年级上学期英语期中模拟试卷(译林版+含答案解析)
- (档案管理)消防安全档案
- 陕西省渭南市临渭区渭南市三贤中学2024-2025学年高一上学期11月期中考试生物试题(无答案)
- 期中模拟检测(1-3单元)2024-2025学年度第一学期苏教版一年级数学
- 四川省食品生产企业食品安全员理论考试题库(含答案)
- 期中考试(1-4单元)(试题)-2024-2025学年六年级上册数学西师大版
- 2024年广西安全员C证考试题库及答案
- 财政学-第16章-政府预算与预算管理体制
- 期末测试卷(试题)-2024-2025学年人教PEP版(2024)英语三年级上册
- 2024至2030年中国手机配件产业需求预测及发展趋势前瞻报告
评论
0/150
提交评论