您现在的位置是:首页 >

如何对当前页进行页面设置 用WatiN对ASP.NET页面进行单元测试

火烧 2021-07-06 12:50:04 1058
用WatiN对ASP.NET页面进行单元测试   单元测试是应用程序设计的一个重要部分 它可应用于程序的多个层次 本文将主要关注用户界面层的单元测试 我们将使用WatiN 测试ASP NET应用程序

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

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

  什么是WatiN?

如何对当前页进行页面设置 用WatiN对ASP.NET页面进行单元测试

  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( cAgree ) 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来引用控件 这一行ie TextField( txtName ) TypeText( Mohammad Azam ) 引用了id为 txtName 的文本框 浏览器加载后 WatiN会将值 Mohammad Azam 写入id为 txtName 的文本框 这个过程在测试时你会看到的 然后id为 cAgree 的复选框会被选中 最后 WatiN会按下提交按钮 窗体被提交

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

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

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

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

  以编程方式运行Web服务器

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

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

  WebDev WebServer exe /port: /path: C:ProjectsMyWebApplication

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

  C:WINDOWSMicrosoft NETFrameworkv WebDev WebServer exe

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

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

  下面是BaseTestPage类的完整代码

  public class BaseTestPage{ static Process server = null; static BaseTestPage() { if (Process GetProcessesByName( WebDev WebServer ) Length == ) { string webServerExePath = (string)ConfigurationManager AppSettings[ WebServerExePath ]; server = new Process(); Process Start(webServerExePath GetWebServerArguments()); } } public static string GetWebServerArguments() { string args = String Format( /port:{ } /path: { } 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 然后再执行所有测试

  结论

lishixinzhi/Article/program/net/201311/15476  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码