热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WatiN:在.NET中测试Web应用程序

本文转载自:http:www.testage.nethtml57n-957.html引言单元测试是应用程序设计的一个重要部分,它可应用于程序的多个层次

本文转载自: http://www.testage.net/html/57/n-957.html

引言

单元测试是应用程序设计的一个重要部分,它可应用于程序的多个层次。本文将主要关注用户界面层的单元测试。我们将使用WatiN 测试ASP.NET应用程序。

什么是WatiN?

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

我们要测试什么?

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

这里是待测页面的截图:

WatiNImage1

测试认同(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中)。

<configuration>

<appSettings>

<add key&#61;"WebServerExePath" value&#61;"C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/WebDev.WebServer.exe"/>

<add key&#61;"Port" value&#61;"4463"/>

<add key&#61;"WebApplicationPath" value&#61;"c:/projects/demowatiN/demowatiN" />

<add key&#61;"DefaultPageUrl" value&#61;"http://localhost:4463/Default.aspx" />

appSettings>

configuration>

 

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

下面是BaseTestPage类的完整代码&#xff1a;

public class BaseTestPage

{

static Process server &#61; null;

 

static BaseTestPage()

{

if (Process.GetProcessesByName("WebDev.WebServer").Length &#61;&#61; 0)

{

string webServerExePath &#61; (string)ConfigurationManager.AppSettings["WebServerExePath"];

server &#61; new Process();

Process.Start(webServerExePath, GetWebServerArguments());

}

}

 

public static string GetWebServerArguments()

{

string args &#61; 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 &#61; 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 &#61; ConfigurationManager.AppSettings["WebApplicationPath"] as String;

if (String.IsNullOrEmpty(webApplicationPath)) throw new ArgumentNullException("WebApplicationPath is null or empty");

 

return webApplicationPath;

}

}

如果服务器没有运行&#xff0c;我们会新建一个进程运行它&#xff0c;否则就使用已有的进程。GetWebServerArguments()、GetPort()和GetWebApplicationPath()仅仅是辅助方法&#xff0c;可以提高可读性。

最后&#xff0c;你可以让单元测试类继承该类&#xff1a;

public class TestAgreementPage : BaseTestPage

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

结论&#xff1a;

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

源码&#xff1a;点击这里。

作者&#xff1a;Anders Cui
出处&#xff1a;http://anderslly.cnblogs.com
本文版权归作者和博客园共有&#xff0c;欢迎转载&#xff0c;但未经作者同意必须保留此段声明&#xff0c;且在文章页面明显位置给出原文连接&#xff0c;否则保留追究法律责任的权利。


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了markdown[软件代理设置]相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 网址:https:vue.docschina.orgv2guideforms.html表单input绑定基础用法可以通过使用v-model指令,在 ... [详细]
  • [echarts] 同指标对比柱状图相关的知识介绍及应用示例
    本文由编程笔记小编为大家整理,主要介绍了echarts同指标对比柱状图相关的知识,包括对比课程通过率最高的8个课程和最低的8个课程以及全校的平均通过率。文章提供了一个应用示例,展示了如何使用echarts制作同指标对比柱状图,并对代码进行了详细解释和说明。该示例可以帮助读者更好地理解和应用echarts。 ... [详细]
  • 大坑|左上角_pycharm连接服务器同步写代码(图文详细过程)
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了pycharm连接服务器同步写代码(图文详细过程)相关的知识,希望对你有一定的参考价值。pycharm连接服务 ... [详细]
  • vsCode配置通过Github同步(Settings Sync)
    vsCode配置通过Github同步(Settings Sync) ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 解决VS写C#项目导入MySQL数据源报错“You have a usable connection already”问题的正确方法
    本文介绍了在VS写C#项目导入MySQL数据源时出现报错“You have a usable connection already”的问题,并给出了正确的解决方法。详细描述了问题的出现情况和报错信息,并提供了解决该问题的步骤和注意事项。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了在序列化时如何对SnakeYaml应用格式化,包括通过设置类和DumpSettings来实现定制输出的方法。作者提供了一个示例,展示了期望的yaml生成格式,并解释了如何使用SnakeYaml的特定设置器来实现这个目标。对于正在使用SnakeYaml进行序列化的开发者来说,本文提供了一些有用的参考和指导。摘要长度为169字。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • OpenMap教程4 – 图层概述
    本文介绍了OpenMap教程4中关于地图图层的内容,包括将ShapeLayer添加到MapBean中的方法,OpenMap支持的图层类型以及使用BufferedLayer创建图像的MapBean。此外,还介绍了Layer背景标志的作用和OMGraphicHandlerLayer的基础层类。 ... [详细]
author-avatar
突然丶丶想你
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有