如何使用WatiN對ASP.NET頁面進(jìn)行單元測試_AJAX教程
推薦:AJAX教程之jQuery事件總結(jié)很少寫這些,看了1.2.3版本的改進(jìn),確實(shí)佩服,很方便. 1.綁定事件 (1) (p).bind(click, function(e){}); (2) (p).click(function() {}) 2.刪除事件 (1)刪除特定事件 (div).unbind(click); (2)刪除所有事件 (div).unbind(); 3.觸發(fā)事件 (1)trigger方
引言
單元測試是應(yīng)用程序設(shè)計(jì)的一個(gè)重要部分,它可應(yīng)用于程序的多個(gè)層次。本文將主要關(guān)注用戶界面層的單元測試。我們將使用WatiN 測試ASP.NET應(yīng)用程序。
什么是WatiN?
WatiN 是一個(gè)源自Watir的工具,用于測試Web頁面。WatiN表示Web Application Testing in .NET。
我們要測試什么?
在本文中我們將測試一個(gè)簡單的ASP.NET頁面,用這個(gè)頁面來演示認(rèn)同、接受(agreement acceptance)的場景。用戶在文本框中輸入名字,點(diǎn)擊“I agree”復(fù)選框,然后按下submit按鈕。這顯然是一個(gè)非常簡單的頁面,在你熟悉了WatiN框架的工作機(jī)制后,就可以將這里的理念用于大型頁面的測試了。
測試認(rèn)同(Agreement)頁面:
向解決方案添加一個(gè)類庫項(xiàng)目,并為其添加對測試工具(我這里用的是MbUnit,但你完全可以使用NUnit或VSTS的測試項(xiàng)目)和WatiN庫的引用。你可以在這里下載WatiN。
下面的測試代碼用來確保用戶已經(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值確保該測試運(yùn)行于STA(Single Threaded Apartment)狀態(tài)下。這是因?yàn)闇y試代碼要加載IE。
WatiN中的IE類完成了主要工作。IE類打開IE,通過name或id來引用html控件。這一行ie.TextField("txtName").TypeText("Mohammad Azam"),引用了id為“txtName”的文本框。瀏覽器加載后,WatiN會將值“Mohammad Azam”寫入id為“txtName”的文本框。這個(gè)過程在測試時(shí)你會看到的。然后id為“chkAgree”的復(fù)選框會被選中。最后,WatiN會按下提交按鈕,窗體被提交。
運(yùn)行測試,失敗。因?yàn)槊麨?ldquo;lblMessage”的Label從未被賦值為“Valid”。加上這段代碼:
protected void btnAgree_Click(object sender, EventArgs e)
{
lblMessage.Text = "Valid";}
現(xiàn)在,如果你運(yùn)行測試它會通過。但是,好像不太正確。如果我們把這一行測試代碼刪掉:
ie.CheckBox("chkAgree").Checked = true;再次運(yùn)行測試,依然能通過。這可不對!應(yīng)當(dāng)只有在CheckBox選中時(shí)才可通過。將頁面的Code behind代碼改一下。
protected void btnAgree_Click(object sender, EventArgs e)
{
if (chkAgree.Checked)
{
lblMessage.Text = "Valid";
}}
現(xiàn)在,測試只有在CheckBox選中時(shí)才可通過了。
以編程方式運(yùn)行Web服務(wù)器:
在上例中我們需要運(yùn)行WebServer,要么是通過命令行工具,要么是通過運(yùn)行Web項(xiàng)目。但有時(shí)我們需要單元測試項(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)在來看看如何在單元測試中打開服務(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ù)器,所有繼承了它的測試類都可以使用這個(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)行,我們會新建一個(gè)進(jìn)程運(yùn)行它,否則就使用已有的進(jìn)程。GetWebServerArguments()、GetPort()和GetWebApplicationPath()僅僅是輔助方法,可以提高可讀性。
最后,你可以讓單元測試類繼承該類:
public class TestAgreementPage : BaseTestPage
現(xiàn)在,運(yùn)行單元測試項(xiàng)目時(shí),它會運(yùn)行WebServer,然后再執(zhí)行所有測試。
結(jié)論:
在本文中,我們學(xué)習(xí)了如何對用戶界面層進(jìn)行單元測試,這些測試可幫助我們理解UI的需求,并快速地看到基于用戶輸入所得到的結(jié)果。而如果手動(dòng)進(jìn)行測試,就要花費(fèi)很多時(shí)間了。
源碼:點(diǎn)擊這里。
本文翻譯自:Unit Testing ASP.NET Pages Using WatiN。
來源:http://www.cnblogs.com/anderslly
分享:淺析AJAX實(shí)例:動(dòng)態(tài)進(jìn)度條1.建立進(jìn)度條html頁面 progressbar.htm script language=javascript function setPgb(pgbID, pgbValue) { if ( pgbValue = 100 ) { //debugger; if (lblObj = document.getElementById(pgbID+'_label')) { lblObj.innerHTML = pgbValue + '%'; // change t
- Ajax中瀏覽器的緩存問題解決方法
- AJAX和WebService實(shí)現(xiàn)省市縣三級聯(lián)動(dòng)具體代碼
- ajax 登錄功能簡單實(shí)現(xiàn)(未連接數(shù)據(jù)庫)
- AJAX和WebService實(shí)現(xiàn)郵箱驗(yàn)證(無刷新驗(yàn)證郵件地址是否合法)
- AJAX和三層架構(gòu)實(shí)現(xiàn)分頁功能具體思路及代碼
- 使用AJAX返回WebService里的集合具體實(shí)現(xiàn)
- AJAX獲取服務(wù)器當(dāng)前時(shí)間及時(shí)間格式輸出處理
- ajax傳遞多個(gè)參數(shù)具體實(shí)現(xiàn)
- ajax傳遞一個(gè)參數(shù)具體實(shí)現(xiàn)
- 滑輪滾動(dòng)到頁面底部ajax加載數(shù)據(jù)配合jsonp實(shí)現(xiàn)探討
- jQery ajax——load()方法示例介紹
- jQuery+Ajax實(shí)現(xiàn)表格數(shù)據(jù)不同列標(biāo)題排序(為表格注入活力)
AJAX教程Rss訂閱編程教程搜索
AJAX教程推薦
猜你也喜歡看這些
- 使用AJAX技術(shù)打造博客無刷新搜索引擎
- 在AJAX開發(fā)中集成數(shù)據(jù)庫技術(shù)
- Web2.0歲月使用AJAX技術(shù)的十大理由
- AJAX中JavaScript支持面向?qū)ο蟮幕A(chǔ)
- Ajax技術(shù)實(shí)踐之完成Ajax自動(dòng)完成功能
- Ajax程序中,自己實(shí)現(xiàn)頁面前進(jìn)、后退、與標(biāo)簽功能(asp.net2.0)
- 滑輪滾動(dòng)到頁面底部ajax加載數(shù)據(jù)配合jsonp實(shí)現(xiàn)探討
- Ajax中瀏覽器的緩存問題解決方法
- 淺析AJAX中JavaScript類的三種成員
- 解析RIA和AJAX
- 相關(guān)鏈接:
- 教程說明:
AJAX教程-如何使用WatiN對ASP.NET頁面進(jìn)行單元測試
。