如何为硒(或类似产品)编写不会因微小或外观变化而失败的测试?


9

我花了大约一周的时间学习硒,并为即将推出的网站构建了一系列网络测试。非常好学习,我学了一些xpath和CSS定位技术。

不过,对我来说,问题在于,几乎没有什么变化会破坏测试-对div,id或有助于识别小部件的一些autoid数字进行的任何更改都会破坏任何数量的测试-这似乎非常脆弱。

那么您是否编写了硒(或其他类似的)测试,如何处理测试的脆性(或如何阻止它们变脆),以及将硒用于哪种测试?


如果很少的更改破坏了测试,那么在进行更改后就不会运行测试-这就是测试的重点。另外,似乎缺乏开发人员对(存在)测试的意识。
talonx 2010年

1
@talonx-仅仅运行这种测试是不够的,如果小的更改导致套件的重大更改,那么无论它们是由开发人员,ci盒还是测试人员运行,都会有问题
FinnNk 2010年

@FinnNK:同意-小更改不应导致大更改。这意味着测试用例是由与开发人员没有任何联系的人编写的,这些人闻起来像是沟通鸿沟。
talonx

@talonx:UI测试本质上是脆弱的,并且比单元测试花费更长的时间。它们是一个特殊的挑战,所以我不会对@Sam组织中的开发人员下结论。
azheglov

2
我更改了标题-希望该问题能多一些代表,否定性也要少一些。
乔恩·霍普金斯

Answers:


7

Selenium的目的是创建UI驱动的集成测试

集成测试可以验证系统中的所有组件一起部署时都能正常工作。集成测试不是足够的测试策略,并且会补充其他具有不同重点的测试策略,例如单元测试验收测试

UI驱动的测试本质上是脆弱的,尽管Selenium和Watir与早期的记录和回放工具相比有所进步。有几种方法可以解决此问题-以下是一些世界级专家的建议汇编:

不要试图从这种类型的测试中获得所有的测试范围。Robert C. Martin 认为集成测试的代码覆盖率应该约为20%。当输入距离多个应用程序层很远时,测试所有执行路径根本是不切实际的。

从单元测试和验收测试中获取大部分测试范围。在FinnNk的答案中查找Gojko Adzic文章的链接。Adzic反复争论要通过验收测试和绕过UI来测试业务逻辑。

但是仍然需要编写一些UI驱动的测试。除了“不要通过UI测试业务逻辑”之外,您还需要一些实用的建议。我会推荐Patrick Wilson-Welsh的博客作为起点。


patrickwilsonwelsh.com的链接不再起作用,其他资源也可以.. !!
MarmiK

4

一旦经过一个微不足道的数字,创建像这样的测试时,最重要的事情就是对称更改的想法-代码中的少量更改会导致测试套件中的更改也很小。

例如,假设您在100个测试中通过两个文本框收集某人的名字。如果您精明地编写这些测试(或者可能正在使用记录回放),那么您将有100个测试需要更改。相反,如果您抽象出一个“输入名称”步骤并在测试中使用它而不是直接使用硒,那么您只有1个位置进行更改。这将取决于您的上下文,您使用多少个抽象层-但是使用抽象将使您的测试可维护很长的路要走。

第二件重要的事情是确保您的选择器基于最重要且变化最小的事物。有时,这可能是id或类,也可能是元素中或元素周围的文本。总是喜欢最简单的选择器(例如id),但有时要实现此目的,您将不得不使用xpath之类的东西。

戈杰科·阿德齐奇有很多在他的博客很好的建议,当谈到这类测试-看看他的死亡的正弦如何避免它尤其如此。


好的提示FinnNk-我已经抽象了通用方法(登录,查找侧栏小部件等)-因此,当测试发生更改时,可以减少损害。不幸的是,我们使用的专有系统会创建一些小部件,并根据它们在dom中的位置创建小部件的ID,因此,每当移动某些东西时,测试都会被破坏。
山姆J 2010年

1
通常,您可以找到一种识别元素的方法-元素包含的某些文本,或者元素与其他元素的相对位置始终相同。最后,作为最后的选择,您还可以定义自定义定位器策略,以使用硒来定位元素,从而使您可以完全控制(例如,如果您正在寻找名称名称和结尾添加一些野蛮元素的元素,例如您的大小写或在asp.net网络表单中)。
FinnNk 2010年

1

测试可确保代​​码的行为符合预期。如果您的测试定期中断,则说明该测试不是在测试正确的东西,或者开发人员不会在意这些测试。

我个人认为,如果<div>标签的存在破坏了测试,则该测试不必要地严格依赖于周围的标签,因此应采取更宽松的方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.