.NET 平台下 Web 测试工具横向比较

  • 赵劼

2009 年 4 月 13 日

话题:.NET测试语言 & 开发文化 & 方法

在浏览器中打开页面并加以判断,无疑是测试一个 Web 应用程序最直接的方式。借助一款合适的自动测试工具或框架,测试人员就可以在一定程度上从繁重的手动测试工作中解放出来。Ruby 平台下的Watir无疑是这方面的姣姣者,因此被大量用于 Web 应用程序的回归测试或验收测试。不过对于使用.NET Framework 的技术团队来说,Watir 不一定是最好的选择。目前社区中已经出现了几款.NET 平台下的 Web 测试框架,测试人员现在就可以使用自己最熟悉的语言来实现同样的功能,并与自己的开发环境无缝集成。

WatiN 

WatiN是 Watir 的“应对之作”,使用 C# 语言开发,不过能够使用任意.NET 语言编写测试代码。WatiN 1.0 只支持 IE 浏览器,不过从 2.0 版本开始也能自动操作 FireFox(需安装插件)浏览器了。其最新版本是 2 月 19 日发布的2.0 CTP3,对面向 FireFox 的相关功能进行了增强并修改了一些 bug。其附属项目WatiN Test Recorder支持对浏览器操作的捕获,并自动生成测试代码。WatiN Test Recorder 目前刚发布了 alpha 版本,您可以从它的主页上跟进其最新消息。WatiN 是一个开源项目,使用 Apache License 2.0 协议发布。 

Selenium 

严格说来,Selenium是一套完整的 Web 应用程序测试系统,它包含了测试的录制(Selenium IDE)、编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium 的核心Selenium Core基于JsUnit,完全由 JavaScript 编写,因此可运行于任何支持 JavaScript 的浏览器上。Selenium Core 由一种指定格式的 HTML 文件驱动,在一定程度上增强了测试套件(Test Suite)的可读性。Selenium Remote Control 允许测试人员使用常见的语言(自然包括 C# 等.NET 语言)编写测试代码,并支持不同操作系统下的各种主流浏览器。Selenium Grid 的作用是将测试分发至多台机器,这样便可大大加快测试速度。与 WatiN 相同,Selenium 也是一款同样使用 Apache License 2.0 协议发布的开源框架。 

LTAF 

Lightweight Test Automation Framework for ASP.NET(轻量级 ASP.NET 自动测试框架,下文简称为 LTAF)是一款由 ASP.NET QA 团队开发的框架,并用于产品的回归测试。测试人员能够使用任意.NET 代码编写测试,并使用内置的 API 操作 DOM 元素。LTAF 最近发布了April Update并包含了框架代码,它的Release Note记录了框架的使用方式。赵劼最近在博客中谈到了利用 LTAF 对 ASP.NET MVC 应用程序中的视图作独立的单元测试,他在文章中对 LTAF 有这样的评价:

……虽然在某些方面(例如 DOM 元素的选取)不如其“竞争对手”,但是 LTAF 自有其独到之处:

  • 由于直接在浏览器中运行,它天生便支持现有的——以及未来可能出现的任意浏览器。
  • 由于直接部署在被测试的网站中,因此测试代码和网站页面是在同一个进程中。

第一点优势自不必说,而第二点更是关键。试想 WaitN 和 Selenium,都是通过编写代码在浏览器中打开页面。这意味着我们的在测试代码和被测试的网页分别在不同的进程中。在这个前提下,如果我们要将测试代码中定义的数据传递给被测试的网页(也就是视图对象),我们就必须进行跨进程的通信。而无论怎么实现,都逃不过“序列化”一途,这无疑增加了复杂度。而使用 LTAF 之后,这个问题瞬间烟消云散了,因为我们可以直接在内存中“传递”测试数据,一切都只是个引用而已。

不过任何事物都具有两面性,LTAF 也有一些难以天生的,而且是永远无法弥补的缺点。例如:

  • 由于 LTAF 将待测试的页面放置在 Frame 中,因此该页面上的 window.top 等基于浏览器 frame 结构的属性会被改变。
  • 由于 LTAF 的本质是使用 JavaScript 来操作 DOM,这意味着任何会阻塞程序进行的操作(例如 alert)都不能使用,否则将阻塞整个测试过程。

幸运的是,这两点都不会成为严重的问题。对于第一种情况,我们只需要编写一个自定的 getTop 方法来替换直接访问 windows.top 的做法即可。而第二种情况——老赵从来不喜欢 alert 或 confirm 这种“纯浏览器功能”,因为它们会带来很差的用户体验,更何况现在的 JavaScript 类库 / 框架都能很轻松的做出这种效果,您觉得呢?

比较 

虽然老赵推荐使用 LTAF,不过究竟哪款测试框架最适合您的项目,还需要读者根据需要自己的需要做出判断。以下表格列出了他们的横向比较:

框架 WatiN Selenium LTAF
浏览器支持 IE / FireFox IE / FireFox / Opera / Safari 任意
自动生成代码 有,但目前不支持 FireFox 浏览器
开源协议 Apache Licence 2.0 Apache Licence 2.0 不开源,但发布代码
其他 / 可将测试分布于多台机器执行,加快速度 测试代码与网站在同一进程中。
.NET测试语言 & 开发文化 & 方法