本文章是由機器翻譯。

測試回合

使用 IronPython 測試要求-回應

James McCaffrey

下載代碼示例

我比較喜歡使用 Python 程式設計語言來執行多種類型的小型測試自動化任務。在本月的專欄中,我會向大家介紹如何使用 IronPython(與 Microsoft .NET Framework 相容的 Python 實現)對 ASP.NET Web 應用程式執行 HTTP 請求-回應測試。

具體而言,我會創建一個簡短的測試工具腳本,用於類比使用者執行 ASP.NET 應用程式。IronPython 工具以程式設計方式將 HTTP 請求資訊發佈到 Web 伺服器上的應用程式。然後,會提取 HTTP 回應流
並檢查 HTML 文本是否為某種預期值,從而確定結果是通過還是失敗。除了其本身是一項實用的
測試技術外,瞭解如何使用 IronPython 執行 HTTP 請求-回應測試也是瞭解 IronPython 語言的最佳途徑。

本專欄假設您對 ASP.NET 技術已有一些基本瞭解,具備使用 JavaScript、Windows PowerShell、VBScript、Perl、PHP 或 Ruby 等語言編寫腳本的中級技能,並且假設您沒有使用 Python 的任何經驗。然而,即使您不熟悉 ASP.NET 和腳本編寫,也應當仍然能夠輕鬆理解本專欄介紹的內容。若要瞭解我將介紹的內容,最好是看一下圖 1圖 2 中的螢幕擷取畫面。

图 1 說明了待測試的示例 ASP.NET Web 應用程式。待測試系統是一個名為 MiniCalc 的簡單但極具代表性的 Web
應用程式。我有意使待測試的 ASP.NET Web 應用程式盡可能簡單,以免 IronPython 測試自動化中的要點變得模糊。實際的 Web 應用程式要比圖 1 中所示的虛擬 MiniCalc 應用程式複雜得多,但此處所介紹的 IronPython 測試技術可輕鬆推廣到複雜的應用程式。MiniCalc Web 應用程式接受兩個數值、將值相加或相乘的指示,以及答案顯示的小數位數。然後,將這些值發送到用於計算結果的 Web 伺服器。該伺服器會創建 HTML 回應並將其發送回用戶端流覽器,其中顯示了具有使用者指定的小數位數的結果。

圖 1 待測試的 MiniCalc Web 應用程式

图 2 顯示的是正在運行的 IronPython 測試工具。我的腳本名為 harness.py 並且不接受任何命令列參數。為簡單起見,我使用硬編碼處理了 Web 應用程式的 URL 以及測試用例輸入檔案名等資訊。工具首先會回顯目標 URL:http://localhost/MiniCalc/Default.aspx。在測試用例 001 中,工具通過程式設計方式發佈資訊,相當於使用者將 1.23 鍵入控制項 TextBox1,將 4.56 鍵入 TextBox2,選擇 RadioButton1(表示加法操作),從 DropDownList1 控制項中選擇 4,然後按一下 Button1(執行計算)。工具會在後臺捕獲來自 Web 伺服器的 HTTP 回應,然後搜索回應中是否指示 TextBox3 結果控制項中顯示的是 5.7900(1.23 與 4.56 的正確總和並保留四位小數)。工具會記錄通過的測試用例數和失敗的測試用例數,並在處理所有測試用例之後顯示這些結果。

圖 2 使用 IronPython 測試應用程式

在後續部分中,我將簡要介紹一下待測試的 Web 應用程式,從而使您準確地瞭解測試內容。接下來,將向您介紹使用 IronPython 創建小型 HTTP 請求–回應自動化程式的詳細資訊。最後,作為總結,我會提出幾條有關何時適合使用 IronPython 以及何時更適合使用其他技術的意見。我相信您會發現這些資訊對於您的測試工具集是個有趣且有用的補充。

待測試的應用程式

