熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

基於 SSL 的 ASP.NET Web 應用程序測試自動化

2013-11-15 12:54:55  來源: ASP編程 

  如果你正在HTTP上使用安全套接字層(SSL)來加密用戶數據並且想通過編程來測試你的Web應用你會發現此技術並非廣為人知在本月的欄目中我將示范如何建立一個 SSL 測試服務器然後編寫測試自動化代碼並通過一個簡單而又具有代表性的 Web 應用來驗證
  
  Microsoft NET環境提供了強有力的測試工具來測試采用SSL安全機制的ASPNET Web應用程序為了說明它們的使用方法我將建立一個SSL服務器並通過一個短小精悍的程序來示范如何自動測試基於HTTPS的Web例子應用程序雖然 在這方面已有個別技術非常經典並且有很好的文章介紹但在與我的許多同事交流中我發現對測試 SSL Web 應用的整體過程的把握相對來說並不是很到位用兩幅屏幕截圖最能說明問題Figure 展示了一個簡單但是很有代表性的ASPNET的Web應用
  
 

  
Figure 一個 ASPNET Web 應用

  
  注意我使用的是 SSL 連接因為我要在 Internet 上傳送敏感的信用卡信息(注意是https://協議並且在狀態欄有一個小鎖 圖標)
  
  現在讓我們想象一下用手工方式是如何測試這個應用程序的我們必須在Web頁上輸入成百甚至上千的用戶名數量以及信用卡號碼檢查每一個確認碼針對預期的結果檢查每行代碼以確定結果是否正確然後將這些結果記錄在一些表格中比如 Excel 電子表格或者文本文件中整個過程耗時低效繁瑣並且容易出錯
  
  一個更好的方法是利用NET框架的強大能力編寫自動化測試例程在程序中用 SSL 發送測試數據然後針對預期的確認碼來檢查響應流Figure 是一個控制台應用程序它演示了上述的思路
  
 

  
  正像你看到的自動化測試案例的基本做法與 Figure 中所示的手動測試是一樣的用戶名稱是Smith物品數量是信用卡號是 通過基於 SSL 的 HTTP 加密後被提交到Web應用測試程序獲取 HTTP 響應流並搜索響應流中的CEDDAB這時在該響應流中找到期望的確認碼所以測試 自動化程序記錄下PASS結果在本欄目後面的三個章節中我將講解產生如 Figure 所示輸出的測試程序演示如何建立一個接受 SSL 請求的測試服務器並討論如何擴展本文呈現的技術來滿足你自己的需要
  
  在我講解如何編寫測試自動化程序之前讓我們首先快速回顧一下本文的例子Web應用程序正如你在 Figure 看到的一樣有三個 TextBox 控件我使用 Visual Studio NET 缺省的IDTextBoxTextBoxTextBox 來命名它們它們分別對應著用戶名稱物品數量以及信用卡帳號 Label 控件 用於顯示應用程序信息當我編寫測試自動化程序時我必須要知道這些信息此外還需要知道訂單確認碼的產生方式以便我能確定我的測試案例期望的結果以下是用於測試此Web應用程序的核心代碼
  
  if (TextBoxTextLength == )
  LabelText = Please enter credit card number;
  else
  {
  byte[] input = EncodingUnicodeGetBytes(TextBoxText);
  byte[] hashed;
  using(MD m = new MDCryptoServiceProvider())
  {
  hashed = mComputeHash(input);
  }
  LabelText = Thank you Your confirmation code is +
  BitConverterToString(hashed)Substring();
  }
  
  為了模擬確認碼的生成我只利用了用戶輸入的信用卡號用它產生一個MD散列然後截取散列值最左邊的個字符在實際的生產系統中你可能會用更為復雜的方式來產生確認碼在這種情況下確定預期的結果可能會更具技巧性不過有一點要特別注意你不能通過調用被測試的程序來確定預期結果因為這將破壞測試的有效性因為你本來就是要檢查 測試自動化程序返回的結果和被測程序返回的結果是否一致
  
  測試自動化程序
  
  這個測試自動化程序出奇的短小其全部代碼如 Figure 所示盡管通過編程將數據提交給某個ASPNET Web 應用程序的技術在 MSDN 庫中已有文檔描述但是其中有幾個技巧需要特別關注
  
  我決定編寫一個C#控制台程序作為我的測試程序使用和被測程序一樣的語言開發測試自動化程序通常是個好主意不管怎麼說規劃良好的設計並與NET環境集成意味著你能安全地使用Visual Basic NET或其它任何與NET兼容的語言一般來說控制台程序類型最適合作為 測試自動化程序雖然測試程序具備漂亮的用戶界面能給用戶留下深刻印象但自動化測試程序是一個工具而不是個人秀此外控制台程序也比GUI程序更容易集成到構建系統中
  
  測試自動化程序的整個結構相當簡單我將測試案例的數據保存在一個簡單的文本文件中每一行數據表示單個測試案例以下是該測試案例文件的內容
  
  :Smith:: :CEDDAB
  :Baker:: :CECF
  :Gates:: :DA
  
  信息之間使用冒號(:)進行分隔我也可以使用任何字符作為分隔符但在實際的測試案例中避免出現含義模糊的字符很重要第一個字段是測試案例編號第二個字 是用戶名稱第三個字段是數量第四個字段是信用卡號碼第五個字段是預期的確認碼如果你不想使用文本文件那麼XML文件或 SQL 表 都是很好的可選方案
  
  我的測試自動化程序的基本結構與我的測試案例數據文件是相關在一起的使用偽代碼表示如下
  
  loop
  read a test case line
  parse out test case data
  build up data to post to application
  convert post data to a byte array
  post the data
  retrieve the response stream
  if response stream contains expected confirmation code
  log pass result
  else
  log fail result
  end loop
  
  我首先聲明要用到的命名空間這樣可以避免用到每個NET類和對象時都得寫全稱限定名同時測試自動化程序將要涉及哪些類庫功能也一目了然 using System;
  using SystemWeb;
  using SystemText;
  using SystemNet;
  using SystemIO;
  
  SystemWeb 命名空間包含了 HttpUtility 類這個類可以將一些特殊字符轉換為轉義字符序列因為缺省的控制台程序並不引用它的所在程序集即 SystemWebdll我們必須手動地添加對它的引用SystemText 命名空間包含了一個Encoding 類我要用它來處理字節數組 (Byte Array)SystemNet 命名空間包含了 HttpWebRequest類 它是將數據提交到 ASPNET Web 應用 的基礎類使用 SystemIO 命名空間 是因為我要用數據流處理基於 SSL 的 HTTP 的響應此外我還需要用它從文本文件中讀取測試案例數據注意using 指令字 允許你在使用某個命名空間中的類型時不必用長長的限定名
  
  接下來在命令外殼中顯示一段簡單的啟動信息後聲明測試自動化 程序要用到的一些關鍵變量 string url = x;
  string viewstate = HttpUtilityUrlEncode(
  dDwMDIxOTUwNDQOzE/ailqxXzCUfpbWTPybfSMA==);
  string line;
  string[] tokens;
  StringBuilder data = new StringBuidler();
  byte[] buffer;
  string proxy = null;
  
  上面大多數變量的目的從其命名一目了然只有 viewstate 是個新變量所以我會對之作簡要解釋現在我打開測試案例文件並且一行一行地讀取
  
  using(FileStream fs = new FileStream(args[] FileModeOpen))
  {
  StreamReader tc = new StreamReader(fs);
  while ((line = tcReadLine()) != null)
  {
  // parse line post data get response
  // determine pass or fail log result
  }
  }
  
  雖然有很多可選方法來設計此自動化過程但是 上述這個簡單的結構已經在幾個大型項目中被證明是健壯的下一步是解析測試案例中數據的每個字段並且構建一個包含名稱對 的字符串
  
  tokens = lineSplit(:);
  dataLength = ;
  dataAppend(TextBox= + tokens[]);  // Last name
  dataAppend(&TextBox= + tokens[]); // Quantity
  dataAppend(&TextBox= + tokens[]); // Credit card number
  dataAppend(&Button=clicked);
  dataAppend(&__VIEWSTATE= + viewstate);
  
  我使用StringSplit方法將測試 案例數據行分開並且將每個字段保存到tokens數組中 測試案例的ID保存到tokens[]中用戶名稱保存到tokens[]中物品數量保存到tokens[]中信用卡號保存到tokens[]中為了清晰起見也可以將這些數值復制到額外的 具有描述性的字符串變量中caseIDlastName如下所示
  
  caseID = tokens[];
  lastName = tokens[];
  // etc
  但是我想讓所使用的變量數為最少傳統的Web服務器 一般都用名稱對來 提交(POST)數據多個數據之間用&符號分開如下
  
  lastName=Smith&quantity=&creditCardNo=
  但是ASPNET擴展了這種做法在這個例子中 有五個名稱第一對你可能希望是TextBox=tokens[]它將當前測試 案例的用戶名稱(保存在tokens[
From:http://tw.wingwit.com/Article/program/ASP/201311/21874.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.