TestFocus焦点测试论坛测试人生职业发展[分享]软件测试经验与教训

4  /  5  页   12345 跳转 查看:18021

标题: [分享]软件测试经验与教训

回复: [分享]软件测试经验与教训

经验41,如果遗漏一个问题,检查这种遗漏是意外还是策略的必然结果

    如果掷币猜边时,猜的是国徽面,出现的却是字面.这是否意味着做出了差的决策?以任何理性的观点看都不是这样。除非在硬币上做了手脚,否则出现任何一回的机会都是50%。出现字面没有什么可奇怪的,只是不够幸运罢了。决策策略没有问题。

    在测试过程中没有发现程序错误时也存在同样问题,同样也会困扰客户。在研究测试策略出现了什么问题之前,先不要自责。出现遗漏,是否因为忠实地执行了好的测试策略,并只是碰巧没有发现那个特定的问题?如果是这样,可保持原有方针不变。确实有这种情况。但是,如果遗漏程序错误是因为测试策略关注了错的问题类型,可利用这个机会改进测试策略。

经验42,困惑是一种测试工具

当测试员感到困惑时,这可能是某种重要的预示。

·规格说明不清楚吗?规格说明中的模糊点,常常是为了掩盖有影响力的项目相关人员之间的重要分歧。

·产品不清楚冯?产品可能有严重问题。

·用户文档不清楚冯?产品的这个部分可能太复杂,有太多的特例和不一致性要描述。

·内部问题只是难以理解呜?我们试图自动化的有些系统具有内在的复杂性,或包含复杂的技术问题。程序员也认为它们复杂、困难,并导致自己犯遗漏、误解和过于简化的错误。

    测试员对产品、技术和一般测试问题了解得越多,自己的困惑就会成为更有力的指南针,指出重要问题所在。


在测试过程中,如果对产品一无所知,那么至少知道自己在困惑。在这种情况下,困惑可以成为最佳交付内容,即提出也许其他人没有勇气提出的问题。
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

经验43,清新的眼光会发现失效

    理解事物,是把新信息吸收到已知信息中,同时修改已知的信息以适应新信息的高智力过程。测试员在理解了产品或功能部件之后,会在头脑中形成映射,并且头脑不再那么努力工作。对于测试员来说这可能是个问题。当非常了解产品后,会对产品做出更多的假没,并更少检查这些假没。

    这种情况对于测试至少有三点提示:

·第一次接触产品或功能时,要特别注意使自己困惑和烦恼的地方。这可能    说明用户也会有类似反应。

·当与团队的新成员一起工作时,与他们一起测试。观察他们在了解产品时的反应。

·警惕陷人测试惯例。即使没有遵循严格的测试脚本,也可能对特定功能太熟悉,以至于以越来越窄的方式进行测试。在任何可能的地方引人多样性,或改由其他测试员负责。

经验44,测试员要避免遵循过程,除非过程先跟随自己

    警惕其他人的过程。测试用例和过程的描述,常常不提测试的内部设计目标。这非常容易使测试员在执行测试时并不太理解如何建立测试,或寻找什么。换句话说,测试员并没有真正跟上过程。一般来说,测试过程的编写和设计都比较差,因为没有多少优秀测试员像擅长计算机那样擅长程序设计人员的工作。如果要遵循测试过程,最好采用自己设计、自己拥有或已经完全了解的过程。

    为了得到最好结果,测试员必须掌握自己的测试,而不是自己的文档。要使过程跟随自己。


如果确信那些过程很好,也至少要研究一下过程的工作原理。请参阅《使我们聪明的事物:机器时代的人性保护》(Things that Make Us Smart : Defending Human Attributes in the Age of The Machine)(Norman l993)和《信息的社会寿命》(The Social Life of information)(BrownDuguid 2000)
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

经验45,在创建测试过程时,避免”1287”

