本文章是由機器翻譯。

測試回合

使用訊息測試 Silverlight 應用程式

James McCaffrey

下載程式碼範例

我是大風扇的 Silverlight 並在本月 ’s 專欄我將說明一種技術可用來測試 Silverlight 應用程式。

Silverlight 是最初發行 2007年中一完成 Web 應用程式架構。目前的版本 Silverlight 3 發行在七月 2009年中。Visual Studio 2010 提供 Silverlight 的增強的支援,特別完全整合的視覺化設計工具,可讓設計 Silverlight 使用者介面是嵌入式管理單元。

讓您查看我字形本文中最好是將看看自己的應用程式。圖 1 顯示一個的簡單但代表性 Silverlight 應用程式命名 MicroCalc。您可以看到 MicroCalc 裝載在 Internet Explorer 內雖然 Silverlight 應用程式也由其他瀏覽器中包括 Firefox、 Opera 和狩獵裝載。


圖 1 的 MicroCalc Silverlight 應用程式

圖 2 顯示一個輕量型測試] 控管這也是一個 Silverlight 應用程式。


圖 2 的 MicroCalc 的測試控管

在此範例選取第一個測試案例。已在按一下按鈕控制項標示為 [執行選取的測試時 Silverlight 測試控管會傳送包含選取的測試案例輸入的資料至受測的 Silverlight MicroCalc 應用程式的訊息。這個測試案例資料包含的指示來模擬使用者,2.5 和 3.0 鍵入到應用程式的輸入區域選取 [乘作業,然後按一下 [Compute] 按鈕選取。

應用程式接受測試案例資料,並以程式設計方式加以操練本身使用檢測到應用程式的測試程式碼。短的延遲後測試控管將第二個訊息傳送至受要求應用程式傳送訊息,其中包含應用程式 ’s 狀態的相關資訊的測試應用程式 — 也就是,[結果] 欄位中的值。測試控管應用程式接收結果的訊息,而且決定 7.5000,應用程式中實際的值符合預期的值,測試案例的資料中,然後在控管的註解區域顯示通過測試案例結果。

本文假設 C# 語言的基本熟悉,但不會假設您有使用 Silverlight 的任何經驗。在各本專欄的節,我先說明受測試的 Silverlight 應用程式。我帶您逐步完成建立輕量級 Silverlight 測試控管 圖 1 所示的詳細資料,然後我將說明如何檢測應用程式。我藉由描述替代的測試方法結束今天的。

受測試的應用程式

let’s 看一下 Silverlight MicroCalc 應用程式中做為目標的我的測試自動化範例程式碼。我建立 MicroCalc 使用 Visual Studio 2010 Beta 2。Silverlight 3 完全整合到 Visual 的 Studio 2010,但我在此處呈現程式碼也可以使用 Silverlight 3 SDK 分開安裝的 Visual Studio 2008。

在啟動 Visual Studio 之後, 我按下了在檔案上 | 新增 | 專案。請注意在 Silverlight 應用程式可能會裝載在 Web 應用程式,而不是 Web 應用程式本身的.NET 元件。在 [新增專案] 對話方塊中我選取了 C# 語言範本選項。Silverlight 應用程式也可以建立使用 Visual Basic,而您甚至可以建立使用新的 F # 語言的 Silverlight 程式庫。

我選取預設的 Microsoft.NET Framework 4 程式庫選項和 Silverlight 應用程式樣板。Silverlight 包含.NET] Framework 子集因此不.NET Framework 4 的所有部分都都可以使用 Silverlight 應用程式。之後填入 [名稱 (SilverCalc)] 和 [位置 (C:\SilverlightTesting) 欄位我按一下 [確定] 按鈕。(請注意 SilverCalc 是 Visual Studio 專案名稱,而且 MicroCalc 是應用程式名稱)。

Visual Studio 再提示我一個新的 Silverlight 應用程式] 對話方塊,會令人困惑至 Silverlight 初學者。let’s 會在 的 圖 3 再進一步的選項。


圖 3 的 新的 Silverlight 應用程式] 對話方塊的方塊選項

