国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

如何使用WatiN對(duì)ASP.NET頁面進(jìn)行單元測(cè)試

2024-07-10 12:38:16
字體:
供稿:網(wǎng)友

引言

單元測(cè)試是應(yīng)用程序設(shè)計(jì)的一個(gè)重要部分,它可應(yīng)用于程序的多個(gè)層次。本文將主要關(guān)注用戶界面層的單元測(cè)試。我們將使用WatiN 測(cè)試ASP.NET應(yīng)用程序。

什么是WatiN?

WatiN 是一個(gè)源自Watir的工具,用于測(cè)試Web頁面。WatiN表示Web Application Testing in .NET。

我們要測(cè)試什么?

在本文中我們將測(cè)試一個(gè)簡(jiǎn)單的ASP.NET頁面,用這個(gè)頁面來演示認(rèn)同、接受(agreement acceptance)的場(chǎng)景。用戶在文本框中輸入名字,點(diǎn)擊“I agree”復(fù)選框,然后按下submit按鈕。這顯然是一個(gè)非常簡(jiǎn)單的頁面,在你熟悉了WatiN框架的工作機(jī)制后,就可以將這里的理念用于大型頁面的測(cè)試了。

測(cè)試認(rèn)同(Agreement)頁面:

向解決方案添加一個(gè)類庫(kù)項(xiàng)目,并為其添加對(duì)測(cè)試工具(我這里用的是MbUnit,但你完全可以使用NUnit或VSTS的測(cè)試項(xiàng)目)和WatiN庫(kù)的引用。你可以在這里下載WatiN。

下面的測(cè)試代碼用來確保用戶已經(jīng)認(rèn)同。

[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);
    }
}

這個(gè)類有TestFixture特性(Attribute),STA值確保該測(cè)試運(yùn)行于STA(Single Threaded Apartment)狀態(tài)下。這是因?yàn)闇y(cè)試代碼要加載IE。

WatiN中的IE類完成了主要工作。IE類打開IE,通過name或id來引用html控件。這一行ie.TextField("txtName").TypeText("Mohammad Azam"),引用了id為“txtName”的文本框。瀏覽器加載后,WatiN會(huì)將值“Mohammad Azam”寫入id為“txtName”的文本框。這個(gè)過程在測(cè)試時(shí)你會(huì)看到的。然后id為“chkAgree”的復(fù)選框會(huì)被選中。最后,WatiN會(huì)按下提交按鈕,窗體被提交。

運(yùn)行測(cè)試,失敗。因?yàn)槊麨?ldquo;lblMessage”的Label從未被賦值為“Valid”。加上這段代碼:

protected void btnAgree_Click(object sender, EventArgs e)
{
    lblMessage.Text = "Valid";
}

現(xiàn)在,如果你運(yùn)行測(cè)試它會(huì)通過。但是,好像不太正確。如果我們把這一行測(cè)試代碼刪掉:

ie.CheckBox("chkAgree").Checked = true;

再次運(yùn)行測(cè)試,依然能通過。這可不對(duì)!應(yīng)當(dāng)只有在CheckBox選中時(shí)才可通過。將頁面的Code behind代碼改一下。

protected void btnAgree_Click(object sender, EventArgs e)
{
    if (chkAgree.Checked)
    {
        lblMessage.Text = "Valid";
    }
}

現(xiàn)在,測(cè)試只有在CheckBox選中時(shí)才可通過了。

以編程方式運(yùn)行Web服務(wù)器:

在上例中我們需要運(yùn)行WebServer,要么是通過命令行工具,要么是通過運(yùn)行Web項(xiàng)目。但有時(shí)我們需要單元測(cè)試項(xiàng)目能夠動(dòng)態(tài)打開一個(gè)WebServer。一起來看看。

首先,如果你需要打開ASP.NET內(nèi)部服務(wù)器(WebDev.WebServer),可以使用命令行。語法如下:

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

需要定位到WebDev.WebServer所在的目錄,默認(rèn)情況下它在:

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

好了,現(xiàn)在來看看如何在單元測(cè)試中打開服務(wù)器。首先,添加必要的配置(App.config中)。

<configuration>
    <appSettings>
        <add key="WebServerExePath" value="C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/WebDev.WebServer.exe"/>
        <add key="Port" value="4463"/>
        <add key="WebApplicationPath" value="c:/projects/demowatiN/demowatiN" />
        <add key="DefaultPageUrl" value="http://localhost:4463/Default.aspx" />
    </appSettings>
</configuration>

BaseTestPage類可以通過這些信息運(yùn)行服務(wù)器,所有繼承了它的測(cè)試類都可以使用這個(gè)功能了。

下面是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;
    }
}

如果服務(wù)器沒有運(yùn)行,我們會(huì)新建一個(gè)進(jìn)程運(yùn)行它,否則就使用已有的進(jìn)程。GetWebServerArguments()、GetPort()和GetWebApplicationPath()僅僅是輔助方法,可以提高可讀性。

最后,你可以讓單元測(cè)試類繼承該類:

public class TestAgreementPage : BaseTestPage

現(xiàn)在,運(yùn)行單元測(cè)試項(xiàng)目時(shí),它會(huì)運(yùn)行WebServer,然后再執(zhí)行所有測(cè)試。

結(jié)論:

在本文中,我們學(xué)習(xí)了如何對(duì)用戶界面層進(jìn)行單元測(cè)試,這些測(cè)試可幫助我們理解UI的需求,并快速地看到基于用戶輸入所得到的結(jié)果。而如果手動(dòng)進(jìn)行測(cè)試,就要花費(fèi)很多時(shí)間了。

源碼:點(diǎn)擊這里。

本文翻譯自:Unit Testing ASP.NET Pages Using WatiN。

來源:http://www.survivalescaperooms.com/anderslly

 

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 临澧县| 南木林县| 大安市| 通化市| 兴安盟| 迁安市| 西乌| 安图县| 娄烦县| 漳平市| 平和县| 长垣县| 玉树县| 慈利县| 唐山市| 大化| 清丰县| 太湖县| 册亨县| 光泽县| 宁陵县| 瓮安县| 太和县| 莱州市| 武城县| 临武县| 莲花县| 衡南县| 湟中县| 晋州市| 甘谷县| 远安县| 伊金霍洛旗| 陵川县| 顺昌县| 陕西省| 凤城市| 买车| 泰州市| 常州市| 泰州市|