好吧,也许我错过了一些东西,但我真的不明白 Selenium 的意义。使用代码打开浏览器、使用代码单击按钮、使用代码检查文本的意义何在?我阅读了该网站,我看到理论上自动对您的 Web 应用程序进行单元测试会很好,但最后编写所有这些代码而不是仅仅点击并直观地验证事情是否工作需要更多的时间?
我不明白...
好吧,也许我错过了一些东西,但我真的不明白 Selenium 的意义。使用代码打开浏览器、使用代码单击按钮、使用代码检查文本的意义何在?我阅读了该网站,我看到理论上自动对您的 Web 应用程序进行单元测试会很好,但最后编写所有这些代码而不是仅仅点击并直观地验证事情是否工作需要更多的时间?
我不明白...
它允许您在“单元”测试框架中编写功能测试(问题是后者的命名)。
当您通过浏览器测试您的应用程序时,您通常是在测试完全集成的系统。考虑到您已经必须在提交更改之前对其进行测试(冒烟测试),您不想一遍又一遍地手动测试它。
非常棒的一点是,您可以自动化烟雾测试,而 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 可以使用那里(希望通过添加更多测试)。
这是关于单元测试的普遍说法。“我需要编写两倍的代码进行测试?” 同样的原则也适用于此。回报是改变你的代码并知道你没有破坏任何东西的能力。
因为您可以一遍又一遍地重复相同的测试。
如果您的应用程序甚至超过 50 个页面,并且您需要进行频繁的构建并针对 X 数量的主要浏览器对其进行测试,那么这很有意义。
想象一下,你有 50 个页面,每个页面都有 10 个链接,有些页面包含多阶段表单,需要你浏览表单,输入大约 100 组不同的信息,以验证它们是否适用于所有信用卡号、所有地址在所有国家等
手动测试几乎是不可能的。它变得如此容易出现人为错误,以至于您无法保证测试是正确的,更不用说测试证明了被测试的东西是什么。
此外,如果您遵循现代开发模型,许多开发人员都以不连贯的分布式方式在同一个站点上工作(例如,有些开发人员在飞机上通过笔记本电脑在站点上工作),那么人工测试人员不会甚至可以访问它,更不用说每次单个开发人员尝试新事物时都有耐心重新测试。
在任何体面大小的网站上,测试都必须自动化。
这一点与任何类型的自动化测试都是一样的:编写代码可能比“只是点击并直观地验证事情是否有效”需要更多的时间,可能要多 10 倍甚至 50 倍。
但是任何不平凡的应用程序最终都必须测试超过 50 次,而手动测试是一件烦人的苦差事,可能会被省略或在压力下粗制滥造,这导致直到重要截止日期之前(或之后)才发现错误,这会导致紧张的通宵编码课程,甚至由于合同罚款而导致彻底的金钱损失。
Selenium 将记录并重新运行您为测试 Web 应用程序所做的所有手动单击和键入操作。一遍又一遍。
随着时间的推移,对我自己的研究表明,我倾向于做更少的测试并开始跳过一些,或者忘记它们。
Selenium 将改为进行每个测试,运行它,如果它没有返回您期望的结果,它可以让您知道。
记录所有这些测试需要预先花费时间。我会像单元测试一样推荐它——如果你还没有它,就开始使用它来处理代码中最复杂、最敏感或更新最多的部分。
如果您将这些测试保存为 JUnit 类,您可以在闲暇时重新运行它们,作为自动构建的一部分,或者使用 JMeter 在穷人的负载测试中重新运行它们。
在过去的工作中,我们曾经对我们的 web 应用程序进行单元测试。如果网络应用程序改变了它的外观,则不需要重新编写测试。记录和回放类型测试都需要重新进行。
为什么需要硒?因为测试人员是人。他们每天回家,不能总是在周末工作,请病假,请公共假期,时不时去度假,厌倦了重复性的工作,不能总是依赖他们在你需要的时候在身边。
我并不是说你应该摆脱测试人员,而是一个自动化的 UI 测试工具补充了系统测试人员。
关键是能够使手动和耗时的测试之前的工作自动化。是的,编写测试需要时间,但是一旦编写完成,就可以按照团队的意愿多次运行。每次运行时,它们都会验证 Web 应用程序的行为是否一致。Selenium 不是一个完美的产品,但它非常擅长自动化现实的用户与浏览器的交互。
如果您不喜欢 Selenium 方法,可以尝试HtmlUnit,我发现它更有用且易于集成到现有的单元测试中。
对于具有丰富 Web 界面的应用程序(如许多 GWT 项目),Selenium/Windmill/WebDriver/etc 是创建验收测试的方法。在 GWT/GXT 的情况下,最终的用户界面代码在 JavaScript 中,因此使用普通的 junit 测试用例创建验收测试基本上是不可能的。使用 Selenium,您可以创建匹配真实用户操作和预期结果的测试场景。
根据我对 Selenium 的经验,它可以揭示应用程序逻辑和用户界面中的错误(如果您的测试用例编写得很好)。处理 AJAX 前端需要一些额外的努力,但它仍然是可行的。
我用它来测试多页表单,因为这样可以减轻一遍又一遍地输入相同内容的负担。并且能够检查某些元素是否存在是很棒的。同样,以表格为例,您的最终硒测试可以检查是否在订购过程结束时出现“感谢 Rogers 先生订购...”之类的内容。