我们中的Bach曾经见过一位测试员编写的测试过程包含在字段中输入1287个字符。1287是从哪里来的?测试员解释说.她的测试想法只不过是在一个小输入字段中,输入非常多的字符。因为她听说测试过程必须具体,因此小心地数了自己已经输入的字符数,1287,这就是过程中的这个数的由来----一个任意数,现在却被永远供奉起来,就像是印在水泥人行道上的猫的脚印一样。

    过于详细没有什么好处。当编写测试过程时,要避免与测试概念无关的细化。包含所有必要的信息和设计与解释测试所需的细节,但是要让未来的测试员有创造性和判断力地执行,让未来测试员引入变化以使现在所编写的测试过程新鲜、高效。

经验46,测试过程的一个重要成果,是更好、更聪明的测试员

    我们经常听到反对产生很少或不产生文档的测试的理由,好象测试的惟一价值就是通过测试产生的文档。这种观点忽略了测试的一种意义深远的重要产品:测试员本身。

    好的测试员永远都在学习。随着项目的进展,他们不断加深对产品的了解,逐渐从各个方面提高对产品的反应能力和敏感性。了解产品并已经经历过一两次产品发布的有经验的测试员,即使没有任何指示,但与有一套如何测试产品的书面指示的没有经验的测试员相比,他们测试的有效性也要高得多。

    软件测试领域内的一些顾问和论文作者看起来相信,只要提供测试过程,测试效果差的测试员就可以变成测试效果好的测试员。在我们看来,这是一种差的实践,这反映出他们对测试和进行有效测试的人的根本误解。


在评估测试过程时,首先要看项目测试员的素质,要看他们怎么思考,以及这种思考怎样对其行为产生影响。只有掌握了这些信息才能评估他们的工作产品。
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

经验47,除非重新发明测试,否则不能精通测试

    不要彻底改造轮子。请等一下,难道轮子不是历史上被重新发明次数最多的吗?这不是好事情吗?毕竟我们的汽车是装在充气轮胎上,而不是花岗岩圆盘上。轮子如果说不是数以百万计的话,也有数以千计的变种。也许我们可以从中得到启发。在我们看来,重新发明东西至少有两个原因:通过改造使其适应新条件,了解其工作原理。而要掌握它,这两个方面部需要。

我们有的同事忠告测试专业的学生不要重新发明测试,也不要重新发明测试思想。我们不同意这种观点。这就像是学习科学又不想做实验一样。通过其他思想家进行学习是没有错的,我们认为这样学习是很重要的。但是如果这是学习的惟一方式,那永远也不会成为测试技艺的行家。这样的人将是技术员,但不会再进一步了。按照指示做不会掌握任何东西,就像要沿高速路上火星一样。我们提倡要像伟大的机械师和伟大的程序员那样地学习测试:把东西分解,琢磨其工作原理.再以新的方式组装到一起。不要把自己限制为只是接受智慧的服务者,而应该使自己成为智慧的创造者。

在学习过程初期,要重新发明不是非常好的测试、想法、手段和文档。这是正常的。要永远使头脑运转,观察其他测试员,研究和不断评估如何筛选自己的思想。如果想要善于做到这一点,就必须实践。

我们这样做已经有很多年了,我们仍然在重新发明,仍然在反思老的想法。我们所尊敬的每个同事都是这样走向精通之路的。


至此,《软件测试经验与教训》第2章——按测试员的方式思考全部发布完毕,之后将会继续发布第三章——测试手段,希望大家能不断吸收学习,总结提高。另第三章每个经验的篇幅比较长,将会放慢速度。
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

第三章 测试手段

测试员应该做什么?在前两章中,我们的回答是观察和学习,但是这个回答相当抽象.现在该更具体一些了.测试从哪里来?测试看起来像什么?本章谈论测试手段问题,但是不会详细定义每种手段.要想得到这类信息,读者必须阅读有关测试的主要教科书.我们推荐Kaner、Falk和Nguyen(1993),Jorgensen(1995),Beizer(1990),Marick(1995),Collard(即将出版)以及Hendrickson(即将出版).Whittaker和Jorgensen的论文(1999和2000)以及Whittaker(2002)也提出了很有用的思想.

本章的结构与本书其他几章不同,这有两个原因.


·
首先,本章给出的观点基本上是结构化的,要介绍其余内容的分类系统.我们把这个分类系统放在第一条经验中.接下来的五条经验列出若干手段,但是列出的主要目的是支持分类系统.给出这些细节可使读者更容易地将分类系统用于自己的工作中.