依預設會檢查第一個項目 「 主機 Silverlight 應用程式中新的網站 」。這會指示 Visual Studio 建立兩個不同的 Web 網頁裝載您的 Silverlight 應用程式。

下一個項目是 Visual Studio 專案包含兩個主應用程式頁面名稱。專案會加入至 Visual Studio 方案。

第三個項目] 對話方塊中的是以三個選項的下拉式清單控制項:ASP.NET Web 應用程式專案、 ASP.NET 網站和 ASP.NET MVC Web 專案。這些選項的完整討論已超出本文章的範圍,但下一行是最佳的一般用途選項是 ASP.NET Web 應用程式專案。

第四個的項目] 對話方塊中為下拉式清單來選取 Silverlight 版本在這種情況下 3.0 版。按一下 [確定] 後, Visual Studio 會建立空白的 Silverlight 應用程式。

我來載入 XAML UI 定義至 Visual Studio 編輯器 MainPage.xaml 檔案上連按兩下。我可以修改預設最上層的多筆編輯控制項的屬性加入寬度] 和 [高度] 屬性,然後變更背景色彩屬性:

<Grid x:Name="LayoutRoot"
  Background="PaleGreen" 
  Width="300" Height="300">

預設情況下,為 Silverlight 應用程式會佔用整個用戶端區域,其裝載網頁中。 這裡我會為 300 像素,讓我看起來像這樣 WinForm 應用程式的預設大小的 Silverlight 應用程式設定寬度及高度。 我進行調整,讓我清楚可見的 Silverlight 應用程式所佔用的區域色彩。

接下來我用 Visual Studio 來將標籤、 三個文字方塊控制項、 兩個選項按鈕控制項及 Button 控制項加入到我的應用程式如 的 圖 1 所示。 Visual Studio 2010 具有完全整合的設計檢視,以便當我將諸如一 TextBox 控制項拖曳至設計介面時,會自動產生基礎的 XAML 程式碼:

<TextBox Width="99" Height="23" Name="textBox1" ... />

之後放置標籤與控制項到我 MicroCalc 應用程式,我按兩下 Button 控制項 MainPage.xaml.cs 檔案中加入其事件處理常式上。 程式碼編輯器中鍵入下列 C# 程式碼給 MicroCalc 它的功能:

private void button1_Click(
  object sender, RoutedEventArgs e) {

  double x = double.Parse(textBox1.Text);
  double y = double.Parse(textBox2.Text);
  double result = 0;
  if (radioButton1.IsChecked == true)
    result = x * y;
  else if (radioButton2.IsChecked == true)
    result = x / y;
  textBox3.Text = result.ToString("0.0000");
}

我開始由抓取 textBox1] 和 [textBox2 控制項的輸入成文字值和以雙鍵入在轉換。 請注意,若要保持範例的簡潔,我省略了正常錯誤檢查您在實際的應用程式中執行。

接下來我要判斷使用者選取哪個選項按鈕] 控制項。 我必須使用完全合格的布林 (Boolean) 運算式:

if radioButton1.IsChecked == true

您可能會有預期我使用快顯表單:

if radioButton1.IsChecked

因為 IsChecked 屬性是可為 Null 的型別 bool,我會使用完整格式的表單嗎? 而非一般的 bool。

之後指定的結果的電腦我將放入 textBox3 控制格式化為四個小數位數的結果。

MicroCalc 現在是就緒,而且我能擊中 F5 鍵,以指示 Visual Studio 來執行應用程式。 依預設值,Visual Studio 會啟動 Internet Explorer,而自動產生關聯的.aspx 主機頁面載入。 透過內建的 Web 開發伺服器,而不是透過 IIS,Visual Studio 就會執行 Silverlight 測試裝載頁面。 除了一個.aspx 測試主機網頁,Visual Studio 也會產生 HTML 測試網頁,您可以手動載入 Internet Explorer 中輸入其位址,即可。

