logo 广告
Loading...
 导航 所在位置:论坛首页 -> ┈┋电脑网络┋┈ -> Asp/Asp.Net教程 -> 用WatiN对ASP.NET页面进行单元测试
回复
标题:用WatiN对ASP.NET页面进行单元测试收藏 编辑 删除 楼主 | 上一篇 下一篇
薰衣草
头像
等级:职业侠客
权限:普通用户
积分:55
金钱:2808
声望:88
经验:88
发帖数:692
注册:2007年10月28日
资料 短消息2008-4-12 11:53:34
单元测试是应用程序设计的一个重要部分,它可应用于程序的多个层次。本文将主要关注用户界面层的单元测试。我们将使用WatiN 测试ASP.NET应用程序。

    什么是WatiN?

    WatiN 是一个源自Watir的工具,用于测试Web页面。WatiN表示Web Application Testing in .NET。

    我们要测试什么?

    在本文中我们将测试一个简单的ASP.NET页面,用这个页面来演示认同、接受(agreement acceptance)的场景。用户在文本框中输入名字,点击“I agree”复选框,然后按下submit按钮。这显然是一个非常简单的页面,在你熟悉了WatiN框架的工作机制后,就可以将这里的理念用于大型页面的测试了。

    测试认同(Agreement)页面:

    向解决方案添加一个类库项目,并为其添加对测试工具(我这里用的是MbUnit,但你完全可以使用NUnit或VSTS的测试项目)和WatiN库的引用。你可以在这里下载WatiN。

    下面的测试代码用来确保用户已经认同。

     [TestFixture(ApartmentState = ApartmentState.STA)]public class TestAgreementPage{ [Test] public void TestCanAcceptUserAgreement() { IE ie = new IE(ConfigurationManager.AppSettings["DefaultPageUrl"]); ie.TextField("txtName").TypeText("Mohammad Azam"); ie.CheckBox("chkAgree").Checked = true; ie.Button("btnAgree").Click(); Assert.AreEqual("Valid", ie.Span("lblMessage").Text); }}这个类有TestFixture特性(Attribute),STA值确保该测试运行于STA(Single Threaded Apartment)状态下。这是因为测试代码要加载IE。


    WatiN中的IE类完成了主要工作。IE类打开IE,通过name或id来引用html控件。这一行ie.TextField("txtName").TypeText("Mohammad Azam"),引用了id为“txtName”的文本框。浏览器加载后,WatiN会将值“Mohammad Azam”写入id为“txtName”的文本框。这个过程在测试时你会看到的。然后id为“chkAgree”的复选框会被选中。最后,WatiN会按下提交按钮,窗体被提交。

    运行测试,失败。因为名为“lblMessage”的Label从未被赋值为“Valid”。加上这段代码:

    protected void btnAgree_Click(object sender, EventArgs e){ lblMessage.Text = "Valid"; }现在,如果你运行测试它会通过。但是,好像不太正确。如果我们把这一行测试代码删掉:

    ie.CheckBox("chkAgree").Checked = true; 再次运行测试,依然能通过。这可不对!应当只有在CheckBox选中时才可通过。将页面的Code behind代码改一下。

    protected void btnAgree_Click(object sender, EventArgs e){ if (chkAgree.Checked) { lblMessage.Text = "Valid"; }}现在,测试只有在CheckBox选中时才可通过了。

    以编程方式运行Web服务器

    在上例中我们需要运行WebServer,要么是通过命令行工具,要么是通过运行Web项目。但有时我们需要单元测试项目能够动态打开一个WebServer。一起来看看。

    首先,如果你需要打开ASP.NET内部服务器(WebDev.WebServer),可以使用命令行。语法如下:

    WebDev.WebServer.exe /port:1950 /path:"C:\Projects\MyWebApplication"

    需要定位到WebDev.WebServer所在的目录,默认情况下它在:

    C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.exe

    好了,现在来看看如何在单元测试中打开服务器。首先,添加必要的配置(App.config中)。

    BaseTestPage类可以通过这些信息运行服务器,所有继承了它的测试类都可以使用这个功能了。

    下面是BaseTestPage类的完整代码:

     public class BaseTestPage{ static Process server = null; static BaseTestPage() { if (Process.GetProcessesByName("WebDev.WebServer").Length == 0) { string webServerExePath = (string)ConfigurationManager.AppSettings["WebServerExePath"]; server = new Process(); Process.Start(webServerExePath, GetWebServerArguments()); } } public static string GetWebServerArguments() { string args = String.Format("/port:{0} /path:\"{1}\"", GetPort(), GetWebApplicationPath()); if (String.IsNullOrEmpty(args)) throw new ArgumentNullException("Arguments is not defined"); return args; } public static string GetPort() { string port = ConfigurationManager.AppSettings["Port"] as String; if (String.IsNullOrEmpty(port)) throw new ArgumentNullException("Port is null or empty"); return port; } public static string GetWebApplicationPath() { string webApplicationPath = ConfigurationManager.AppSettings["WebApplicationPath"] as String; if (String.IsNullOrEmpty(webApplicationPath)) throw new ArgumentNullException("WebApplicationPath is null or empty"); return webApplicationPath; }}如果服务器没有运行,我们会新建一个进程运行它,否则就使用已有的进程。GetWebServerArguments()、GetPort()和GetWebApplicationPath()仅仅是辅助方法,可以提高可读性。

    最后,你可以让单元测试类继承该类:

    public class TestAgreementPage : BaseTestPage

    现在,运行单元测试项目时,它会运行WebServer,然后再执行所有测试。

    结论:

    在本文中,我们学习了如何对用户界面层进行单元测试,这些测试可帮助我们理解UI的需求,并快速地看到基于用户输入所得到的结果。而如果手动进行测试,就要花费很多时间了。

签名

2008-4-12 11:53:34 顶部
第1页 共页 共0个回复     <<    >>    
 快速回复
  • 支持UBB,HTML标签

  • 高级回复

  • 操作选项:评分 加精 解精 奖惩 设专题 设公告 解公告 固顶 总固顶 解固顶 结帖 解结帖 锁帖 解锁 移帖 删帖
      首页 | 购买指南 | 虚拟主机 | 特色介绍 | 下载中心 | 支付方式
    Copyright 2004-2008 BBSGood.com Powered By: BBSGood.Speed Version 5.0
      咨询电话:0575-85513832、0575-85513825(传真)、7*24小时咨询服务:13606552007 不良信息举报中心 浙ICP备05029817号
      业务QQ:38958768、客服QQ1:415896239、客服QQ2:343896043、MSN:jccsxx@hotmail.com