这个分类手统综合我们单个地使用和教授的方法.使用这种结构确定哪些手段是可用的,并且适用于给定问题,或产生将这些手段结合起来有效地解决问题的思想.


手段清单有时包含超出快速描述的细节,不过找们把这部分内容当作选读材料.细节的详细程度有意不均匀.我们期望读者能够通过其他专著或课程了解大多数手段的细节.


·
第二,尽管本章并不讨论主要如何使用手段.但是不可能在讨论测试手段时不足够详细地描述一些读者会实际使用的手段。因此本章附录将采用我们在专业级研讨会和软件测试大学课程上受到学生欢迎的方法,来介绍我们认为很有用的五种手段.
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

经验48,关注测试员、覆盖率、潜在问题、活动和评估的组合测试手段


本章的主要目标是提出一种测试手段的分类系统,我们把它叫做“五要素测试系统(Five-fold Testing System) 。人们可以做的所有测试都可以在五个方面进行描述:


·
测试员。进行测试的人。例如,用尸测试是由目标市场的成员、通常使用
该产品的人应行的专项测试。


·
覆盖率。测试了哪些内容。例如,在功能测试中,要测试每个功能。


·
潜在问题。测试的原因(要测试什么风险) 。例如,测试极值错误。


·
活动。如何测试。例如探索式测试。


·
评估。怎样判定测试通过还是不通过。例如,与巳知正确结果的比较。


本章还要详细描述几个手段,并就另外几个手段的使用提出自己的观点,不过我们的主要目标还是解释分类系统。


所有测试都包括所有这五个要素。测试手段将测试员的关注点集中的一个或几个要素上,把其他要素留给测试员自己判断。可以把关注一个要素的手段与关注另一个要素的手段结合起来,以得到想要的结果。可以把这种结合的结果叫做新手段(有人确实这样叫),不过我们认为思考过程要比增加另一个名字更重要。在测试领域中,正在使用的定义不一致的手段清单正在不断膨胀。我们的分类模式有助于读者有意识地理智深刻地理解这种结合。

测试任务常常按一个要素分配,但是完成任务时要涉及所有五个要素。例如:

·有人可能要求测试员做功能测试(彻底测试每个功能) 。它说明的是要测试什么,测试员还必须决定谁来测试,以及要寻找什么问题,如何测试每个函数,如何确定程序是否通过。

·有人可能要求测试员做极值测试(测试在向变量输入极值条件下的错误处理)。它说明的是要找出什么问题。测试员还必须决定谁来测试,要测试哪些变量、如何测试这些变量,如何评估结果。

·有人可能要求测试员做ß测试(让市场的外部代表做测试) 。它说明的是谁来测试,测试员还必须决定告诉外部代表什么(告诉他们多少)、试用产品中的哪一部分、他们应该查找什么问题(应该忽略什么问题) 。在有些ß测试中,测试员还要具体地告诉他们如何识别特定类型的问题,可能要求他们以特定的方式执行特定的测试。在另外一些ß测试中,可能会由他们决定要完成的活动和评估。


手段不一定只涉及一种要素,也不应该是这样。所有测试都涉及所有五个要素,因此我们应该期望跨多个要素的更综合的测试手段。以下是多要素手段的一个例子:如果有人要求做“基于需求的测试”,则可能是表示以下三种想法的任意组合:


·
覆盖率(测试在这个需求文档中列出的所有内容)。


·
潜在问题(测试不满足这个需求的各种方式) 。


·
评估(设计测试的方式,要使得测试员能够使用需求规格说明确定程序是否通过) 。


在说到“基于需求的测试”时,不同的测试员会有这三种想法的不同组合,对这个词并不存在惟一的正确解释


尽管存在模糊性(并且在一定程度上正是因为有这种模糊性),但是我们认为这种分类系统是一种很有用的思想生成器。

测试时要时刻想着所有五个要素,就可能做出更好的组合选择。在ß测试中,可能决定不描述这些要素中的一个或多个,可以决定不确定如何评估测试结果或测试员该怎样做。但是我们的建议是,要有意识地做出类似上面提到的决定,而不是采用只关注一种要素的手段,而不注意到还要做出其他决定。