測試控管

既然您看過受測試的 Silverlight 應用程式,讓我描述測試控管。

我決定使用來控管與應用程式之間傳送訊息的 [本機通訊。 我開始啟動 Visual Studio 2010 的新執行個體。 我建立新的 Silverlight 應用程式,名為 TestHarness 前一節所述,請使用相同的程序。 為但與 MicroCalc] 應用程式我,被編輯最上層的多筆編輯控制項 Bisque 來變更它的預設大小,以 300 x 300 像素和它的背景色彩若要讓 Silverlight 控制項清楚地突顯出來的。 接下來我會控管設計介面加入標籤控制項、 兩個清單方塊控制項和按鈕控制項。

之後將 Button 控制項的內容的屬性變更為執行選取的測試,我連按兩下按鈕,以產生其事件處理常式。 邏輯程式碼加入處理常式之前, 我宣告一個類別範圍 LocalMessageSender 物件和測試實例檔案中的資料 MainPage.xaml.cs 的控管,以便控管可以傳送訊息給受測試應用程式:

public partial class MainPage : UserControl {
  LocalMessageSender lms = null;
  private string[] testCases = new string[] {
    "001:2.5:3.0:Multiply:7.5000",
    "002:8.6:2.0:Divide:4.3000"
  };
...

因此我新增一個參照給它一個使用 System.Windows.Messaging 命名空間中包含 LocalMessageSender 類別陳述式上方的.cs 檔案,讓我 don’t 需要完整限定類別名稱。 我為我的測試案例資料採用簡單的方法,並使用以冒號分隔的字串包含欄位的測試案例 ID、 第一個輸入的值、 第二個輸入的值、 作業及預期的結果。 接下來,我新增的測試案例的每個欄位的類別範圍字串變數:

private string caseID;
private string input1;
private string input2;
private string operation;
private string expected;
...

這些變數 aren’t 技術上有必要,但請測試程式碼更容易地讀取及修改。

現在,讓我的測試控管可以接受來自受測試應用程式的郵件,到 MainPage 建構函式產生 LocalMessageReceiver 物件:

public MainPage() {
  InitializeComponent();

  try {
    LocalMessageReceiver lmr =
      new LocalMessageReceiver("HarnessReceiver",
        ReceiverNameScope.Global,
        LocalMessageReceiver.AnyDomain);
...

LocalMessageReceiver 物件建構函式會接受三個引數。 第一個引數是識別接收者的名稱 — 這會用 LocalMessageSender 物件所指定目標的接收者。 第二個引數是列舉型別,指定接收者名稱範圍的通用網域,或更多限制的網域。 第三個引數指定接收者會接受來自的 [郵件],在此種情況下任何網域。

接下來我電傳的事件處理常式,接收者的然後再向上收件者物件引發:

lmr.MessageReceived += HarnessMessageReceivedHandler;
lmr.Listen();
...

此處我指出當測試控管收到一則訊息,控制轉移到程式定義的方法,稱為 HarnessMessageReceivedHandler。 待命] 方法如您所預期持續監視從受測試應用程式中 LocalMessageSender 傳送的傳入訊息。

現在我具現化我先前宣告的寄件者物件:

lms = new LocalMessageSender(
  "AppReceiver", LocalMessageSender.Global);
lms.SendCompleted += HarnessSendCompletedHandler;
...

請注意寄件者物件的第一個引數是目標收件者物件,不一個寄件者的識別名稱的名稱。 這裡將訊息只給接收者,名為 AppReceiver 位於受測試應用程式會傳送我的測試控管寄件者。 亦即接收器物件有名稱,並將接受任何寄件者] 物件的訊息但寄件者物件沒有名稱,而且會將訊息傳送給特定收件者只。

之後執行個體化寄件者物件,我電傳 SendCompleted 事件的事件處理常式。 現在我就可以載入我的測試案例,並處理任何例外狀況:

...
    foreach (string testCase in testCases) {
      listBox1.Items.Add(testCase);
    }
  } // try
  catch (Exception ex) {
    listBox2.Items.Add(ex.Message);
  }
} // MainPage()

