QTP VS Seleniumjavascript
下面我想先稍微讨论一下这两个工具,我主要从功能和文档资料这两方面对比QTP和Selenium。html
功能java
从Web测试的角度,两个工具都能知足正常的测试需求,这个你无需怀疑!但QTP更强大些,由于:python
1.它是商业软件,只要你有钱,什么均可以有。linux
2.它支持对操做Windows窗口,当你要从Web上下载一些东西,天然此时就会弹出一个“下载框”,因为那个框框是Windows窗口,Selenium是处理不了的,因此必须经过第三方的脚本处理。web
文档和参考资料资料ajax
若是你这方面的新手,当你用QTP/Selenium时,相信书和文档是你第同样会找的东西。在这样面,QTP使用在中国使用仍是蛮普遍的,资料和书籍也至关丰富,而Selenium的资料就相对比较少一些,找资料最好的地方就是官方论坛。apache
为何用Selenium编程
既然上面两项都是QTP优胜一些,为何咱们仍是用Selenium,由于:跨域
1.Selenium使用灵活,简单,写出的测试案例很是简洁,优美,也易于维护。
2.Selenium RC支持用多种语言编写测试案例,你能够用VS2008写测试案例了: >。
3.若是你有一个测试平台,你会发现把QTP整合到平台是很麻烦的事情。
4.......
若是以上Selenium的优势不能打动你,又或者你是测试新手,对测试经验很少,对编程也不熟悉,那么你仍是继续使用QTP吧,不过相信有一天,你会开始尝试Selenium的。
Selenium名字的来源
在这里,我还想说一下关于Selenium名字的来源,颇有意思的: >:Selenium的中文名为“硒”,是一种化学元素的名字,它对汞 (Mercury)有自然的解毒做用,实验代表汞暴露水平越高,硒对汞毒性的拮抗做用越明显,因此说硒是汞的克星。你们应该知道Mercury测试工具系 列吧(QTP,QC,LR,WR...),他们功能强大,但却价格不菲,你们对此又爱又恨!故thoughtworks特地把他们的Web开源测试工具命 名为Selenium,以此帮助你们脱离汞毒。
Selenium 简介
一.Selenium 是什么?
Selenium是ThroughtWorks公司一个强大的开源Web功能测试工具系列,本系列如今主要包括如下4款:
1.Selenium Core:支持DHTML的测试案例(效果相似数据驱动测试),它是Selenium IDE和Selenium RC的引擎。
2.Selenium IDE:FireFox的一个插件,支持脚本录制。(只支持selenium语言)
3.Selenium RC:Selenium Remote Control。(支持不少语言,如:C#,Java,Python,Ruby 等)后续的系列文章我会主要针对Selenium RC展开介绍。
4.Selenium Grid:容许同时并行地、在不一样的环境上运行多个测试任务,极大地加快Web应用的功能测试。
二.选择合适的Selenium工具
既然Selenium工具备4款这么多,那到底如何选择呢??我从"Selenium官网"这里找了一个表:
Selenium IDE | Selenium Remote Control | Selenium Core | Selenium Core HTA | |
浏览器支持 | 仅Firefox | 不少 | 全部 | 仅IE |
须要远程安装 | 否 | 否 | 是 | 否 |
支持 HTTPS/SSL | 是 | 是* | 是 | 是 |
支持跨域 | 是 | 是* | 否 | 是 |
须要Java | 否 | 是 | 否 | 否 |
将测试结果保存到磁盘 | 是 | 是 | 否 | 是 |
多语言支持 | 仅Selenese | 不少 | 仅Selenese | 仅Selenese |
这里没有介绍Selenium Grid,但介绍了另一个Selenium Core HTA,Selenium Core HTA实际上是Selenium Core的额外模式,你只要Selenium Core配置稍加修改,即为HTA模式,Selenium Core HTA能够在IE最高安全等级(特权)下工做,这意味着它仅能在IE下工做,因为限制较大,下面将排除对Selenium Core HTA的讨论。
1.浏览器支持:
(1).Selenium IDE仅能够在Firefox中工做。
(2).Selenium Remote Control支持不少浏览器,包括最经常使用的:firefox,ie,safari等N款浏览器。
(3).Selenium Core支持的浏览器是最广的,这点和它的实现有关。做为IDE和RC的引擎,Selenium Core几乎能够在任何浏览器中工做。
2.须要远程安装:是否须要在被测网站的服务端安装?
这里只有Selenium Core须要,这是出于同源策略的缘由。这也是Selenium Core一个很大的限制,试问,若是你要测试Google.com,还得在google的服务器上装一个Selenium Core,那是多搞笑的一件事。
而Selenium IDE和Selenium Core HTA不会被同源策略所限制,由于他们对浏览器扩展了。
Selenium RC提供一个代码服务器来保证Selenium JS文件看似来自相同的远程服务器,从而符合同源策略;代理服务器欺骗浏览器,让它认为这里的确有像http://www.google.com/selenium/这样的目录。
3.支持HTTPS/SSL:
这里不说了,都支持。Selenium RC在“是”后面加*由于它是在最近版本支持的,仅此而已。
4.须要Java:准确的说是须要JRE
这项只有Selenium RC须要,上面2中所说的“代理服务器”是一个Java程序,需在跑测试案例前启动。
5.将测试结果保存到磁盘
只有Selenium Core不能将任何测试结果写到磁盘上(由于它是用javascript写的,它不容许向磁盘写数据),其解决方案是固然你能够将测试结果发送到另一台服务器保存。这也是Selenium Core的一大限制。
6.多语言支持
(1).Selenium IDE仅支持Selenium语言。
(2).Selenium RC支持不少语言,如:C#,Java,Python,Ruby等。
(3).Selenium Core也是仅支持Selenium语言。
Selenium语言的测试案例以下:
它的优势是:简单,用(Command,Target,Value)三种元素组成一个行为,而且有辅助录制脚本工具(如:Firefox IDE,Selenium Core等),不懂程序的测试人员均可以轻松地编写测试案例。
它的缺点是:Selenese有一些严格的限制:它没有条件(没有"if"表达式),而且它没有循环(没有"For"表达式)。这会使编写复杂的测试变得困难甚至不可能。
OK,如今咱们来研究下到底该使用哪款工具开展测试!
(1).Selenium IDE支持而且只支持Firefox浏览器,支持的浏览器太少,而依附于Firefox也不便于往后开展自动化测试,可是,它的录制快捷好用!而且有代码转换功能,能够把Selenium语言测试案例转为C#,Java等语言的测试案例,我建议使用Selenium IDE + FireBug进行测试案例的编写,而后转为其余语言的测试案例后,再调用Selenium RC运行测试案例。
(2).Selenium Core,它的优势是编写测试案例简单,而且支持绝大多数的浏览器,但缺点也一样明显,Selenium Core须要远程安装,Selenese语言也限制了复杂案例的可能性,而且没有良好的外部扩展,这是些都会是致命的问题。由于一个款测试工具不可能100%知足你测试需求的,当它不能知足你测试需求时候,它必须有一个扩展机制可让你可使用其余的方式知足你需求,不然这款测试软件即便功能强大,也请三思慎用,不然当投入大量资源后才发现某些问题不能解决,那时候已经晚了,这是个人切身体会。
(3).Selenium RC是我推荐使用的工具,它支持不少浏览器,可使用C#,Java等语言编写测试案例,易于维护,同时提供了很好的扩展性,因此后续的文档我会以Selenium RC做为默认的测试工具。
Selenium 是 ThoughtWorks 专门为 Web 应用程序编写的一个验收测试工具。据 Selenium 主页所说,与其余测试工具相比,使用 Selenium 的最大好处是:
Selenium 测试直接在浏览器中运行,就像真实用户所作的同样。Selenium 测试能够在 Windows、Linux 和 MacintoshAnd 上的 Internet Explorer、Mozilla 和 Firefox 中运行。其余测试工具都不能覆盖如此多的平台。
使用 Selenium 和在浏览器中运行测试还有不少其余好处。下面是主要的两大好处:
Selenium 的核心,也称 browser bot,是用 JavaScript 编写的。这使得测试脚本能够在受支持的浏览器中运行。browser bot 负责执行从测试脚本接收到的命令,测试脚本要么是用 HTML 的表布局编写的,要么是使用一种受支持的编程语言编写的。
Selenium 适用于如下浏览器:
Internet Explorer | Mozilla | Firefox | Safari | |
Windows XP | 6.0 | 1.6+, 1.7+ | 0.8+, 0.9+, 1.0 | |
Red Hat Linux | 1.6+, 1.7+ | 0.8+, 0.9+, 1.0+ | ||
Mac OS X 10.3 | 不支持 | 1.6+, 1.7+ | 0.8+, 0.9+, 1.0+ | 1.3+ |
经过 Selenium 命令,脚本编写者能够描述 browser bot 在浏览器中所执行的操做。能够将这些命令分红两类 —— 操做(action) 和断言(assertion):
在 Selenium 网站上能够找到可用命令的完整列表(见 参考资料)。
能够按两种模式来使用 Selenium:test runner 和 driven。这两种模式在复杂性和编写方式方面有所不一样。driven 测试脚本编写起来每每要更复杂一些,由于它们是用编程语言编写的。可是若是使用 Python 或 Ruby 之类的高级动态编程语言,那么这种复杂性方面的差别就很小。
两种模式之间最大的不一样点在于,若是使用 driven 脚本,测试有一部分在浏览器以外运行,而若是使用 test runner 脚本的话,测试是彻底在浏览器中运行的。
无论是 test runner 仍是 driven 测试用例,均可以与持续集成工具集成。
Selenium test runner 脚本,也称测试用例(test case),是用 HTML 语言经过一个简单的表布局编写的,如 清单 1 所示。
<table border="1"> <tr> <td>First command</td> <td>Target</td> <td>Value</td> </tr> <tr> <td>Second command</td> <td>Target</td> <td>Value</td> </tr> </table> |
test runner 脚本一般与所测试的应用程序(AUT)部署在同一个服务器上。这是由于 browser bot 使用 JavaScript 来模拟用户操做。这些脚本在一个受限制的沙箱环境中运行。若是须要绕过这些限制,可使用一个代理。
test runner 脚本使用与 xUnit 框架相同的测试套件(test suite)和测试用例概念。测试用例和命令按照它们在测试套件和测试用例中出现的顺序依次执行。在 清单 1 中:
type
命令时,这一列可能就是一个文本域所指望的值。即便对于非技术人员来讲,test runner 脚本也易于阅读和编写。当在一个浏览器中打开 清单 1 中的例子时,将获得相似这样的一个表:
First command | Target | Value |
Second command | Target | Value |
接下来,我将描述如何使用命令和断言编写一个简单可是完整的测试用例。
执行 清单 2 中的测试脚本时,它将执行如下操做:
address_field
的文本框中输入 Betelgeuse state prison
。Submit
的输入区。注意,这里使用 XPath 找到 Submit 按钮,这致使表单数据被发送到服务器。Address change successful
。 <table> <tr> <td>open</td> <td>/change_address_form.html</td> <td></td> </tr> <tr> <td>type</td> <td>address_field</td> <td>Betelgeuse state prison</td> </tr> <tr> <td>clickAndWait</td> <td>//input[@name='Submit']</td> <td></td> </tr> <tr> <td>verifyTextPresent</td> <td>Address change successful</td> <td></td> </tr> </table> |
要达到对应用程序的彻底测试覆盖,一般须要不止一个测试用例。这就是 Selenium 使用测试套件的缘由。测试套件用于将具备相似功能的一些测试用例编成一组,以便让它们按顺序运行。
测试套件和测试用例同样,都是用简单的 HTML 表编写的。Selenium 执行的缺省测试套件的名称是 TestSuite.html。清单 3 展现了一个测试套件,该套件像一般的用户同样测试应用程序。注意,测试套件使用一个只包含一列的表,表中的每一行指向一个包含某个测试用例的文件。
<table> <tr> <td>Test suite for the whole application</td> </tr> <tr> <td><a href="test_main_page.html">Access main page</a></td> </tr> <tr> <td><a href="test_login.html">Login to application</a></td> </tr> <tr> <td><a href="test_address_change.html">Change address</a></td> </tr> <tr> <td><a href="test_logout.html">Logout from application</a></td> </tr> </table> |
接下来我将把目光转移到 driven 测试脚本。
driven Selenium 脚本是用多种受支持的编程语言中的一种编写的 —— 目前可用的有 Java、Ruby 和 Python 驱动程序。这些脚本在浏览器以外的一个单独的进程中运行。驱动程序的任务是执行测试脚本,并经过与运行在浏览器中的 browser bot 进行通讯来驱动浏览器。驱动程序与 browser bot 之间的通讯使用一种简单的特定于 Selenium 的链接语言 Selenese。
driven 脚本比 test runner 脚本更强大、更灵活,能够将它们与 xUnit 框架集成。driven 脚本的缺点(与 test runner 脚本相比)是,这种脚本编写和部署起来更复杂。这是由于驱动程序必须执行如下任务:
driven 脚本更依赖于应用程序运行时环境。例如,Java 驱动程序使用一个嵌入式 Jetty 或 Tomcat 实例来部署所测试的应用程序。目前,已经有人在致力于将 Selenium 集成到 Ruby on Rails 中,可是在我撰写本文之际,这个集成版本尚未被发布。
清单 4 摘自一个使用 Ruby 驱动程序的 driven 测试脚本。注意,我省略了用于启动服务器和浏览器的步骤,这个测试脚本代码几乎和 test runner 脚本同样简单。
. . puts selenium.open('/logout.html') puts selenium.verify_location('/index.html') . . |
在接下来的两节(现实中的需求 和 现实中的用例)中,我将描述如何在现实场景中使用 Selenium,并针对用 Ruby on Rails 和一点儿 Ajax 技术编写的一个简单的股票报价查看器应用程序编写 Selenium 测试用例。虽然这个应用程序是用 Ruby on Rails 编写的,可是也能够将这个例子应用于任何 Web 应用程序,由于测试脚本是按 test runner 模式以 HTML 编写的。这个示例应用程序是用 Ruby 1.8.3 和 Ruby on Rails 0.14.2 测试的,可是它也可能可使用更旧的或更新的版本。
若是有 Linux,那么发行版中一般已经包括了 Ruby。在命令提示符下运行 ruby -v
,检查您所拥有的版本。对于大多数平台,均可以在 http://www.ruby-lang.org/ 上找到一个 Ruby 发行版。
接下来的步骤是经过 RubyGems 打包系统安装 Ruby on Rails。为此,只需执行 gem install rails --include-dependencies
。在某些平台上,必须执行一些额外的步骤,因此请访问 Ruby on Rails 网站,以得到更多细节。
在我撰写本文之际,目前可用的 Selenium 版本是 0.6。我已经将它集成在示例应用程序中(见 下载 小节),个人作法是从http://selenium.thoughtworks.com/ 下载 Selenium Core 包,而后将名为 selenium 的文件夹复制到用于静态内容的文件夹。在 Ruby on Rails 应用程序中,这个文件夹的名称是 public。在 J2EE Web 应用程序中,能够将 selenium 文件夹放在 Web 应用程序的根目录或 WAR 归档文件中。
最后一步是下载示例应用程序。从 下载 小节中得到这个包。解压应用程序,并打开一个命令提示符。而后转入应用程序被解压到的那个目录。为了启动应用程序,运行 ruby script/server
。应该看到 Rails 成功启动了,如 图 1 所示。
在本节中,我将列出示例应用程序的用例。经过这些简化的用例,能够编写模拟用户所执行步骤的验收测试,并验证这些步骤的结果是否与预期相符。股票报价应用程序实现了如下四个用例:
实现这些用例的代码已经编写好了;能够在 app 目录中找到该代码,测试用例在 public/selenium/tests 文件夹中。
大多数人都知道登陆页面是如何工做的 —— 输入用户名和密码,而后将数据提交到服务器。若是凭证有效,就能够成功登陆,并看到受安全保护的资源。在示例应用程序中,这个测试用例包含如下用户操做和断言,必须将它转换成一个 Selenium 测试用例:
图 2 展现了用于这些需求的 Selenium 测试用例。注意,我是在运行测试以后截取屏幕快照的。绿色箭头表示成功地经过验证的断言。
查看股票页面显示一个公司列表。用于这个页面的测试用例很是简单,因此被包括在前一个测试用例的后面。该测试用例验证当前位置是否为 /main/list_stocks,以及页面是否包含文本 Click on a company name to view details
。
查看股票细节用例是在查看股票页面上触发的。用户在一个公司名称上单击鼠标时,就触发了到服务器的一个 Ajax 请求。服务器的响应包括该公司的详细信息,这些信息将插入到当前页面中,而没必要从新装载完整的页面。用于这个用例的测试用例执行如下用户操做:
Acme Oil
。Acme Automotive
。因为使用了 Ajax,请求是异步发生的。在通常的 Web 应用程序中,全部东西一般都是同步的,所以这一点提出了一种不一样的挑战。能够像测试其余功能同样来测试 Ajax 功能。唯一的不一样是,必须让 Selenium 暂停,等待 Ajax 命令完成。为此,可使用 pause
命令来等待 Ajax 命令的完成。另外,Joseph Moore 在他最近的 blog 贴中提到,还可使用 waitForValue
和waitForCondition
命令代替 pause 命令(见 参考资料)。
图 3 展现了被转换成 Selenium 用例的需求。
注意 pause
命令:必须使用这些命令,以便等待异步请求完成和更新页面内容。若是没有 500 毫秒的暂停,测试将失败(如图 4 所示)。
pause
命令还测试 Ajax 功能的非功能性需求。500 毫秒对于 pause 命令是一个很好的值,由于 Ajax 请求应该快速地执行和完成。能够试着去掉 pause
命令,看看结果如何。若是测试在您的机器上失败,那么试着将这个值增长到 1000 毫秒。
退出用例很容易实现,简单来讲只有如下两步:
图 5 展现了最后这个测试用例。
全部测试都被添加到 图 6 左侧显示的缺省测试套件中。
最后要作的是在 Mozilla Firefox 和 Microsoft Internet Explorer 中执行测试套件。为此,在浏览器中打开http://localhost:3000/selenium/TestRunner.html
,而后单击 图 6 中所示的 All 按钮。失败的测试用例和断言将被标记为红色,可是这里,在两个浏览器中全部用例都应该能够成功完成(一样见 图 6)。注意,我使用的是 Mozilla Firefox 1.0.7 和 Internet Explorer 6.0。
还能够单步调试测试套件,这意味着 Selenium 将很慢地执行测试套件,这样当测试套件在浏览器中执行时,就能够看到它的每一步。
Selenium 是软件工程师、设计人员和测试人员的工具箱中又一个有用且重要的工具。经过将该工具与持续集成工具相结合,团队就能够将验收测试自动化,并构建更好的软件,由于他们能够更容易、更早、更频繁地发现 bug。Selenium 的另外一个优势是能够节省时间,使开发人员和测试人员没必要将时间花在本能够(也应该)自动化的手工任务上,从而让团队将精力放在更有价值的活动上。
下载
描述 | 名字 | 大小 | 下载方法 |
---|---|---|---|
Sample application | wa-selenium-ajax-example.zip | 286KB | HTTP |
学习
waitForValue
和 waitForCondition
命令 —— Joseph Moore 提出的 pause
命令的 替代品。得到产品和技术