基于需求测试的多种含义,提供了软件工程中一个重要普遍问题的例子。定义在测试领域是不固定的。定义的使用在不同子领域和个人之间有很大不同,即使存在期望能被看作是参考标准的文档。我们稍后讨论使很多人无视标准文档的一些因素。请注意,我们在这里不是要声称提供权威定义,或测试领域手段的描述。有些人会使用同样的词汇表示不同的含义。其他人可能会同意我们的描述,但是却以不同的方式表达。不管哪种情况都是合理的、有说服力的。
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

经验49,关注测试员的基于人员的测试手段


以下是一些通过执行测试的人来区分的常见手段举例。


用户测试(user testing) 。由将使用该产品的典型人员进行输入的测试。用户测试可以在开发期间任何时候进行,可以在开发场地,也可以在用户场地,可以在精心指导下进行,也可以根据用户的意愿进行。有些类型的用户测试,例如任务分析,更像是联合探索(涉及至少一名用户和至少一名公司测试小组成员),而不是由一个人完成的测试。

α测试。由测试小组(可能还包括其他感兴趣的、友善的内部人员)执行的内部测试。

β测试。利用不属于开发机构并且是产品的目标市场成员的测试员实施的用户测试。待测产品一般非常接近完成。很多公司都将让客户试用代码看作是β测试,他们把所有β测试都归结为叫做“β”的里程碑。这是个错误。实际上有很多不同类型的β测试。设计β,用于要求用户(特别是有关领域的专家)评价设计,应该尽可能早地实施,以便有根据评价意见进行修改的时间。市场开发友β,用于再次确认在该产品推出并投放自己的大型销售网上时会有大量客户购买,实施时间相当晚,要等到产品相当稳定之后。兼容性测试β,客户在开发机构自己不容易测试的硬件和软件平台上运行该产品。这种测试不能太晚,否则难以确定和解决兼容性问题。对于所管理的任何类型β测试,在确定进度和实施方法之前,都要确定测试目标。


强力测试(bug bash)。利用秘书、程序员、市场开发人员和可以找到的任何人所实施的内部测试。强力测试一般持续半天,在软件接近投放市场时进行。(请注意,我们列出这种手段是为了举例,并不表示赞同。有些公司由于种种原因认为它很有用,有些公刮则认为没用。)


有关领域的专家测试(subject-matter expert testing)。向软件目标领域内的专家提供产品,并寻求反馈唐见(错误、批评和赞扬)。专家可以是,也可以不是预期使用产品的客户,公司看重的是专家的知识,而不是其市场代表性。


成对测试(paired testing) 。两个测试员在一起发现程序错误。一般情况下,他们共用一台计算机,在测试时轮流操作。



自用测试(eat your own dogfood)。全公司使用并依靠自己软件的试用版,通常要等到软件足够可靠能够实际使用时.才向市场销售。
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

经验50,关注测试内容的基于覆盖率的测试手段


可以根据在使用这些手段时已经掌握的知识的不同,把这些手段按所关注的问题进行多种不同的分类。例如,如果把功能集成测试用于检查每个功能与所有其他功能组合在一起时是否能够正常延行.则这种测试就是面向覆盖率的测试。如果有针对功能相互交互的错误理论,并想进行跟踪,则这种测试就是面向问题的测试。(例如,如果意图是想发现功能在相互传递数据时出错,就是面向问题的测试。)


我们将在本章末尾补充解释这些定义中的一些领域测试,因为与领域有关的手段在软件测试中使用得非常普遍、非常重要。读者应该对其有所了解。


功能测试(function testing) 。逐个测试每个功能。彻底测试功能,直到可以确信该功能没有问题。白盒功能测试通常叫做单元测试,集中测试可以看到代码的功能。黑盒功能测试关注命令和特性,以及用户可以做或选样的事情。在做涉及多个功能的更复杂的测试之前,最好先做功能测试。在复合测试中,第一个出现问题的功能可能会使测试停下来,阻止通过这个测试发现多个其他功能也出现问题。如果依靠复合测试而下是单个测试功能,可能要到很晚才会知道有一个功能出现问题,可能要花费大量工作在复合测试中定位,最后却发现问题出现在一个简单功能上。

