我发现,不管我的测试脚本有多可靠,即使测试以前工作正常,我仍然会失败(错误地)测试。我不是在谈论标记是否会更改(尽管这也是另一个有效的问题),我是在谈论每次使用NUnit进行测试列表时,都会有10%的测试失败。 br />我只是想知道其他人是否有此问题,或者想分享详细信息。

评论

我几个月来一直遇到同样的问题。我使用TestNG来运行测试。无法解释为什么它们在套件中运行时为什么会失败

#1 楼

我认为很难通过UI测试可靠。挑战归结为难以可靠地控制和观察与测试相关的变量的困难。这是否值得,取决于您使测试代码更具弹性的能力,以及能够自动运行测试的价值。

异步。对于Web应用程序,常见的故障源是异步。您采取行动,稍后该应用会产生结果。延迟可能会有所不同。您如何解决变化的延迟?

固定的等待时间。有些人通过在测试代码中天真地添加固定等待时间来做到这一点。单击按钮,等待固定的时间,然后检查结果是否显示。这很麻烦,因为有一天您将进行测试,并且固定的等待时间不会足够长。因此,您可以增加固定等待时间。随着时间的流逝,这会使您的测试更加可靠,但速度却很慢。除非绝对不能使用以下两种技术之一,否则请不要使用固定的等待。

闩锁。更好的技术是让应用程序使用闩锁,该闩锁指示某个异步操作是否已完成。当操作开始时,应用程序将闩锁变量设置为false。操作完成后,应用程序将闩锁变量设置为true。有时,您的测试可以将代码注入应用程序中以实现闩锁。您注入的代码将注册,以便在操作开始和停止时得到通知,并相应地设置锁存器的值。然后编写测试代码以观察闩锁变量,以指示操作已完成。

轮询。另一种技术是让您的测试代码轮询所需的结果。单击按钮,然后重复检查结果是否显示,在两次检查之间短暂地暂停。您在轮询代码上设置了最长轮询持续时间,因此,如果该项目在30秒内未显示,则测试失败。我通常最终会创建一个DSL,以隐藏轮询代码的细节并使其具有表现力,例如:

第二个常见挑战是如何识别要观察和操作的HTML / XML元素。

有意义的ID和类。最好将应用程序设计为易于识别元素,方法是将独特的id属性添加到唯一元素中,并为重复的结构(如列表或表)添加良好的class属性。这些属性使直接引用您感兴趣的元素变得更加容易。如果您的应用程序没有这些元素,请成为开发人员的友人并为他们乞求。否则,您将必须通过元素与其他元素的关系来识别元素,这使您的测试取决于标记代码的当前结构。当结构更改时,您的定位器将失效。

简化定位器。一个相关的挑战是编写适合标记更改的定位器。我经常看到人们使用检查工具(Selenium IDE,Firebug等)来生成定位器。这些工具创建的异常定位器通常包括元素的完整路径,包括索引。如果使用这些定位器,则测试将取决于该完整路径。如果结构发生更改,则定位器将无效。最好检查每个由工具生成的定位器,以查看是否可以挑选出基本零件,然后创建仅依赖那些基本零件的定位器。 (然后让开发人员添加有意义的idclass属性。)

评论


很高兴能为您提供帮助。顺便说一句,我认为您在蝙蝠侠电影中表现出色。

–戴尔·埃默里(Dale Emery)
2012年11月20日18:56

#2 楼

我认为Selenium功能测试只要做得正确就足够可靠。解决此问题的步骤是找出大多数测试失败的原因,而该失败应该不会失败。


计时?
无法获得/无法获得外部服务?
数据库内容错误?


#3 楼

我+1了Dale的答案,但是我想补充一些补充。通过使用轮询(在Selenium中称为隐式等待)或闩锁。

我也同意他关于标识元素的断言,并取决于项目和代码流失量有多大差异。我还要指出的另一点是,如果元素和页面发生更改,则有时可以将其视为“不稳定”测试,但它也经常指出由于更改而需要重构或删除的自动化测试。这里要问的另一个问题是为什么元素或元素的标识符更改?对网页进行功能更改是否必要?通常,需要对开发人员进行一些培训,以帮助他们理解这些看似很小的变化如何对自动化产生很大的影响,并可以避免很多次。测试环境和被测产品。与测试剥落性区别对待非常重要,因为这可能会指出应在产品或环境中解决的严重问题。很多次,我看到自动化失败被归类为“不稳定的自动化”,而实际上却发现了可以避免的产品错误。

