asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

用WatiN对ASP.NET页面进行单元测试


发布日期:2021年02月17日
 
用WatiN对ASP.NET页面进行单元测试

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

什么是WatiN?

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

我们要测试什么?

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

测试认同(Agreement)页面

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

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

[TestFixture(ApartmentState = ApartmentStateSTA)]public class TestAgreementPage{ [Test] public void TestCanAcceptUserAgreement() { IE ie = new IE(ConfigurationManagerAppSettings[DefaultPageUrl]); ieTextField(txtName)TypeText(Mohammad Azam); ieCheckBox(chkAgree)Checked = true; ieButton(btnAgree)Click(); AssertAreEqual(Valid ieSpan(lblMessage)Text); }}这个类有TestFixture特性(Attribute)STA值确保该测试运行于STA(Single Threaded Apartment)状态下这是因为测试代码要加载IE

WatiN中的IE类完成了主要工作IE类打开IE通过name或id来引用html控件这一行ieTextField(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){ lblMessageText = Valid; }现在如果你运行测试它会通过但是好像不太正确如果我们把这一行测试代码删掉

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

protected void btnAgree_Click(object sender EventArgs e){ if (chkAgreeChecked) { lblMessageText = Valid; }}现在测试只有在CheckBox选中时才可通过了

以编程方式运行Web服务器

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

首先如果你需要打开ASPNET内部服务器(WebDevWebServer)可以使用命令行语法如下

WebDevWebServerexe /port: /path:C:\Projects\MyWebApplication

需要定位到WebDevWebServer所在的目录默认情况下它在

C:\WINDOWS\MicrosoftNET\Framework\v\WebDevWebServerexe

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

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

下面是BaseTestPage类的完整代码

public class BaseTestPage{ static Process server = null; static BaseTestPage() { if (ProcessGetProcessesByName(WebDevWebServer)Length == ) { string webServerExePath = (string)ConfigurationManagerAppSettings[WebServerExePath]; server = new Process(); ProcessStart(webServerExePath GetWebServerArguments()); } } public static string GetWebServerArguments() { string args = StringFormat(/port:{} /path:\{}\ GetPort() GetWebApplicationPath()); if (StringIsNullOrEmpty(args)) throw new ArgumentNullException(Arguments is not defined); return args; } public static string GetPort() { string port = ConfigurationManagerAppSettings[Port] as String; if (StringIsNullOrEmpty(port)) throw new ArgumentNullException(Port is null or empty); return port; } public static string GetWebApplicationPath() { string webApplicationPath = ConfigurationManagerAppSettings[WebApplicationPath] as String; if (StringIsNullOrEmpty(webApplicationPath)) throw new ArgumentNullException(WebApplicationPath is null or empty); return webApplicationPath; }}如果服务器没有运行我们会新建一个进程运行它否则就使用已有的进程GetWebServerArguments()GetPort()和 GetWebApplicationPath()仅仅是辅助方法可以提高可读性

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

public class TestAgreementPage : BaseTestPage

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

结论

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

               

上一篇:ASP.NET中数据校验部分的封装与应用

下一篇:ASP.NET入门教程 12.1 查看Web服务[1]