特性或功能集成测试(feature or function integration testing) 。一起测试多个功能,以检查功能在一起执行的情况。

菜单浏览(menu tour) 。遍历GUI产品中的所有菜单和对话框,使用每个可用的选项。

域测试(domain testing) 。域是一个(数学)集合,包含所有可能的函数变量取值.在域测试中,要识别函数和变量。变量可以是输入或输出变量。(输入域和值域之间的数学区别在这里无关,因为这两种域的测试分析都是一样的。)对于每个变量,都要把其可能取值集合划分为等价类,并从每个类中选择少量代表(一般是边界值) 。这种方法假设如果用类中的少量好的代表值进行测试,就可以发现用类中所有成员测试所能够找出的大多数或全部问题.请注意,与功能测试形成对比的是,感兴趣的要素是变量而不是功能。很多变量被多个功能使用。进行域测试时必须分析变量,然后再根据分析,以这个变量作为输入或输出,测试涉及这个变量的每个功能。

等价类分析(equivalence class analysis) 。等价类是测试员认为是等价的一组变量取值。如果相信一组测试用例:(a)测试的都是相同的东西;(b)如果其中一个捕获到一个程序错误,其他测试用例也可能捕获到;(c)如果其中一个不能捕获到某个程序错误,其他测试用例可能也不能捕获到,则这些测试用例是等价的。一旦找出一个等价类,可只测试其一两个成员。

边界测试(boundary testing) 。等价类是一组取值。如果可以成员映射到一列数字上,则边界值就是类的最小和最大值。在边界测试中,要测试这些值,还要测试相邻类的边界值,这些值比要测试的类的最小值略小,比要测试的类的最大值略大。例如,请考虑一个接受10-50整数值的输入字段。感兴趣的边界值是10(最小整数)
、9(小于10的最大整数)
、50(最大整数)
、51(大于50的最小整数) 。
TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

最佳代表测试(best representative testing) 。等价类的最佳代表是在暴露软件中的错误的可能性方面至少与类中其他值一样的值。在边界测试中,边界值几乎总是最佳代表。但是有时不能将等价类映射到一组数字上。例如,兼容惠普PcL-5的打印机是(或应该是)一个等价类,因为这些打印机的工作方式相同。假设对于一个具体任务,其中一种打印机与其他打印机相比,略微更可能出现问题。那么这种打印机可以作为这个类的最佳代表。如果对它测试没有发现问题,那么可以比较可靠地认为其他打印机也没有问题。

输入字段测试大纲或矩阵(input field test catalogs or matrices) 。对于每种输入字段,可以开发一组相当标准的测试用例,在这个产品和后续产品中的类似字段中重用。本章稍后还要给出这种方法的例子。(请参阅“如何创建针对输入字段的测试矩阵”。)

用各种方式映射和测试编辑宇段(map and test all the ways to edit a filed)
常常可以以多种方式改变某个字段中的值例如可以把数据输入到该字段,直接在字段中输入数据,通过程序将计算好的结果复制到字段中,通过程序将再次计算好的结果复制到字段中,等等字段是有限制的(限制字段可以取哪些值)
有些限制是不变的,有些限制要依赖于其他字段的取值例如,如果JK是无符号整数,其限制就是0一直到MaxInt这些都是不变限制.依赖于程序设计语言对无符号整数的定义但是,如果N也是无符号整数,N=J+K,N=5在这种情况下,J=5-KJ不能大于5(N的值)
这是可变限制,其所允许的取值范围取决于N的值为了检查J是否在所允许的取疽范围内(5—K),可以使用各种能够把数据输入到J中的方法改变J的取值

逻辑测试(logic testing) 。变量在程序中有关系。例如,程序可能有这样一个决策规则:如果PERSON-AGE大于50,并且如果SMOKERYES,则OFFER-INSURANCE必须是NO。这种决策规则表达了一个逻辑关系。逻辑测试试图检查程序中的所有逻辑关系。因果图(cause-effect graphing)是一种用于设计大量基于逻辑测试的手段。

