Selenium有什么作用?

28

好的,也许我有所遗漏,但我真的不明白Selenium的意义所在。使用代码打开浏览器、使用代码点击按钮、使用代码检查文本有什么意义呢?我阅读了网站上的介绍,理论上自动化单元测试您的Web应用程序是很好的,但最终不是编写所有这些代码比只是点击并直观地验证工作要花费更多的时间吗?

我不明白……


1
我希望有一种方式可以提前投票反对关闭一个问题,因为我认为下面的答案中提出了很多优秀的观点。 - matt b
+1 不是因为我不明白问题,而是因为这个问题给了我很好的理由来证明编写Selenium测试所花费的时间是值得的。 - Adam
这个问题为我提供了一个很好的例子,说明为什么开发团队需要专门的QA资源:“...最终,编写所有这些代码不是比简单地点击并视觉验证工作要花费更多的时间吗...”通常我听到这种论点来自客户,他们不想花时间让开发人员编写单元测试... - sonstabo
15个回答

44

它允许你在“单元”测试框架中编写功能测试(问题主要是后者的命名)。

当你通过浏览器测试应用程序时,通常会测试完全集成的系统。考虑到你已经在提交更改之前测试了它们(冒烟测试),你不希望一遍又一遍地手动测试。

非常好的一点是,你可以自动化你的冒烟测试,并且QA可以增强它们。这非常有效,因为它减少了重复的努力并使整个团队更加密切。

PS:正如你第一次使用任何实践一样,都需要一个学习曲线,因此通常在第一次需要更长时间。我还建议你查看页面对象模式,它有助于保持测试的清洁。

更新1:请注意,测试还将在页面上运行JavaScript,这有助于测试高度动态的页面。还要注意,你可以在不同的浏览器上运行它,因此你可以检查跨浏览器问题(至少在功能方面,因为你仍然需要检查视觉效果)。

还要注意,随着测试覆盖的页面数量增加,你可以快速创建带有完整交互循环的测试。使用页面对象模式,它们看起来像:

   LastPage aPage = somePage
      .SomeAction()
      .AnotherActionWithParams("somevalue")
      //... other actions
      .AnotherOneThatKeepsYouOnthePage(); 
  // add some asserts using methods that give you info
  // on LastPage (or that check the info is there).
  // you can of course break the statements to add additional 
  // asserts on the multi-steps story.

重要的是要理解你需要逐步进行。如果已经有一个构建好的系统,你可以为你正在开发的功能/更改添加测试,逐步增加测试覆盖率。相反,手动测试通常会隐藏你忘记测试的部分,因此如果你对影响每个页面的更改进行了更改,并且你只能检查一个子集(由于时间不允许),你知道你实际测试过哪些页面,QA 可以在这基础上工作(希望通过增加更多的测试)。


21

这是关于单元测试的一种常见说法:"我需要为测试编写两倍的代码吗?" 这里应用相同的原则。回报是能够更改您的代码并知道您没有破坏任何东西。


15

因为您可以一遍又一遍地重复相同的测试。


9
如果您的应用程序甚至有50多页,并且需要频繁进行构建并针对X个主要浏览器进行测试,这是非常有意义的。

是的,但看网站上的例子...验证文本是否出现,并不需要通过编程来完成。你有多经常一次改变50页? - GBa
6
每当您更改一个包含在所有50个页面上使用的实用函数的库文件时。 - EBGreen
2
在我们的应用程序中,实际上有200多页。一个人要完成完整的回归测试需要几天时间。 - Hawk Kroeger
1
@Greg:你需要逐步进行,为你正在开发的特定功能/更改添加测试。如果你正在使用页面对象模式,这些测试将有助于你在想要测试更大的交互周期时进行。我更新了我的答案并添加了更多信息,请查看一下。 - eglasius
1
@Greg,编写测试确实需要时间,但它们的运行速度比人类快得多。现在我正在处理需要大约12小时才能运行的测试,但如果要手动运行相同的测试,人类需要几天时间。将这些节省下来的时间乘以几年,那就是很多时间! - Wesley Wiser
显示剩余3条评论

5
假设你有50页,每页都有10个链接,有些页面还有多阶段表单需要你填写大约100个不同的信息集以验证它们是否与所有信用卡号码、所有国家/地区的地址等正常工作。这几乎是不可能手动测试的。这变得非常容易出现人为错误,您不能保证测试是正确的,更不用说测试所证明的被测试物品了。
此外,如果您遵循现代开发模型,在其中许多开发人员以断开、分布式方式在同一站点上工作(例如,有些开发人员在飞机上使用笔记本电脑工作),那么人工测试人员甚至无法访问它,更不用说有耐心地重新测试每当一个开发人员尝试新东西时。
在任何体量较大的网站上,测试必须自动化。

3

对于任何类型的自动化测试来说,重点都是相同的:编写代码可能比“随便点击并视觉验证事物是否正常工作”需要更多时间,甚至可能多达10倍或50倍。

但是,任何复杂的应用程序最终都必须进行超过50次的测试,而手动测试是一项烦人的任务,很可能会因为压力而被省略或做得不认真,这会导致错误未被发现,直到重要的截止日期前后才被发现,从而导致紧张的通宵编码或甚至直接造成合同惩罚而导致经济损失。


从我的经验来看,使用Selenium或类似的框架进行测试,并不需要太大的努力。特别是与手动完全验证相比较。现在,这种关系通常出现在将新的测试添加到已编码系统时。因为此时很可能缺少许多功能性测试。 - eglasius

2
Selenium(以及类似的工具,如Watir)可以让您以计算机擅长的方式运行针对Web应用程序用户界面的测试:每晚数千次或在每次源代码检入后几秒内。请注意,还有许多其他UI测试方面,人类更擅长,例如注意到一些与测试无直接关系的奇怪事情。

通过查看生成的HTML而不是启动浏览器来呈现它,还有其他方式可以涉及您应用程序的整个堆栈,例如WebratMechanize。大多数这些方式没有与JavaScript-heavy UIs交互的方法; Selenium在这方面为您提供了一定的支持。


2

Selenium会记录并重新运行您测试Web应用程序时进行的所有手动点击和输入。一遍又一遍。

随着时间的推移,对自己的研究表明我倾向于做较少的测试并开始跳过一些测试或忘记它们。

Selenium将取代每个测试,运行它,如果它没有返回您所期望的结果,则可以通知您。

录制所有这些测试需要前期时间成本。我建议像单元测试一样使用它--如果您还没有使用,请从代码中最复杂、最敏感或最新的部分开始使用它。


1

如果您将这些测试保存为JUnit类,您可以在闲暇时重新运行它们,作为自动化构建的一部分,或者使用JMeter进行贫民负载测试。


1
在以前的工作中,我们习惯对我们的 Web 应用进行单元测试。如果 Web 应用的外观发生变化,测试不需要重新编写。而录制和回放类型的测试则需要重新执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接