Selenium Automation:运行测试套件时,除了有效失败外,失败的测试用例的可接受范围应该是多少?

时间:2019-01-09 04:45:05

标签: java selenium selenium-webdriver automation

我们公司正在使用Selenium,POM,Maven和Java开发用于Web应用程序的框架,我们大约有35个测试用例。当我们运行 testng.xml 时,至少有4到5个测试用例会由于陈旧的元素异常或此时无法单击元素而随机失败。

当运行 testng.xml 时,某些测试用例失败是很常见的吗?您的组织中运行了多少个测试用例,对失败的估计有多少?

5 个答案:

答案 0 :(得分:1)

由于陈旧的元素,元素在某一时刻不可点击,时序问题等导致的故障。必须在自动化框架中处理和处理-您正在创建和使用的方法案例。
它们不应传播并导致案例失败-它们是技术问题,而不是产品问题或测试用例。因此,必须对它们进行说明(例如,尝试/捕获块)并立即进行处理(重试机制或重新获取Web元素)。

本质上-与对待语法错误一样,对这些类型的错误进行处理-不应该这样


同时-只是说说而已- 处理实时/动态数据的案例 有时可能会随机失败。

例如,我正在使用的SUT根据我无法控制的数据和操作(上游系统的实时流量)显示一些指标和汇总。在某些情况下,会检查特定生成的工件是否符合设置的期望值(例如,想象一个月度图,它根本没有很多数据点-那天没有活动) -失败的情况不是因为它们的构造不正确,当然不是因为存在产品错误-而是由于执行时间和数据集的结合。

随着时间的流逝,我得出的结论是,那些失败是可以的,将其“修复”-重新选择数据集,解决此类外部波动等,这是价值递减且投资回报率可疑的活动。由于这个原因,在目前该系统的约10,000个案例中,大约有1.5%的案例因此失败(免责声明:SUT仅处理实时/生产数据)。
这几乎不是一个经验法则-这只是我确定的数字,在上下文中可以接受。

重要说明-如果我完全控制这些数据,那么我会摆脱那些“随机”故障也是。我选择有意使用真实数据-因此我的案例也验证了其完整性;这种负面的副作用。

答案 1 :(得分:1)

您只需要在driver.findElement()之前添加一些等待。 Selenium的工作速度非常快,这就是为什么您得到此Stale元素或元素不可见异常的原因。添加等待应该可以解决问题。

答案 2 :(得分:1)

测试自动化与测试的可重复性以及测试的执行速度有关。有许多商业和开源工具可用于协助开发 Test Automation ,而 Selenium 可能是其中使用最广泛的开源解决方案。

测试失败的可接受范围

此矩阵可能因组织而异,也可能取决于特定的客户要求。但是Exit Criteria必须按住此限制的密钥。话虽如此,通过 Selenium 进行的 Test Automation 自动化了 Regression Tests ,因此理想情况下应该出现 0 故障。我知道有些组织遵守Zero Defect政策。

您面临的错误

结论

因此您提到的错误不是错误,而是由于以下原因而可能在 Test Execution 发生的:

  • 正在使用的二进制版本之间的兼容性不匹配。
  • WebDriver 实例和 Web浏览器实例之间的同步不匹配。

按照上述最佳实践可以轻松解决这些错误。

答案 3 :(得分:0)

陈旧元素异常-当元素不再位于DOM中时,会显示此异常。导致此问题的主要原因是在查找元素时页面已加载。处理此问题的最佳方法是捕获异常。如前所述,应将其设计为处理这些情况的框架的一部分

无法在点上单击元素-出于某些原因,可能会发生此问题

  1. 页面仍在加载
  2. 我们要点击的元素上方有一个叠加层,因此会对其造成阻碍

最佳方法 解决测试中脆弱性的最佳方法是在发生故障时捕获屏幕截图并进行处理。应该设计一个测试框架来处理所有这些极端情况

答案 4 :(得分:0)

谢谢你们,我可以解决这个问题

遵循的步骤 1)过时元素异常: 场景:根据搜索条件,目录将通过“编辑”和“删除”按钮加载。 搜索速度很慢,并且要编辑的元素按钮会过时 解决方案:在下面的早期帖子中使用了自定义的等待示例代码,并暂停了该代码

equals

以前使用下面的代码,但没有用

public static void customewait(int seconds)
    {        Date start = new Date();
             Date end = new Date();
             while(end.getTime() - start.getTime() < seconds * 1000){
                 end = new Date();
             }
    }