最好的方法是建立/构造测试,以最大程度地减少随着产品的变化和改进而使测试保持最新状态所需的工作?

评论

我们可以将这个问题及其答案与sqa.stackexchange.com/questions/4/…封面合并吗?另一个有更多答案,但是这个标题更清晰,恕我直言。

其实是好问题吗? “最好”是任意的。在这两个问题之间有18个答案,而且在方法上有很大不同。我不确定该问题的哪个版本都可以回答。

#1 楼

正如其他人所说,请使用Pageobject和其他最佳实践。很少有链接:



PageObject解释了-独立于语言的Martin Fowler

硒最佳实践-简短的摘要,用于Java

摘要:


使用PageObjects模式
精通


返回此内容,变量,泛型,
重新使用模型并使用jodatime



要健壮和便携


首选选择器顺序:id>名称> css> xpath避免Thread.sleep首选Wait或FluentWait
使用相对URL
不要依赖特定的Driver实现
创建数据集


了解新工具


保持最新(版本和使用模式)
故障排除


jre 1.6
IE(缩放,受保护模式设置)
Firefox / firebug起始页


如何处理UI组件,如...文件上传,日期选择器,ajax表等...
检测硒是否存在时不是工作的好工具
不要害怕乱砍硒
/>


搜索“ pageobject”和“最佳实践”将为您提供更多有关系统和语言的链接。

PageObject为它们封装了许多页面交互和定位符,因此测试可以调用pageobject方法在页面上执行某些操作,而无需了解HTML,定位符等。

评论


这些是非常有用的链接。如果您可以对它们进行总结,那就太好了,就像SQA的“帮助”部分所建议的那样:“如果目标站点无法访问或永久离线,请始终引用重要链接中最相关的部分。”

– dzieciou
2014年5月2日在17:29

#2 楼

除了其他人提出的令人敬畏的建议之外,我还要描述一个经常被忽视的领域。与单元测试不同,在端到端测试中,您对系统中的数据和测试环境的控制较少。以下是一些建议,可以在此类数据或测试环境更改时使您的测试更易于维护:不要以为您的测试数据将永远存在于数据库中。我见过依赖生产数据库数据的测试,例如具有特定名称或特权的用户。如果对这些数据的引用进行了硬编码,并且这些引用之后的数据将被更新,甚至更糟的是将其删除,则测试将无用。而是让您的测试创建特定的测试数据或以声明的方式检索它们,例如通过SQL查询。
命名您的测试数据。如果您不确定要作为测试的一部分来检索或创建特定的测试数据,请给他们至少一些有意义的名称,这些名称将解释您为什么选择此示例而不是其他示例。想象一下,您必须维护一组包含过时航班的测试数据:不再有从洛杉矶到雷克雅未克的航班。因此,您需要另一个类似航班的样本。类似的测试数据在这里意味着什么?即测试此特定航班的目的是什么?它是关于检查洲际航班或往返航班的系统行为吗?更好的方法是使用名称来包装此测试数据,例如anyIntercontinentalRoundtripFlight()
与测试环境脱钩。不要将您的测试与特定的测试环境耦合在一起。我见过使用URL,路径,数据库连接URL和其他特定于环境的元素进行硬编码的测试。当您的产品必须在新配置上进行测试时,更新测试将是一场噩梦。因此,将测试环境配置与测试用例分开。将环境配置放在单独的类或文件中。


#3 楼

像处理其他代码一样处理测试,使用编码准则,开发模式,最佳实践和文档方法等...从代码角度来看,使其尽可能易于维护。迄今为止,我将在您的过程中添加以下步骤:


让开发人员在签入/提交代码之前运行测试(使他们负责不破坏自动化测试)
在每个检入/提交操作中使用连续集成服务器运行测试(这样您就知道谁/什么破坏了测试)
如果测试失败,请确定其是否有缺陷或是否需要更新
在继续进行其他任何开发之前,请确保有人正在修复测试。

