2009年6月7日 星期日

VS2010: Test Project 之 Coded UI Test

在 VS2008 以前,是沒有辦法對 Window Form Application 進行測試的。只能以 Unit Test 的方式進行。這樣會產生一個不良的後果:UI 增加或減少了 control 後,就很難再進行測試了。因為修改UI 後,程式不一樣,測試通常會失敗。

相同的道理,也發生在 Web test 上。例如,一個已經錄製好的 Web Test, 後來因需要增加一個 hidden field. 即 <input type=’hidden’/> …。
在 Web UI 上,使用者鐵定看不到任何變化,因為此欄位是隱藏的,但對於錄製過的 Web Test ,其 Request/Response 會因此而改變。當測試的結果發現了新的資料,該測試到底是正確還是錯誤呢?無法判斷。而這類的問題, Test Project 進行測試時,一律以 Error 回報。
碰到UI 修改後,我們只能重新錄製 Web Test。試想我們錄製的test 不能重複測試,直到錯誤發生後,第一個反射動作是:「錄製的測試不再適用了」,而非「程式有例外」時,以後任何類似的測試結果我們都無法再相信,該測試已經失去了意義。

現在要介紹的 Coded UI Test 不再是解析錄製過程中的 Request/Respose,至少 Windows Form 的程式未必有 Reqeust/Respose 的資料。Coded UI Test 記錄的是測試過程式對哪幾個 control 進行什麼動作,例如對一個名為 txtInput 的 TextBox 元件輸入 “hello, 程湘之間”的 text,或者對 btnGo 的 button 進行 left mouse click 的動作。

舉個例子,一個典型的 asp.net web form, 如下。

Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>





    


    
Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            lblNow.Text = DateTime.Now.ToString();
        }

        protected void btnGo_Click(object sender, EventArgs e)
        {
            txtHello.Text = "Hi, " + txtHello.Text;
        }
    }
}

結果很簡單,不需要做任何說明。
我們增加一個 Web Test, CodedUI Test來做為相互比較。由於 Web Test 已經存在很久了,我僅說明新增 CodedUI test 的過程

首先,在 Test Project 上新增一個 CodedUI Test,再來選擇第二項的「use the recorder」。

image image

按一下「Record Actions」後,開始錄製我們在 Windows 上所有的一切動作。

image

此時點擊 「Internet exploree」,執行我們正常瀏覽網頁的一切,完成後,按「Generate Method」鍵。

image

測試一下吧!兩種測試皆會通過。

image

但,世事多變化,客戶認為 lblNow 永遠顯示最新的伺服器時間是不對的,應改為第一次登入網頁的時間,因此增加了一個 hidden 欄位,並修改 code behind 的程式,如下。

更改後的 Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>





    


    
更改了的 Default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                lblNow.Text = DateTime.Now.ToString();
                Hidden1.Value = DateTime.Now.ToString(); // add this line
            }
            else
            {
		//add following line
                lblNow.Text = string.Format("Last time you login is {0}", DateTime.Parse(Hidden1.Value));
            }
        }

        protected void btnGo_Click(object sender, EventArgs e)
        {
            txtHello.Text = "Hi, " + txtHello.Text;
        }
    }
}

測試的結果,Web Test 會發生錯誤,而 Coded UI Test 仍然正確。

image image

看一下 WebTest1 的錯誤原因是 String was not recognized as a valid DateTime. 怎麼會呢?網頁明明執行的好好的。
檢查一下Request ,由於修改前錄製的 Request 並尚未包含 hidden control,因此並不會傳該 control 的值,當然伺服器找不到這個值就會出錯。
而 CodedUI Test 並沒有這個的問題。

image

結論

以往修改網頁後,碰到這樣的問題,只能默默地摸摸鼻子再錄製一次 Web Test。現在有了 CodedUI test 的幫助,就快活多了。

沒有留言:

Share with Facebook