为者长成 行者长至

Selenium Ajax

上一篇 / 下一篇  2007-12-17 10:30:21 / 个人分类:Selenium

翻译:SpringSide团队   转载请注明出处。

匆匆一瞥 Selenium
    在典型的在线商店中,需要用户输入或选择众多步骤后才可以完成整个购物流程。作为web应用的开发者,你如何保证你程序的质量和正确性呢?如果能有办法测试你功能的正确性,那问题就迎刃而解了,但如何做到呢?
    Selenium 是一个由ThoughtWorks做的专门为web应用所做的非常有效的功能测试工具。Selenium 的 tests 直接在浏览器里跑,就像用户真的在操作一样。Selenium 可运行 Windows, Linux, 和 Macintosh 的各种浏览器, 如 Internet Explorer, Mozilla 和 Firefox。
    看看Selenium 的  online demo 。点击右上角的"All"按钮来启动运行test cases, 如无意其外,你将看到所有都是绿行。注意action的绿色是会比assertions浅的,这是因为他们测试的所有东西都只是verify或assert 命令。如果有一个assertion 失败了,则那行命令会变为红色,并且Selenium 会停止运行。如果verify 命令失败了,那行命令也会变为红色,但是不会让测试停下来。

    在 Selenium 中的Test suites 和 cases 实际上是由 HTML 写成的, 它们只是很简单的 HTML <table>s。 test suite 中没行都只是关联了一个test case, 例如:
<tr><td><a href="MyTest.html" >MyTest</a></td></tr>
    test-case实际上是由 "Selenese" 写成的 HTML 文档,里面包有一个table,3个列,所有的命令最多只有两个参数,所以足够位置摆放。一个典型的test case像这样:

    当你开始运行测试 (例如 按 "All"按钮), Selenium 的 TestRunner 会自动解释 HTML 格式的 test-case, 并运行你的web应用,并在页面下方的框架中显示运行的情形。
Selenium 允许你通过在浏览器里模拟用户的行为来进行测试。这当然不代表它可以代替unit-testing,只是我们通常会用它来进行web应用的功能测试。它也可以被加入持续继承测试(continuous-integration)中,作为常规的自动回归测试(regression testing)。如果想更深入了解Selenium, 请参看在线文档 "Selenium: Usage".

开始测试 Ajax
    在你的web应用功能是用Javascrīpt实现时,Selenium 就显得极为有用了。
Ajax, 是Asynchronous Javascrīpt and XML 的简称,是web应用中的一种web 交互技术。它可以实现在页面不需要刷新的情况下,在后台与服务器交互少量数据,并即时改变页面内容。这意味着网页看起来更实时,更有动态和更实用。

Ajax 中指示正在"读取数据"的标签

    刚才那句话是对Ajax的技术定义,对于我们大多数人来说,Ajax意味着页面向GMail 或 Flickr 那样。当你点一个连接时,它不会产生页面刷新,而是页面会和服务器交互后返回来再更改一部分页面。在点击连接和看到结果之间延迟的这段时间,让测试看起来那么的棘手。
让我们来假设我们的页面包含了一个text field 和一个 button。text field 的初始值是oldValue。 如果你点击button, Ajax就会启动,并把text field的值改为 "newValue", 而没有刷新任何页面。那我们怎么去测试它呢? 你会很自然的去打开页面, 点击button, 然后检查text field。但是你在Selenium中的这个test case失败了!

    测试失败的原因也许并不明显。这个意外的发生是因为Ajax的异步性,它并不会马上从服务器上得到结果。所以当你按下button时,Selenium 就开始马上检查是否有改变值。Selenium 并不知道需要去等待结果。那我们如何去让这个测试在Ajax下生效呢?
    我们如何去让Selenium 等待返回的结果呢? 有些人认为解决这个问题的办法是用clickAndWait命令来代替click命令;但是在使用以"AndWait"为后序的命令时,Selenium 会等待页面刷新。但是明显的,页面不会刷新,这样就使得Selenium 永远在等待了。明显这个方法行不通。
另外一个方法是在clickassertValue之间加入暂停时间。让它暂停5秒,让服务器有足够的时间返回相应。这种方法在大多数时候是可行的,但是如果服务器相应时间大于5秒,如网速很慢,测试机重启等的时候,就会失败了。你或许会加大等待时间来保证更正确,但是这样明显会使得你的测试越来越慢。所以明显的这个办法并没有按需而慢下拉,所以这也不是最佳的解决办法。
    幸运的是,Selenium 现在已经提供了这种我们非常需要的技术支持。当field 的值在单前页面改变时,你能用waitForValue命令去让 Selenium 等待到这个期望值出现为止。
    所以为了让刚才的失败的测试通过,你需要把它其中的assertValue命令改变如下:

    当执行这个命令的时候, Selenium 会暂停执行当前的test case 和等待所期待的值。当新的值 "newValue" 出现在 text field 时, 测试再次开始。但你需要注意的是,如果你写错期望值了, 那 Selenium 将会等待这个值30分钟。
    就如你想到的那样,Selenium 已经提供了很多测试Ajax 效果的命令。例如,如果你想等待某些文本会在页面上出现,那你可用waitForText命令;如果你想检查当前页面的Title是否有改变,则用waitForTitle;  如果你想检查某个 HTML 元素是否有在页面中被移除,应用waitForElementNotPresent命令。 实际上,对于每个Selenium Accessor, 都会有相应的waitForXxxxwaitForNotXxxx命令。当你用verifyXxxxorassertXxxx去检查某些东西时,总可以有waitForXxxx去测试异步效果。
如果预先确定了waitForXxxxwaitForNotXxxx命令但又达不到预期,那会怎样呢? 对于这种情况,我们有waitForCondition命令去指定一个Javascrīpt 的真假表达式(Boolean expression), 然 Selenium 去等待表达式的值为true为止。waitForCondition 命令的格式是

waitForConditionscrīpttimeout (in ms)

这样在测试复杂的 Ajax 效果时就更为便捷了。

    实际上如果你深入研究 Selenium 的 source code 的话, 你会发现所有前序为waitForXxxxwaitForNotXxxx的命令都是继承了waitForCondition 的。 Grig Gheorghiu 写了一篇关于这方面的blog: Ajax testing with Selenium using waitForCondition. 当他写这篇文章时,waitForCondition仅仅是用户自己扩展Selenium, 现在已经成为Selenium 核心代码的一部分了。

总结
    在这篇简短的文章中, 我们介绍了Selenium,一个web应用测试工具。同样地,我们也讨论了如何去用waitForXxxx命令来测试 Ajax 应用,也演示了如何用 Selenium 去测试一些Ajax 异步效果。
    如果你想知道更多有关于waitForXxxx命令, Selenium 的开发者提供了一些简单的测试例子 演示了如何测试 Ajax, 如编辑替换,自动填充和拖拉效果等。这些例子是基于scrīpt.aculo.us, 来做的, 它是大家都非常熟悉的 Ajax library- prototype.js的子项目。

(自http://www.infoq.com/articles/testing-ajax-selenium, cac译。注:之前也翻译了一篇很详细的 Selenium文档, 见Selenium中文手册:http://wiki.springside.org.cn/display/springside/SeleniumReference)


TAG: Selenium

 

评分:0

我来说两句

日历

« 2024-05-07  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 18021
  • 日志数: 17
  • 文件数: 3
  • 建立时间: 2007-11-19
  • 更新时间: 2008-03-24

RSS订阅

Open Toolbar