关键是要给开发人员尽可能快的反馈,并防止在流沙上进行构建。

评论


+1:随着问题变得越来越大,推迟测试的维护会使测试变得更加困难。

– dzieciou
2014年7月12日在9:06

#4 楼


可读性:
我的一位代码指导员在我职业生涯的早期就教给我:“如果您的逻辑/算法不够简单,无法由第三人理解和修改,重构并重复。
六个月后下线,那第三个人可能就是你自己。“

我在设计自动化测试时遵循的一些规则: br />
简化代码:简化代码,使其自然地从一层流到另一层,并由第三方读取。
非技术人员可以像这样阅读和理解您的代码吗?一本书?(至少在顶层上)


干燥您的代码:干燥您的代码,因此,如果有任何更改,则只需在一个地方进行更新。始终不断重构代码以使其更加DRYer。 >
将重点放在简单的测试上,而不是冗长的复杂测试:将一个断言作为测试的最后一步。 br />仅由于其他任何测试失败而失败。


每个测试仅应测试一件事:每个测试都应该仅出于一个原因而失败。 ,则没有正确设计。


没有多余的步骤:多个测试中不应包含相同的步骤/验证点。


分离定位器和测试数据:将定位器和测试数据与主要的自动化代码隔离开,以便可以独立更新而无需触及代码。



#5 楼

基本上,您希望将测试的内容与实际的页面交互隔离开,以便可以一次更新页面交互代码并使所有测试正常工作,对吧?对于。如果您有一个知道如何与您的网站进行交互的对象,并且所有测试都与该对象进行交互而不是直接触摸页面,则在网站更改后,您只需更新PageObject即可,所有测试都将是最新的。

#6 楼

我相信您必须已经知道这一点-通常认为自动化将来可能会改变的功能部件/功能/模块是个坏主意。但是我知道有时候产品的后果不是由任何人来控制,而是由客户来控制。在产品发生变化时最大程度地减少工作量-


模块化您的代码。创建一个基类,其中包含处理最常用/最常用动作的方法。单击按钮,上下文单击,声明,等待等。这将鼓励Test类中代码的重用。
从外部文件获取测试数据。您也可以将元素标识符存储在文件中。这将帮助您(在一定程度上)更改测试用例,而不必重新编译您的一个或多个类。
符合编码标准。如果您有一个庞大的团队,并且有多个QA参与自动化过程,那么每个人都必须以正确的格式编写代码非常重要。这将使团队的每个成员都能够阅读,理解和更改(如果需要)代码的任何部分,从而节省时间和精力
使用适当的框架。使用诸如TestNG之类的框架,您可以执行/定义除测试步骤之外的许多操作,例如。哪些案例/类要运行/不运行,哪些案例要首先执行,如果一个或多个案例失败,哪些案例要依赖于其他案例/跳过等等,等等。马上。希望能有所帮助,但是根据我的经验,如果您频繁地进行自动化更改,您最终会花费大量不必要的精力来尝试应对更改。太多的更改通常会导致在代码中引入新的问题。

评论


将测试数据文件保存在外部文件中并不总是维护测试的一个好主意。如果您需要重构数据结构,例如重命名字段或添加一个新字段,则需要为每个测试数据文件手动进行此操作,除非您的IDE支持跨编程语言和测试数据描述语言的重构。

– dzieciou
2014年5月1日16:06

-1所有功能将来都有可能改变。这就是软件产品所发生的情况。似乎您建议根本不要进行自动化测试。

– Niels van Reijmersdal
17年3月22日在10:00

#7 楼

正如Yash所建议的那样,但简写为:

使用Testng注释可以很好地表明依赖关系。

花了一些时间才学会使用它(yaml +组+包) ,但对于批注,您可以轻松构建测试的依赖关系和结构。

外部属性文件对用户数据也很有帮助。样板代码,简化了理解和编写工作的麻烦,并且还提供了学习脚本语言的机会。如果可能,请使用DSL。