我們來看看作為測試自動化目標的 MiniCalc ASP.NET Web 應用程式的代碼。我使用了 Visual Studio 2008 來創建應用程式。在以管理員許可權啟動 Visual Studio 後,按一下“檔”|“新建”|“網站”。為了避免使用 ASP.NET 代碼隱藏機制並且在一個檔中保存 Web 應用程式的所有代碼,我選擇了“空網站”選項。然後,在位置欄位中指定了 http://localhost/MiniCalc。我決定對 MiniCalc 應用程式使用 C# 語言,但本專欄仲介紹的測試工具適用于以 VB.NET 編寫的 ASP.NET 應用程式;只要稍作修改,該工具便可以針對以傳統的 ASP、CGI、PHP、JSP 和 Ruby 等技術編寫的 Web 應用程式。在“新建網站”對話方塊上按一下“確定”,以生成 Web 應用程式的結構。接下來,轉到解決方案資源管理器視窗,按右鍵 MiniCalc 專案名稱,並從上下文功能表中選擇“添加新項”。然後,從已安裝的範本清單中選擇“Web 表單”,並接受 Default.aspx 檔案名。我清除了“將代碼放在單獨的檔中”選項,然後按一下“添加”按鈕。接下來,在解決方案資源管理器中按兩下 Default.aspx 檔案名,以編輯範本生成的代碼。我刪除了所有範本代碼並替換為 圖 3 中所示的代碼。

圖 3 MiniCalc 代碼

<%@ Page Language="C#" %>
<script runat="server">
  private void Button1_Click(object sender, System.EventArgs e)
  {
    double alpha = double.Parse(TextBox1.Text.Trim());
    double beta = double.Parse(TextBox2.Text.Trim());

    string formatting = "F" + DropDownList1.SelectedValue;

    if (RadioButton1.Checked)
      TextBox3.Text = Sum(alpha, beta).ToString(formatting);
    else if (RadioButton2.Checked)
      TextBox3.Text = Product(alpha, beta).ToString(formatting);
    else
     TextBox3.Text = "Select method";
  }
  private static double Sum(double a, double b)
  {
    return a + b;
  }
  private static double Product(double a, double b)
  {
    return a * b;
  }
</script>

<html>
  <head>
    <style type="text/css">
     fieldset { width: 16em }
     body { font-size: 10pt; font-family: Arial }
    </style>
    <title>Default.aspx</title>
    </head>
  <body bgColor="#ccffff">
    <h3>MiniCalc by ASP.NET</h3>
    <form method="post" name="theForm" id="theForm" runat="server"             action="Default.aspx">
      <p><asp:Label id="Label1" runat="server">Enter number:&nbsp</asp:Label>
      <asp:TextBox id="TextBox1" width="100" runat="server" /></p>
      <p><asp:Label id="Label2" runat="server">Enter another:&nbsp</asp:Label>
      <asp:TextBox id="TextBox2" width="100"  runat="server" /></p>
      <p></p>
      <fieldset>
        <legend>Arithmentic Operation</legend>
        <p><asp:RadioButton id="RadioButton1" GroupName="Operation"                 runat="server"/>Addition</p>
        <p><asp:RadioButton id="RadioButton2" GroupName="Operation"                 runat="server"/>Multiplication</p>
        <p></p>
      </fieldset>
    <p>Decimals:   
      <asp:DropDownList ID="DropDownList1" runat="server">
      <asp:ListItem>3</asp:ListItem>
      <asp:ListItem>4</asp:ListItem>
      </asp:DropDownList>
    </p>
      <p><asp:Button id="Button1" runat="server" text=" Calculate "            onclick="Button1_Click" /></p>
      <p><asp:TextBox id="TextBox3" width="120"  runat="server" />
    </form>
  </body>
</html>

為使原始程式碼規模變小並易於理解,我採用了一些捷徑,例如不執行錯誤檢查,以及將伺服器端控制項(如 <asp:TextBox>)與純 HTML(如 <fieldset>)進行組合。 图 3 中代碼的最重要部分是 ASP.NET 伺服器端控制項的 ID。 我使用的是預設 ID:Label1(使用者提示)、TextBox1 和 TextBox2(輸入兩個數字)、RadioButton1 和 RadioButton2(選擇加法或乘法)、DropDownList1(結果的小數位數)、Button1(計算)和 TextBox3(結果)。 若要使用此處介紹的技術針對 ASP.NET 應用程式自動執行 HTTP 請求-回應測試,您必須知道應用程式控制項的 ID。 在這種情況下,由於是我自己創建的應用程式,因此我可以提供原始程式碼;不過,即使您測試的是他人編寫的 Web 應用程式,也可以始終使用 Web 流覽器的“查看原始程式碼”功能來檢查應用程式。