我只需逐一測試案例 
array,將每個測試案例字串新增至清單方塊 1] 控制項。 如果發生了任何的例外狀況,我只是顯示其文字 listBox2 控制項中用來註解。

此時可以控管可接受從應用程式的狀態資訊以傳送該應用程式] 及 [收件者物件的測試案例輸入控管中有寄件者物件。 現在我回到我先前加入至 button1_Click 處理常式方法。 在處理常式中我開始剖析選取的測試案例:

string testCaseData = (string)listBox1.SelectedItem;
string[] tokens = testCaseData.Split(':');
caseID = tokens[0];
input1 = tokens[1];
input2 = tokens[2];
operation = tokens[3];
expected = tokens[4];
...

現在我 ’m 準備好要傳送至 Silverlight 應用程式受測試的測試案例輸入:

string testCaseInput = 
  input1 + ":" + input2 + ":" + operation;
listBox2.Items.Add("========================");
listBox2.Items.Add("Test case " + caseID);
listBox2.Items.Add(
  "Sending ‘" + testCaseInput + "’ to application");
lms.SendAsync("data" + ":" + testCaseInput);
...

我將回一起只是測試案例輸入。我不要傳送測試案例識別碼或預期的值到應用程式因為只有控管,處理這些值。之後顯示部分註解至 listBox2 控制項,我可以使用 LocalMessageSender 物件的 SendAsync 方法來傳送測試案例資料。我前面加上字串 「 資料 」,使應用程式具有識別何種類型的訊息接收到的方法。

我按鈕事件處理常式完成為了要讓應用程式時間執行,暫停一秒的然後我傳送一則訊息,詢問其狀態資訊的應用程式:

System.Threading.Thread.Sleep(1000); 
  lms.SendAsync(“response”);
} // button1_Click

您應該還記得我有線傳送完成的事件處理常式,但是在這種設計我不需要執行任何明確的 post-send 處理。

控管程式碼的最後一部份,處理從 Silverlight 應用程式,來控管傳送郵件:

private void HarnessMessageReceivedHandler(object sender,
  MessageReceivedEventArgs e) {

  string actual = e.Message;
  listBox2.Items.Add(
    "Received " + actual + " from application");
  if (actual == expected)
    listBox2.Items.Add("Pass");
  else
    listBox2.Items.Add("**FAIL**");

  listBox2.Items.Add("========================");
}

此處我擷取郵件從應用程式是 textBox3 結果控制項中的值,並將該值儲存到名為變數實際。 之後顯示註解,我比較已經用預期的值來決定,並顯示測試案例通過/失敗結果的測試案例資料從剖析應用程式所傳送的實際值。

檢測 Silverlight 應用程式

現在 let’s 檢查受測試的 Silverlight 應用程式內已經過檢測的程式碼。 我先宣告類別範圍 LocalMessageSender 物件。

這個寄件者會傳送訊息至測試控管:

public partial class MainPage : UserControl {
  LocalMessageSender lms = null;
  public MainPage() {
    InitializeComponent();
...

接下來我具現化 MainPage 建構函式中的接收者,若要接受來自測試控管電線事件處理常式,並開始接聽控管的訊息:

try {
  LocalMessageReceiver lmr =
    new LocalMessageReceiver("AppReceiver",
      ReceiverNameScope.Global,
      LocalMessageReceiver.AnyDomain);
  lmr.MessageReceived += AppMessageReceivedHandler;
  lmr.Listen();
...

同前請注意您指派名稱給收件者] 物件,而此名稱對應到寄件者物件控管中的第一個引數。 然後我處理的任何例外狀況:

...
  }
  catch (Exception ex) {
    textBox3.Text = ex.Message;
  }
} // MainPage()