我喜欢用来识别“不稳定”测试用例的一种技术是我所谓的“浸泡测试”,您可以在相同的环境和相同的环境下使用测试套件并一遍又一遍地运行(100次是共同目标)。产品构建(排除由于产品或环境变化引起的故障)。每个测试用例将有3种可能的结果:100%通过,这是一个稳定的测试用例; 100%失败,这也是一个稳定的测试案例,并且可能指向产品错误或自动化缺陷;通过/失败的任何其他百分比,表明存在不可靠的测试或不可靠的产品功能或环境,应进行调查。

在不稳定的测试中,最好的情况是测试通过/失败不一致,但是一旦失败,总是在同一位置失败。这很容易找到。有时您会发现测试实际上会在多个地方失败,这将需要更多的工作来查找并解决根本原因,但是我认为这是值得的。我想指出另一个答案,这将有助于提高自动化的可靠性和可维护性:初学者进行自动化的良好资源/教程/技巧?

评论


很棒的补充Sam。我曾几次(并感到内)假设一个失败是一个不稳定的测试案例,而实际上却是产品代码中的一个错误。

– maznika
2012年11月29日17:49

#4 楼

诺诺诺诺以上所有海报都错了。轮询和闩锁以及不排除固有随机性或硒错误的原因。为什么在Jenkins或其他一些自动构建中测试失败并变成红色?这是我们的构建中过去的5次硒失效。


元素没有type =“ file”。 Selenium阻塞了向其发送输入密钥以上传文件的操作,但是手动操作,手动使用该应用程序没有问题。
网络延迟/吞吐量。骨干拥塞?上网速度慢吗?这些不是错误。这只是运行在Internet上的应用程序。
只有在使用浏览器的驱动程序版本时,才会发生神秘的手动无法复制的应用程序重定向错误。标签,现在构建被阻止。 hurray
元素轮询无法通过Internet进行。是否想等待测试消失?驾驶员收到您的下一个硒命令时,该元素已经消失,这恰好是等待某些事情发生的命令。无论使用哪种方法,都会出现异步问题。这可能是所有硒中最严重的错误。在您开始等待条件时,您的条件无效并且等待无效。这绝对是硒中的错误。好像他们制造的汽车天生就崩溃了。 RemoteWebDriver无法处理这些异步问题

在思想工作咨询指南和酱料实验室的支持下,硒已经使用了一年,我可以告诉你,这是一个集群YouKnowWhat。这些问题没有解决。因此,OP,在当前时间点,您的问题的答案很可能是“否”。

评论


文件上传问题不是松懈或随意的例子。您无法通过JS控制本机文件浏览器。

–user246
2014年6月18日,1:13

您的答案有点像咆哮,因为它是您无法控制的。在情况4中,您的开发人员应在更改某些内容后更新测试,等待失败只是一种不好的做法,与Selenium本身无关。同样,通过文本查找标签听起来也是一种不好的做法。给它一个ID或以某种方式更好地标识它。

– Niels van Reijmersdal
2014年6月18日6:57



案例3,谁在您的套件中进行了无效测试?您进行测试升级,不是吗?借助SauceLabs,您甚至可以针对浏览器的有效版本进行测试。是的,有时Selenium和浏览器升级会破坏测试套件,但是您可以通过一些过程来解决此问题,除非必要,否则不要使用最新版本。

– Niels van Reijmersdal
2014年6月18日在7:06

有时甚至Windows更新也会破坏驱动程序(例如IE驱动程序-> Windows更新KB3025390)

–光环
15年1月20日在10:45

我的Selenium测试非常宝贵-但是我发现我根本无法使它们成为CI流程的一部分。它们随机断裂-经常由于我无法追踪的原因而断裂。并且有问题的测试将在下一次运行中通过(而其他一些随机测试将失败)。有时这是我自己的代码,但即使允许这样做,我有根据的怀疑是,这些随机中断中的大多数都是我无法控制的问题,例如,在测试驱动程序-> Selenium->浏览器驱动程序-> Web服务器->外部依赖项堆栈。许多活动部件:东西破裂并不奇怪。

–肯·史密斯
16年2月17日在22:11