為驗證待測試的 Web 應用程式是否已正確構建,我按下了 <F5>鍵。 在生成的“未啟用調試”對話方塊中按一下“確定”,指示 Visual Studio 修改 Web 應用程式的 Web.config 檔。 然後,Visual Studio 會啟動 Internet Explorer 並載入 MiniCalc。 請注意,<form>元素的 action 屬性已設為 Default.aspx。 換言之,每次使用者提交請求時,都會執行相同的 Default.aspx 頁面代碼。 這使得 MiniCalc Web 應用程式如同一個應用程式,而不是一系列不同的網頁。 由於 HTTP 是無狀態協定,因此 ASP.NET 通過將 Web 應用程式的狀態放在名為 ViewState 的特殊隱藏數值型別中來實現應用程式效果。 正如稍後您將看到的那樣,處理 ASP.NET 應用程式的 ViewState 是以程式設計方式向應用程式發佈資料的關鍵之一。

使用 IronPython 進行 ASP.NET 請求-回應測試

讓我們回顧一下生成了圖 2 中螢幕擷取畫面的 IronPython 測試工具程式。 IronPython 可以從 CodePlex(Microsoft 發起的開源專案)免費下載,網址為 ironpython.codeplex.com。 我使用的是 2.6.1 版,可在 .NET Framework 2.0 版上和支援該版本 Framework 的任何電腦上運行。 图 4 介紹了我的測試工具腳本的整體結構。

图 4 测试工具结构

set up imports
define helper functions

try:
  initialize variables
  open test case data file
  loop
    read a test case from file
    parse test case data
    determine ViewState
    determine EventValidation
    construct request string
    send request string to app
    fetch response from app
    determine if response has expected result
    print pass or fail
  end loop
  close test case data file
  print summary results
except:
  handle exceptions

如您所見,我的工具腳本非常簡單,由外部測試用例資料檔案驅動。 該測試用例資料檔案名為 testCases.txt,其中包含以下內容:

001|1.23|4.56|RadioButton1|4|clicked|5.7900
002|1.23|4.56|RadioButton2|4|clicked|5.7900
003|2.00|3.00|RadioButton1|4|clicked|5.0000

每一行代表一個測試用例,並且以“|”字元分隔七個欄位。 第一個欄位是測試用例 ID。 第二個和第三個欄位是 TextBox1 和 TextBox2 的輸入。 第四個欄位編碼目的是請求加法還是乘法。 第五個欄位是小數位數 DropDownList 控制項的值。 第六個欄位(“clicked”)是 Button1 事件。 第七個欄位是預期結果,應顯示在 TextBox3 中。 第二個測試用例有意設計的不正確,只是為了演示測試用例失敗情況。 對於我在此描述的小型測試方法,使用簡單的文字檔保留測試用例資料通常是一種不錯的選擇。 如果要在工具腳本中直接嵌入測試用例資料,只需使用以下字串陣列即可:

testCases = ['001|1.23|4.56|RadioButton1|4|clicked|5.7900',
             '002|1.23|4.56|RadioButton2|4|clicked|5.7900',
             '003|2.00|3.00|RadioButton1|4|clicked|5.0000']

然後,反覆運算每個測試用例,如下所示:

for line in testCases:
  ...

Python 還提供了可用於存儲測試用例資料的清單類型。

我的 IronPython 測試工具的前三行如下:

# harness.py
import sys
import clr

Python 中的注釋以“#”字元開頭,並延伸到行尾。 通過“import sys”語句,腳本可以訪問特殊 IronPython sys 模組中的資源。

從 IronPython 互動式主控台發出 sys.path 命令,可列出這些資源的位置。 通過“import clr”語句,腳本可以訪問和使用核心 .NET CLR 功能。

接下來的六條語句顯式啟用工具所使用的 .NET 功能:

from System import *
from System.IO import *
from System.Text import *
from System.Net import *
clr.AddReference('System.Web')
from System.Web import *

此處第一行導入 System,與 C# 程式中的“using System”語句類似。 “import clr”語句包括 System 命名空間,因此我可以省略“from System import *”語句,但是我傾向于將它以文檔形式保留。 隨後的三條語句將 System.IO(用於檔操作)、System.Text(用於位元組轉換)和 System.Net(用於請求-回應功能)命名空間引入作用域。 “clr.AddReference(‘Sys­tem.Web’)”語句將 System.Web 命名空間引入作用域。 預設情況下無法直接訪問此命名空間,因此必須在發出“from System.Web import *”語句之前使用 AddReference 方法,才能訪問 URL 編碼方法。

接下來,定義一個説明程式方法來提取待測試的 Web 應用程式的 ViewState 資訊:

def getVS(url):
  wc = WebClient()
  bytes = wc.DownloadData(url)
  html = Encoding.ASCII.GetString(bytes)
  start = html.IndexOf('id="__VIEWSTATE"', 0) + 24
  end = html.IndexOf('"', start)
  vs = html.Substring(start, end-start)
  return vs

請記住,由於 HTTP 是無狀態協定,因此 ASP.NET 通過將應用程式的狀態放在名為 ViewState 的隱藏值中來塑造出有狀態應用程式的效果。 ViewState 值是 Base64 編碼的字串,用於在多次請求/回應往返期間保持 ASP.NET 頁面的狀態。 與此類似,出於安全考慮在 ASP.NET 2.0 中添加了 EventValidation 值,以防止受到腳本插入式攻擊。 對於以程式設計方式向 ASP.NET Web 應用程式發佈資料而言,這兩個機制非常關鍵。

在 Python 中,您必須先定義函數,然後才能在腳本中進行調用。 函數是使用 def 關鍵字定義的。 説明程式函數首先產生實體 WebClient 物件。 接下來,DownloadData 方法向 url 參數指定的 Web 應用程式發送 HTTP 請求,並提取 HTTP 回應作為位元組值陣列。 我使用 GetString 方法將位元組轉換為名為 html 的字串。 ViewState 元素如下所示:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
 value="/wEPDwULLTEwNjU=" />

因此,為了提取值,我首先確定子字串 id="__VIEWSTATE"的位置,然後添加 24 個字元。 這種方法比較脆弱,因為該技術在 ASP.NET 更改 ViewState 字串的格式時就會中斷;不過,由於這是小型自動化,因此簡易性勝過可靠性。 接下來,確定終止雙引號字元的位置,然後就可以使用 Substring 方法提取 ViewState 值。 與使用 begin...end 或 {...} 之類標記分隔代碼塊的大部分語言不同,Python 使用的是縮進。 如果您不熟悉 Python 程式設計,開始可能會不習慣,但是和我交流過的大部分工程師都坦承可以很快適應這種語法。 許多模組都支援 Python,因此使用 .NET 方法檢索 ViewState 值的一種替代方法是在本機 Python urllib 模組中使用函數。

在定義 getVS 説明程式函數之後,我又定義了一個説明程式函數以獲取 EventValidation 值:

def getEV(url):
  wc = WebClient()
  bytes = wc.DownloadData(url)
  html = Encoding.ASCII.GetString(bytes)
  start = html.IndexOf('id="__EVENTVALIDATION"', 0) + 30
  end = html.IndexOf('"', start)
  ev = html.Substring(start, end-start)
  return ev

提取 EventValidation 與提取 ViewState 所使用的技術相同。 請注意,Python 是動態類型化語言,因此我沒有指定參數、變數和物件的資料類型。 例如,DownloadData 返回位元組陣列,IndexOf 返回整數,IronPython 解釋程式會計算這些類型。 定義 getVS 和 getEV 這兩個函數要求兩次往返調用待測試的 Web 應用程式,因此您可能需要將這兩個説明程式函陣列合為一個函數,並將説明程式命名為 getVSandEV(url) 之類的名稱。

在定義説明程式函數之後,就會開始執行實際自動化:

try:
  print '\nBegin IronPython Request-Response testing'
  url = 'http://localhost/MiniCalc/Default.aspx'
  print '\nURL under test = ' + url + '\n'
  testCases = 'testCases.txt'
  ...

與需要入口點(如 Main 方法)的一些語言不同,Python 腳本執行僅從第一條可執行語句開始。 我使用 try 關鍵字來捕獲任何異常,然後輸出啟動消息。 Python 允許使用單引號或雙引號來定義字串文本,並且可以在任何一個分隔符號中嵌入轉義序列(如 \n)。 在前停用逸出順序評估,您可以上與小寫 r (「 原始 」),字串常值,例如:檔案 = r'\newFile.txt '。 我對待測試的應用程式的 URL 進行了硬編碼,並將該值顯示給 Shell。 如果我想要從命令列讀取 URL 我也可以使用內建的 sys.argv] 陣列,例如:URL = sys.argv[1]。 Python 使用“+”字元來連接字串。 另外,我還對測試用例資料檔案的名稱進行了硬編碼;由於我未包含檔路徑資訊,因此假設該檔與 IronPython 腳本位於同一目錄。

接下來,設置計數器,打開我的測試用例資料檔案並開始反覆運算該檔:

...
numPass = numFail = 0
fin = open(testCases, 'r')
for line in fin:
  print '==========================================='
  (caseid,value1,value2,operation,decimals,action,expected) = 
    line.split('|')
  ...

Python 擁有多種我非常喜歡的特性,包括多變數賦值和簡明檔操作語法。 open 函式呼叫中的“r”參數表示打開檔進行讀取。 「 在 fin 線 」 的陳述式列舉檔案透過一行一次指派目前行的輸入變數 「 行 」。另一個不錯的 Python 建構是有序元組慣用語。 元組使用左右括弧表示,元組值由“,”字元分隔。 此處,我調用 split 方法並將生成的每個標記賦予變數 caseid、value1、value2、operation、decimals、action 和 expected,所有操作在一條語句中即可全部實現。 這真是好極了。

接下來,開始構建要發佈到待測試的 Web 應用程式的資料:

...
expected = 'value="' + expected.Trim() + '" id="TextBox3"'
data = 'TextBox1=' + value1 + '&TextBox2=' + value2 + '&Operation=' +
 operation + '&DropDownList1=' + decimals + '&Button1=' + action

print 'Test case: ' + caseid
print 'Input    : ' + data
print 'Expected : ' + expected
...

我稍微修改了 expected 變數,使其與以下類似:

value="5.7900" id="TextBox3"

因此,當我搜尋 HTTP 回應,我是更特定比只搜尋 「 5.7900 」。我將我的測試案例輸入的值至其個別的控制項產生關聯為名稱 / 值組來連接在 「 & 」 字元。 發佈字串的前兩個名稱值對只是將 TextBox1 和 TextBox2 設置為測試用例資料中的 value1 和 value2。 第三個名稱值對(例如 Operation=RadioButton1)是我類比使用者選擇 RadioButton 控制項(在本例中即對應加法的控制項)的方式。 您可能會誤以為(就像我原來一樣)設置選項按鈕的方法是使用類似 RadioButton1=checked 的語法。 但是,RadioButton1 是 Operation 控制項的值,而非控制項本身。 第五個名稱值對 Button1=clicked 容易讓人產生誤解。 我需要為 Button1 提供一個值以指示已按一下該控制項,不過由於任何值都適用,因此可使用 Button1=foo(甚至僅使用 Button1=),但我認為 Button1=clicked 更具描述性。 我向命令 Shell 回顯從測試用例資料分析得到的值,並利用“+”字串連接運算子。

接下來,處理 ViewState 和 EventValidation 值:

...
vs = getVS(url)
ev = getEV(url)
vs = HttpUtility.UrlEncode(vs)
ev = HttpUtility.UrlEncode(ev)
data = data + "&__VIEWSTATE=" + vs + "&__EVENTVALIDATION=" + ev
...

我調用了之前定義的 getVS 和 getEV 説明程式函數。 ViewState 和 EventValidation 值為 Base64 編碼的字串。 Base64 編碼方式使用 64 個字元:大寫 A-Z、 a-z,數字 0-9、 「 + 」 字元和 「 / 」 字元的小寫。 字元“=”在 Base64 中用作填充。 由於 HTTP 請求流中禁用 Base64 中使用的某些字元,因此我使用 System.Web 命名空間的 HttpUtility.UrlEncode 方法,將帶來麻煩的字元轉換為一個以“%”字元開頭的三字元序列。

例如,原始的“>”字元編碼為 %3D,而空格編碼為 %20。 當 Web 伺服器收到的 HTTP 請求包含此類特殊的三字元序列時,伺服器將把這些序列解碼回原始輸入。 在編碼之後,將 ViewState 和 EventValidation 值附加到發佈資料中。

接下來,處理發佈資料以準備好發送 HTTP 請求:

...
buffer = Encoding.ASCII.GetBytes(data)
req = HttpWebRequest.Create(url)
req.Method = 'POST'
req.ContentType = 'application/x-www-form-urlencoded'
req.ContentLength = buffer.Length
...

我使用 System.Text 命名空間的 GetBytes 方法將發佈資料轉換為一個名為 buffer 的位元組陣列。 然後,使用顯式 Create 方法創建新的 HttpWebRequest 物件。 我為 HttpWebRequest 物件的 Method、ContentType 和 ContentLength 屬性提供了值。 您可以將 ContentType 的值視為發佈 HTTP Web 請求所必需的魔幻字串。

接下來,發送 HTTP 請求:

...
reqst = req.GetRequestStream()
reqst.Write(buffer, 0, buffer.Length)
reqst.Flush()
reqst.Close()
...

如果您不熟悉這種技術,可能會不太習慣用於發送請求的程式設計模式。 您不用使用某種顯式 Send 方法,而是創建一個 Stream 物件,然後使用 Write 方法。

Write 方法需要位元組陣列、陣列中開始寫入的索引以及要寫入的位元組數。 通過使用 0 和 buffer.Length,可寫入 buffer 中的所有位元組。 Write 方法不會將 Post 實際發送到 Web 伺服器,您必須調用 Flush 方法強制執行發送。 Close 方法會實際調用 Flush 方法,因此這種情況下不需要調用 Flush,但為清楚起見,我還是調用了 Flush。

在發送 HTTP 請求之後,提取相關聯的回應:

...
res = req.GetResponse()
resst = res.GetResponseStream()
sr = StreamReader(resst)
html = sr.ReadToEnd()
sr.Close()
resst.Close()
...

GetResponse 方法會返回與 HttpWebRequest 物件相關聯的 HttpWebResponse 物件。 該回應物件可用於創建 Stream,然後我將此 Stream 關聯到 StreamReader 物件,並使用 ReadToEnd 方法將整個回應流作為單個字串提取。 雖然底層的 .NET Framework 清理機制最終會關閉 StreamReader 和 Stream 物件,但我傾向于顯式關閉這些物件。

接下來,檢查 HTTP 回應是否為測試用例預期值:

...
if html.IndexOf(expected) >= 0:
  print 'Pass'
  numPass = numPass + 1
else:
  print '**FAIL**'
  numFail = numFail + 1
...

我使用 IndexOf 方法來搜索 HTTP 回應。 由於 IndexOf 會返回引用字串中搜索字串的開始位置,因此返回值 >= 0 表示搜索字串位於引用字串中。 請注意,與許多語言不同,Python 沒有遞增/遞減運算子,如 ++numPass。

接下來完成腳本:

...
print '===============================\n'
    # end main processing loop
  fin.close()
  print '\nNumber pass = ' + str(numPass)
  print 'Number fail = ' + str(numFail)  
  print '\nEnd test run\n'
except:
  print 'Fatal: ', sys.exc_info()[0]
# end script

我在反覆運算測試用例資料檔案的每一行的“for”迴圈結尾處插入了注釋,以説明確保縮進是正確的。一旦跳出迴圈,就可以關閉測試用例資料檔案並輸出通過計數器和失敗計數器。請注意,由於 numPass 和 numFail 被推斷為 int 類型,因此必須使用 Python str 函數將它們轉換為“string”類型,以便進行連接。該工具完成時會處理 try 塊中引發的任何異常,方式只是輸出在內置 sys.exec_info 陣列中存儲的一般異常消息。

具有較短生命週期的快速自動化

我在此處介紹的示例應當為您提供了足夠的資訊,可以説明您為自己的 Web 應用程式編寫 IronPython 測試自動化程式。使用 IronPython 有多種替代方法。在我看來,IronPython 最適合小型測試自動化,在小型測試自動化中,您需要快速創建自動化,並且自動化具有較短的設計生命週期(幾天或幾周)。我的技術確實存在某些限制,特別是它無法輕鬆處理生成彈出對話方塊的 Web 應用程式。

與其他腳本編寫語言相比,使用 IronPython 執行小型測試自動化的優點之一在於,可以使用互動式主控台發出命令來説明編寫腳本。另外,還提供了多種性能優異的編輯器,您甚至可以找到 IronPython SDK 將 Iron­Python 集成到 Visual Studio。就我個人而言,在準備編寫 Web 應用程式測試自動化程式時,如果要開發相對簡短的工具,我會考慮使用 IronPython 和 Notepad。不過,如果要編寫代碼超過三頁的工具,我通常會使用 C# 和 Visual Studio。

Dr。James McCaffrey 供職于 Volt Information Sciences, Inc.,在該公司他負責管理對華盛頓州雷蒙德市沃什灣 Microsoft 總部園區的軟體工程師進行的技術培訓。他曾參與過多項 Microsoft 產品的研發工作,其中包括 Internet Explorer 和 MSN Search。McCaffrey 是《.NET Test Automation Recipes:A Problem-Solution Approach》(Apress,2006 年)一書的作者。可通過 jammc@microsoft.com 與他聯繫。

衷心感謝以下技術專家對本文進行了審閱:Dave FugatePaul Newson