基于状态的测试(state-based testing) 。程序的状态要发生转换。在给定状态中,有些输入是有效的,其他输入被忽略或拒绝。对于有效输入,被测程序要完成它可以做的事,并且不尝试做它不能做的事。在基于状态的测试中,每次都要通过经过大量状态迁栘(状态改变)并仔细检查结果来检验程序。

TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 

回复: [分享]软件测试经验与教训

路径测试(path testing) 。一条路径包含测试员所执行的所有步骤,或程序为了得到正确状态所通过的所有语句。路径测试包括测试通过程序的很多路径。通过非平凡程序的所有路径是不可能的。因此,有些测试员进行子路径测试(subpath testing),测试很多部分路径。例如,基本路径测试(basis-path testing)包括测试一定类型(基本路径)的大多数或全部假设,这里采用的假设是如果测试了所有基本路径,那么几乎没有更长的路径会找出这些测试所遗漏的问题。


语句与分支覆盖率(statement and branch coverage)。如果测试执行了程序中的所有语句(或代码行),则达到100%的语句覆盖率。如果执行了所有语句和一个语句到另一个语句之间的所有分支,则达到100%的语句和分支覆盖率。设计自己的测试,达到高的语句与分支覆盖率,有时叫做“基于覆盖率的测试(coverage-based testing)” 。(达到覆盖率目标后,可以停止测试,或停止设计更多的测试) 。把它叫做语句与分支覆盖率,是为了与关注其他类型覆盖率的测试相区别。配置覆盖率就是一个很好例子,这种手段执行同一条语句很多次,但是潜在产生非常不同的结果。其他例子还有很多很多(Kaner 1995a) 。关注达到高语句与分支覆盖率的测试往往遗漏很多类型的问题,例如(但不限于)与以下因素有关的程序错误:遗漏代码、边界值处理不正确、时序问题、硬件和软件配置兼容件问题,诸如指针越界、内存泄漏或栈破坏等最终导致栈溢出的滞后暴露问题、可使用性问题,以及其他方面没有满足客户需求的问题。这种手段在标识不完备测试方面(哪些代码还没有侧试过)要更有价值得多,而不是在所需测试量的最低标准方圆。的确,让测试员停止测试只是因为达到了X%的覆盖率,这样做很危险(Marick 1999) 。

配置覆盖率(configuration coverage) 。如果必须测试100台打印饥的兼容性,并且已经测试了10,就达到10%的打印机覆盖率。更一般地,配置覆盖率度量测试员已经运行(并且程序已经通过)的配置测试占计划运行的配置测试总数的百分比。为什么要把它叫做测试手段?一般我们只是将它看作是已经完成了多少一定类型测试的度量。但是,有些测试员完成的一系列特殊测试,可以更快、更容易地完成大量配置测试。对于他们来说,优化工作以达到高的覆盖率,是一种测试手段。


基于规格说明的测试(specification-based testing) 。这种测试关注验证在规格说明中所做的有关产品的每个事实声明。(事实声明是可以用真或假表示的任何语句。)常常包括手册、市场开发文档或广告、技术支持人员寄给客户的印刷品中的所有声明。


基于需求的测试(requirements-based testing) 。测试关注证明程序满足需求文档中的所有需求(或关注逐个需求地证明某个需求没有被满足。)


组合测试(combination testing) 。相互组合测试两个或更多变量。本章最后的“测试手段附录”还要讨论这个问题。组合测试很重要,但是很多测试员对这种测试研究得还很不够。通过程序得到的大部分好处都基于很多变量的交互。如果不在测试中一起改变这些变量,就会遗漏由不同的组合(而不是不同的单个取值)触发的错误。

TestFocus焦点测试网

助力软件测试行业,推动软件测试发展
引用
 
4  /  5  页   12345 跳转

版权所有 焦点测试网   Sitemap 免责声明

Powered by Discuz!NT 2.0.1115    Copyright © 2001-2009 Comsenz Inc.
Processed in 0.125 second(s) , 6 queries.
返顶部