自动化测试的难点实施的注意点有哪些?

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
自动化测试实施步骤和最佳实践.doc 14页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
自动化测试实施步骤和最佳实践.doc
你可能关注的文档:
··········
··········
自动化测试实施步骤和最佳实践一个故事: ??????我在很多软件公司工作过,公司规模有大有小,也和来自其他公司的人员交流,因此经历过或者听说过影响自动化测试效果的各种各样的的问题。本文将提供若干方法规避可能在自动化测试中出现的问题。我先给大家讲一个故事,以便各位了解自动化测试会出现哪些问题。 ??????以前,我们有一个软件项目,开发小组内所有的人都认为应该在项目中采用自动化测试。软件项目的经理是AnitaDelegate。她评估了所有可能采用的自动化测试工具,最后选择了一种,并且购买了几份拷贝。她委派一位员工——JerryOverworked负责自动化测试工作。Jerry除了负责自动化测试工作,还有其他的很多任务。他尝试使用刚刚购买的自动化测试工具。当把测试工具应用到软件产品测试中的时候,遇到了问题。这个测试工具太复杂,难于配置。他不得不给测试工具的客户支持热线打了几个电话。最后,Jerry认识到,他需要测试工具的技术支持人员到现场帮助安装测试工具,并找出其中的问题。在打过几个电话后,测试工具厂商派过来一位技术专家。技术专家到达后,找出问题所在,测试工具可以正常工作了。这还算是顺利了。但是,几个月后,他们还是没有真正实现测试自动化,Jerry拒绝继续从事这个项目的工作,他害怕自动化测试会一事无成,只是浪费时间而已。 ??????项目经理Anita把项目重新指派给KevinShorttimer,一位刚刚被雇佣来做软件测试的人员。Kevin刚刚获得计算机科学的学位,希望通过这份工作迈向更有挑战性的、值得去做的工作。Anita送Kevin参加工具培训,避免Kevin步Jerry的后尘——由于使用测试工具遇到困难而变得沮丧,导致放弃负责的项目。Kevin非常兴奋。这个项目的测试需要重复测试,有点令人讨厌,因此,他非常愿意采用自动化测试。一个主要的版本发布后,Kevin准备开始全天的自动化测试,他非常渴望得到一个机会证明自己可以写非常复杂的,有难度的代码。他建立了一个测试库,使用了一些技巧的方法,可以支持大部分的测试,这比原计划多花费了很多时间,不过,Kevin使整个测试工作开展的很顺利。他用已有的测试套测试新的产品版本,并且确实发现了bug。接下来,Kevin得到一个从事软件开发职位的机会,离开了自动化的岗位。 ??????AhmedHardluck接手Kevin的工作,从事自动化测试执行工作。他发现Kevin留下的文档不仅少,并且没有太多的价值。Ahmed花费不少时间去弄清楚已有的测试设计和研究如何开展测试执行工作。这个过程中,Ahmed经历了很多失败,并且不能确信测试执行的方法是否正确。测试执行中,执行失败后的错误的提示信息也没有太多的参考价值,他不得不更深的钻研。一些测试执行看起来仿佛永远没有结束。另外一些测试执行需要一些特定的测试环境搭建要求,他更新测试环境搭建文档,坚持不懈地工作。后来,在自动化测试执行中,它发现几个执行失败的结果,经过分析,是回归测试的软件版本中有BUG,导致测试执行失败,发现产品的BUG后,每个人都很高兴。接下来,他仔细分析测试套中的内容,希望通过优化测试套使测试变得更可靠,但是,这个工作一直没有完成,预期的优化结果也没有达到。按照计划,产品的下一个发布版本有几个主要的改动,Ahmed立刻意识到产品的改动会破坏已有的自动化测试设计。接下来,在测试产品的新版本中,绝大多数测试用例执行失败了,Ahmed对执行失败的测试研究了很长时间,然后,从其他人那里寻求帮助。经过商讨,自动化测试应该根据产品的新接口做修改,自动化测试才能运转起来。最后,大家根据新接口修改自动化测试,测试都通过了。产品发布到了市场上。接下来,用户立刻打来投诉电话,投诉软件无法工作。大家才发现自己改写了一些自动化测试脚本,导致一些错误提示信息被忽略了。虽然,实际上测试执行是失败的,但是,由于改写脚本时的一个编程错误导致失败的测试执行结果被忽略了。这个产品终于失败了。 ????这是我的故事。或许您曾经亲身经历了故事当中某些情节。不过,我希望你没有这样的相似结局。本文将给出一些建议,避免出现这样的结局。   问题   这个故事阐明了几个使自动化测试项目陷入困境的原因:   1.自动化测试时间不充足:根据项目计划的安排,测试人员往往被安排利用自己的个人时间或者项目后期介入自动化测试。这使得自动化测试无法得到充分的时间,无法得到真正的关注。   2.缺乏清晰的目标:有很多好的理由去开展自动化测试工作,诸如自动化测试可以节省时间,使测试更加简单,提高测试的覆盖率,可以让测试人员保持更好的测试主动性。但是,自动化测试不可能同时满足上述的目标。不同的人员对自动化测试有不同的希望,这些希望应该提出来,否则很可能面对的是失望。   3.缺乏经验
正在加载中,请稍后...您所在的位置: &
自动化测试的方法
自动化测试的方法
余昭辉等译
机械工业出版社
《自动化软件测试实施指南》讲解什么是自动化测试,为什么要进行自动化测试,以及实施自动化测试过程中的各种方法和需要注意的问题。第1章,什么是有效的自动化软件测试(AST)?本章描述了什么是自动化软件测试。本节说的是自动化测试的方法。
1.2&& 自动化测试的方法
当有效地实施了AST时,它不完全是对图形用户界面(GUI)的捕捉和回放(但是许多人是这样理解的),也不局限于某一特定阶段的测试,同时也不是专门针对任何特定厂商的产品,它适应AUT(Application Under Test,被测试的应用)使用的特定架构或语言。
本书描述的AST是过程无关的、技术无关的,并且环境无关的。遵循本书描述的实施建议,就可以实施AST,而不管是使用瀑布模型、测试驱动开发模型、Scrum或任何其他类型的软件开发模型,而且不管是测试Web应用或面向服务架构的方案,也不论你的应用运行在Linux上、Mac上或Windows上,它与环境、OS和平台都无关。
如果有效地实施了AST,则可以支持下面环境的应用:
在多台计算机上运行。
使用不同的编程语言。
在不同类型的操作系统或平台上运行。
无论是否有GUI(例如,消息接口的测试,没有GUI)。
运行任何网络协议,如TCP / IP、DDS协议等。
在开发自动化测试框架时,以下几点应该铭记在心。它应该:
对多个商业测试工具的集成提供支持,无论是开源的、自主开发的,还是来自不同的供应商(即使是市场上出现的最新的和更好的可以使用的产品)。
支持无须在与SUT相同计算机上安装框架就可以进行测试。
同时支持正在开发的新应用和遗留应用。
支持整个测试生命周期(但并不是为了使用AST,就需要在整个测试生命周期中应用)。
支持在跨多台计算机上和各种系统工程环境中进行分布式测试。
如果适用,则支持在多个程序之间复用AST框架和组件。
AST的实现需要一个小型的开发生命周期,包括测试需求、自动化框架的设计和构建、自动化测试的实施/验证以及执行。如果做得正确,AST将产生可重用且可扩展的框架和组件。应该应用并遵守软件开发中的最佳实践。
尽管某些程序和AUT有相似的测试自动化需要和许多共同点,然而其他一些程序需要独特的、个性化的AST实现。有效实现的自动化测试框架可以适应这些独特的需求。
图1-1显示的是已经用我们所描述的自动化框架方法实现的例子。在这里,我们通过在Linux和Windows平台上运行测试演示跨平台兼容性。此外,我们还展示了将各种工具作为自动化框架的一部分集成起来。在这个例子中,我们使用了Testplant的Eggplant和VNCRobot作为测试工具。我们还使用了软件测试自动化框架/软件测试自动化引擎(STAF/ STAX),并将该AST框架成功地集成进我们的自动化测试框架中。STAF/STAX是开源、跨平台、支持多语言、围绕可复用组件(称为服务,如进程调用、资源管理、记录和监测)的思想设计的。STAF消除了从零开始构建自动化基础设施的冗长和乏味。STAF框架为构建高层次方案提供了基础,并提供一种插件的方式对广泛的平台和语言提供支持。STAF/STAX已经被证明非常有用,而且我们已经成功地将其集成进我们自己的自动化框架里了。
AST的实现一般需要根据具体的AUT需要做适当的调整,这依赖下面的各种准则。
AUT的测试生命周期阶段
当在软件测试生命周期开始时有各种参与自动化的方式,也许是在单元测试阶段,与之形成对照的是仅仅在快结束的时候参与,还可能在用户验收测试阶段。在STL中越早应用AST越好。以便在后续的阶段中复用测试工件,而且已经证明,在系统测试生命周期中越早发现缺陷,修复该缺陷的代价就越小。
AUT的进度和时间表
根据进度和时间表,可以实现或多或少的AST综合方案,也就是说,时间越多,测试覆盖率越高,测试自动化的百分比越高,分析可以越详细等。
有效的AST会调整它的实现以适应AUT的技术需求。如果适用,AST工具应该可以在Windows与Linux上应用,或在实时环境与静态环境中应用,并且都是兼容的。
AUT的复杂性
通常,AUT越复杂,就需要更详尽的AST工作。基于AUT的复杂性,我们需要不同的AST方法和策略。
AUT的使命的重要性和风险
AUT使命的重要性和风险会影响AST的工作。
我们认识到每个程序的独特性,需要为具体的AUT需要来调整AST,但又不依赖于这些需求,有效的AST框架的实现可以适应各种环境。有效的AST可以在极其重要的阶段和里程碑中应用,并且与程序实现的类型无关,这些将在第9章详述。
我们的目标是可以在各种程序中应用AST,但不用为每个程序从零开始开发AST框架,并且使用可以在任何组织或程序中易于调整的轻量级过程。
【责任编辑: TEL:(010)】&&&&&&
关于&&&&的更多文章
FastDFS是一款类GoogleFS的开源分布式文件系统,它用纯C语言实现
本书描述了黑客用默默无闻的行动为数字世界照亮了一条道路的故事。
讲师: 8人学习过讲师: 28人学习过讲师: 18人学习过
《Swift 开发手册:技巧与实战》分为6 章,第1 章介绍
PowerShell是微软的新命令行Shell和脚本语言,承诺会
Python 是一门常用的编程语言,它不仅上手容易,而且
本书为《Eclipse从入门到精通》一书的全新改版。本书以最新的Eclipse 3.2作为写作版本。全书分为5篇:起步篇介绍了Eclipse及相关
51CTO旗下网站如果要实施自动化测试,在项目的什么阶段介入比较好? - 知乎3被浏览608分享邀请回答03 条评论分享收藏感谢收起1174人阅读
自动化测试
自动化测试设计简介
&&&&&&& 我们在本章提供的信息,对自动化测试领域的新人和经验丰富的老手都是有用的。本编描述最常见的自动化测试类型,还描述了可以增强您的自动化测试套件可维护性和扩展性的“设计模式”。还没有使用这些技术的、有经验的自动化测试工程师会对这些技术更加感兴趣。
&&&&&&& 您应该测试应用程序中的哪些部分?这取决于您的项目的各种影响因素:用户的期望,时间期限,项目经理设置的优先事项等等。但是,一旦项目边界定义完成,作为测试工程师,你必须做出要测试什么的决定。
&&&&&&& 为了对Web应用的测试类型进行分类,我们在这里创建了一些术语。这些术语并不意味着标准,但是这些概念对web应用测试来说非常典型。
l 测试静态内容
&&&&&& 静态内容测试是最简单的测试,用于验证静态的、不变化的UI元素的存在性。例如:
&&&&&&&&&& o每个页面都有其预期的页面标题?这可以用来验证链接指向一个预期的页面。
&&&&&&&&&& o应用程序的主页包含一个应该在页面顶部的图片吗?
&&&&&&&&&& o网站的每一个页面是否都包含一个页脚区域来显示公司的联系方式,隐私政策,以及商标信息?
&&&&&&&&&& o每一页的标题文本都使用的&h1&标签吗?每个页面有正确的头部文本内吗?
您可能需要或也可能不需要对页面内容进行自动化测试。如果您的网页内容是不易受到影响手工对内容进行测试就足够了。如果,例如您的应用文件的位置被移动,内容测试就非常有价值。
l 测试链接
&&&&&&&&&& Web站点的一个常见错误为的失效的链接或链接指向无效页。链接测试涉及点各个链接和验证预期的页面是否存在。如果静态链接不经常更改,手动测试就足够。但是,如果你的网页设计师经常改变链接,或者文件不时被重定向,链接测试应该实现自动化。
l 功能测试
&&&&&&&& 在您的应用程序中,需要测试应用的特定功能,需要一些类型的用户输入,并返回某种类型的结果。通常一个功能测试将涉及多个页面,一个基于表单的输入页面,其中包含若干输入字段、提交“和”取消“操作,以及一个或多个响应页面。用户输入可以通过文本输入域,复选框,下拉列表,或任何其他的浏览器所支持的输入。
&&&&&&& 功能测试通常是需要自动化测试的最复杂的测试类型,但也通常是最重要的。典型的测试是登录,注册网站账户,用户帐户操作,帐户设置变化,复杂的数据检索操作等等。功能测试通常对应着您的应用程序的描述应用特性或设计的使用场景。
&&&&&&& 功能描述如果不涉及到经常变得的UI,最有效的方式是根据多种不同的使用场景分别设计自动化测试用例,如果UI各个元素经常变动,不适合自动化,有些UI的变动,可能会影响到原来自动化测试逻辑的变动。
l 测试动态元素
&&&&&&&& 通常一个网页元素都有一个唯一的标识符,用于唯一地定位该网页中的元素。通常情况下,唯一标识符用HTML标记的’id’属性或’name’属性来实现。这些标识符可以是一个静态的,即不变的、字符串常量。它们也可以是动态生产值,在每个页面实例上都是变化的。例如,有些Web服务器可能在一个页面实例上命名所显示的文件为doc3861,并在其他页面实力上显示为doc6148,这取决于用户在检索的‘文档’。验证文件是否存在的测试脚本,可能无法找到不变的识别码来定位该文件。通常情况下,具有变化的标识符的动态元素存在于基于用户操作的结果页面上,然而,显然这取决于Web应用程序。
下面是一个例子:
&input id =&addForm:_ID74:_ID75:_ID76& checkbox& type=&checkbox& value=&true& /&
这是一个HTML标记的复选框,其中id(addForm:_ID74:_ID75:_ID76& checkbox)是一个动态生成的值。这个页面下次被打开时,复选框ID将可能是一个不同的值。
l Ajax的测试
Ajax是一种支持动态改变用户界面元素的技术。页面元素可以动态更改,但不需要浏览器重新载入页面,如动画,RSS源,其他实时数据更新等等。Ajax有不计其数的更新网页上的元素的方法。但是了解AJAX的最简单的方式,可以这样想,在Ajax驱动的应用程序中,数据可以从应用服务器检索,然后显示在页面上,而不需重新加载整个页面。只有一小部分的页面,或者只有元素本身被重新加载。
l 断言assert与验证verify
&&&&&&&&&&&&& 什么时候使用断言命令,什么时候使用验证命令?这取决于你。差别在于在检查失败时,你想让测试程序做什么。你想让测试终止,还是想继续而只简单地记录检查失败?
&&&&&&&&&&&&& 这需要权衡。如果您使用的断言,测试将在检查失败时停止,并不运行任何后续的检查。有时候,也许是经常的,这是你想要的。如果测试失败,你会立刻知道测试没有通过。TestNG和JUnit等测试引擎提供在开发测试脚本时常用的插件,可以方便地标记那些测试为失败的测试。优点:你可以直截了当地看到检查是否通过。缺点:当检查失败,后续的检查不会被执行,无法收集那些检查的结果状态。
&&&&&&&&&&&& 相比之下,验证命令将不会终止测试。如果您的测试只使用验证,可以得到保证是—假设没有意外的异常—测试会被执行完毕,而不管是否发现缺陷。缺点:你必须做更多的工作,以检查您的测试结果。也就是说,你不会从TestNG和JUnit得到反馈。您将需要在打印输出控制台或日志文件中查看结果。每次运行测试,你都需要花时间去查看结果输出。如果您运行的是数以百计的测试,每个都有它自己的日志,这将耗费时间。及时得到反馈会更合适,因此断言通常比验证更常使用。
l 权衡:assertTextPresent,assertElementPresent和assertText
您现在应该熟悉这些命令及使用它们的机制。如果没有,请参阅相关章节。在构建你的测试时,你需要决定
&&&&&&&& o只检查在页面上的文本吗?(verify/ assertTextPresent)
&&&&&&&& o只检查是否在页面上存在HTML元素吗?即文本,图像,或其他没被检查的内容,只要和HTML标记相关。(verify/ assertElementPresent)
&&&&&&&& o需要同时检查元素和它的文本内容?(verify/ assertText)
没有正确的答案。这取决于您的测试要求。如有疑问,请使用assertText,因为这是最严格的类型检查点。您可以随后更改它,但至少你不会遗漏任何潜在的故障。
Verify/ assertText是最特殊的测试类型。HTML元素(标签)或文本的不符合都会导致测试失败。也许你的网页设计师经常改变页面面,而你不希望在他们改变页面时,你的测试失败,因为这是期望中的周期性变更。但是,假如你仍然需要检查的页面上的东西,如段落、标题文本或图像。在这种情况下,您可以使用verify/ assertElementPresent。这将确保一个特定类型的元素存在(如果使用XPath,可以确保它相对页面内其他对象的存在)。但你不关心的内容是什么,你只关心某个特定的元素,比方说,一个图片在一个特定的位置。
随着时间的推移和经验的积累,如何决定使用还是非常简单的。
定位元素的策略
l 选择一个定位策略
有多种方式选择页面上的对象。但面对这些定位类型,如何权衡呢?回想一下,我们定位一个对象的方式:
o元素的name属性
oXPath语句
o通过一个链接的文本
o文档对象模型(DOM)
使用元素的ID或name定位符,在测试执行方面来说,是最有效的方式。也让你的测试代码更具可读性,如果在页面源代码中的ID或name属性被友好命名的话。XPath语句需要更长的时间来处理,因为浏览器必须运行它的XPath处理器。在Internet Explorer 7,XPath出了名的慢。
使用链接的文本进行定位是很方便的,并运行起来也不错。这种技术只适用于链接。另外,如果链接文本很可能会经常改变,使用&a&标签定位元素将是更好的选择。
不过,有时你必须使用XPath定位。如果一个页面元素没有一个ID或者name属性,除了XPath定位没得选择。(DOM定位器不再普遍使用,因为,XPath可以做得更好。DOM定位器只简单地为遗留测试而存在)。
相对使用ID或name属性定位,使用XPath进行定位有一个独特的优势。使用XPath(DOM)中,你可以找到页面上相对于其他对象的一个对象。例如,如果有一个链接必须存在&div&标签里的第二个段落内,您可以使用XPath进行定位。使用ID和name属性定位,你只能得出它们存在指定的页面,而不知具体的页面位置。如果你必须测试显示公司标志的图像出现在页面顶部的头部分,XPath定位可能是更好的选择。
&& |定位动态元素:
&&& 正如前面测试类型部分所述,动态元素的页面标识在不同的页面实例上市不同的。例如,
& &a class=&button& id=&adminHomeForm& onclick=&return oamSubmitForm('adminHomeForm','adminHomeForm:ID38');& href=&#&&View Archived Allocation Events&/a&
这个HTML锚标记定义了一个ID属性为“adminHomeForm”按钮。和大部分HTML标签相比,这是一个相当复杂的锚标记,但它仍然是一个静态标签。每次页面被浏览器加载时,HTML将保持不变。它的ID在所有的页面实例里保持不变,也就是说,页面被展示时,这个UI元素总是有同样的标识符。所以,点击此按钮的测试脚本(Selenium Server)如下所示:
selenium.click(&adminHomeForm&);
然而,你的应用程序,可能生成动态的HTML标识符。在不同的网页实例中,标识符发生改变。例如,一个动态的页面的HTML元素可能会是这个样子:
id=&addForm:_ID74:_ID75:0:_ID79::0:checkBox&
type=&checkbox&
name=&addForm:_ID74:_ID75:0:_ID79:0:checkBox&
value=&true&
这是一个复选框,id和name属性都是addForm:_ID74:_ID75:0:_ID79:0:checkBox。在这种情况下,使用标准的定位,测试脚本应该是这样子的:
selenium.click(&addForm:_ID74:_ID75:0:_ID79:0:checkBox&)
对于动态生成的标识符,这种做法行不通。下一次页面加载时,标识符将是一个不同的值,执行上述脚本会遇到“element not found”错误。
要更正该问题,一个简单的解决办法是使用XPath定位替代ID定位器。因此,对于该复选框,可以简单地使用
selenium.click(&//input&);
或者,如果它不是在页面上的第一个文本输入域,尝试一个更详细的XPath语句。
selenium.click(&//input[3]&);
selenium.click(&//div/p[2]//input[3]&);
但是,如果你确实需要使用ID来定位元素,可以换一种不同的解决方案,可以先捕捉到网站的这个ID,然后使用它,例如:
String [] checkboxids = selenium.getAllFields();
for (String checkboxid:checkboxids){
& & & if(checkboxid.contains(&addForm&)){
&&&&&& selenium.click(expectedText);
如果页面上只有一个复选框的ID文本为:“ExpectedText”时,这种方法工作。
l 定位Ajax元素
定位、验证AJAX元素的最好的方式是使用Selenium 2.0 webdriver的API,它专门解决Selenium 1.0测试AJAX元素的一些限制。
在Selenim 2.0中,可以使用waitfor()方法来等待一个页面元素变得可用。该参数是一个WebDriver用来实现定位的By对象。这是WebDriver的章节中详细解释。
在Selenium 1.0(Selenium-RC的)中,要做到这一点需要编写更多的编码,但它并不难。首先检查元素,如果它存在,等待预定义的时间段,然后再重新检查。这在循环内执行,如果超过一个预定的超时,元素不存在则终止循环。
让我们考虑页面上实现AJAX效果的一个链接(链接= ajaxLink),可以使用循环处理:
for(int& second=0;;second++){
&&&&&& if (second &=60)&
&&&&& try{
&&&&&&&& & & if(selnium.isElementPresent(&link-ajaxLink&))
&&&&&&&& }catch(Exception e){
&&&&&&& e.printStrackException();
Thread.sleep(1000);
这当然不是唯一的解决办法。Ajax是一个共同的话题,在用户论坛上,查找一下之前的讨论,看看别人是如何做的。
封装Selenium调用
与任何编程一样,你需要使用工具函数来处理在测试代码中重复的函数。避免重复的方法之一是封装常用的Selenium方法的调用。例如,测试时经常点击页面上的元素,等待页面加载。
selenium.click(elementLocation);
selenium.waitFOrPageToLoad(waitPeriod);
为了不重复上述代码,你可以写一个包封装上述两个方法。
* Clicks and Waits for page to Load
* param elementLocator
* param waitPeriod
void clickAndWait(String elementLocator,
String waitPeriod)
&&&&&&&&&& selenium.click(elementLocator);
&&&&&&&&&& selenium.waitForPageToLoad(waitPeriod);
判断元素存在的“安全操作”
另一种常见的封装Selenium的方法,在执行进一步操作前检查页面上的元素存在性。这有时被称为“安全操作”。例如,下面的方法可用于实现一个依赖期望的元素存在的安全操作。
* Selenum-RC -- Clicks on element only if it is available on page.
* param elementLocator
public void safeClick(String elementLocator) {
if(selenium.isElementPresent(elementLocator)) {
selenium.click(elementLocator);
// Using the TestNG API for logging
Reporter.log(&Element: & +elementLocator+ &, is not available on page - &
+selenium.getLocation());
在selenium设计自动化测试框架时,如果经常使用的操作,可以将其封装到server层,将页面的路径放在properties文件进行说明。selenium框架的分层,在后面章节中继续讨论。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:32124次
排名:千里之外
原创:15篇
转载:12篇
(1)(6)(2)(1)(1)(1)(1)(1)(6)(7)

我要回帖

更多关于 自动化测试优点 的文章

 

随机推荐