我在 textBox3 控制項 MicroCalc 應用程式結果欄位中顯示的例外狀況訊息。 這個方法會是完全臨機操作,但是回到測試控管傳送例外狀況訊息可能不是可行如果傳訊程式碼擲回的例外狀況。 現在我處理傳送的測試控管郵件:

private void AppMessageReceivedHandler(object sender,
  MessageReceivedEventArgs e) {
  string message = e.Message;
  if (message.StartsWith("data")) {
    string[] tokens = message.Split(‘:’);
    string input1 = tokens[1];
    string input2 = tokens[2];
    string operation = tokens[3];
...

測試控管會傳送兩種類型的訊息。 測試案例輸入資料一開始就有 「 資料 」,而要求的應用程式狀態是只是 「 回應 」。我使用 StartsWith 方法來判斷應用程式所收到的訊息是否為測試案例輸入。 如果是這樣,我使用分割方法剖析輸入到使用描述性名稱的變數。

現在檢測使用輸入來模擬使用者動作的測試案例:

textBox1.Text = input1;
textBox2.Text = input2;
if (operation == "Multiply")
  radioButton1.IsChecked = true;
else if (operation == "Divide")
  radioButton2.IsChecked = true;
...

在一般修改如文字及 IsChecked] 屬性,在此範例的控制項的屬性來模擬使用者輸入很簡單。 不過,模擬事件,例如按鈕點選需要不同的方法:

button1.Dispatcher.BeginInvoke(
  delegate { button1_Click(null,null); });

發送器類別是 Windows.Threading 命名空間的一部分,所以我加入了一個使用參考該應用程式的類別陳述式。 BeginInvoke 方法可讓您以非同步方式在 Silverlight 使用者介面執行緒上呼叫方法。 BeginInvoke 可以接受委派是方法周圍的包裝函式。 這裡我會使用匿名委派功能來簡化我呼叫。 此屬性傳回 BeginInvoke DispatcherOperation 物件,但在這種情況下我可以放心地忽略該值。

發送器類別也具有 CheckAccess 方法可用來判斷 CheckAccess 傳回 false) 時,是否需要 BeginIvoke 或是否您可以只修改的屬性 (CheckAccess 傳回,則為 True)。

我所要求的應用程式狀態的測試控管來自訊息處理完成我檢測:

...
  }
  else if (message == "response") {
    string actual = textBox3.Text;
    lms.SendAsync(actual);
  }
} // AppMessageReceivedHandler()

如果收到訊息只是字串 「 回應 」,我抓取 textBox3 控制項中的值,並將它傳送回到測試控管。

我在本文中說明的測試系統只是之一許多種方法,您可以使用及最適合用於 4-4-4 ultra-light 測試自動化。藉由這我是說,有預期的生命週期的 4 個星期或更少、 4 頁所組成的控管或更少的程式碼,且需要 4 小時或更少的值來建立。

測試使用郵件相較於其他方法的主要的優點是技巧會很簡單。主要的缺點是受測試應用程式必須被大量檢測,這不一定可行。

我有此處介紹的技巧的兩個重要替代方法使用 HTML 橋接具有 JavaScript 和使用 Microsoft UI 自動化程式庫。像往常一樣我提醒您該沒有人特定測試的方法是最佳的所有情況下,但我此處介紹的郵件為基礎的方法可以是一種有效率及有效的技巧,在許多軟體開發案例中。

Dr。James McCaffrey  適合 Volt 資訊科學 Inc.他負責管理技術訓練的軟體工程師在 Microsoft 台北市,Wash.,工作 校園。他已投入包括 Internet Explorer] 和 [MSN 搜尋數個 Microsoft 產品。Dr.McCaffrey 是 「.NET 測試自動化食譜 」 (Apress 2006) 的作者。他可以達到在 jammc@microsoft.com

多虧到下列的技術專家來檢閱這份文件: 卡爾 Erickson 和 Nitya Ravi