TechEd 2008 補充: 使用 Tinyget + Logparser 進行網站程式自動測試

在 TechEd 2008 的場次 "SRV305: 部署與管理新一代的IIS 7.0-微軟官方網站Microsoft.Com經驗分享" 中有展示如何使用 Tinyget + Logparser 來進行網站程式自動測試。場次結束後有很多來賓表示對展示非常有興趣,希望能夠取得相關的程式和 Script。當場我答應會在 Blog 上寫文章向大家說明,所以有了這篇文章。

要完成這項任務,需要的準備如下:

  1. Tinyget.exe: 這個工具包含在 IIS 6.0 Resource Kit 中,請下載安裝
  2. Logparser: 在 IIS 6.0 Resource Kit 中包含了 Logparser 2.1 版,您也可以下載 Log Parser 2.2 版
  3. IIS Log: 請準備正式系統上的 IIS Log 檔案,在 IIS 6.0 上 Log 檔放在 Windows\System32\Logfiles 目錄中;IIS 7.0 上 Log 檔放在 \Inetpub\Logfiles 目錄中

接下來對 TinyGet 和 Log Parser 做些背景介紹

Tinyget 的中文說明翻譯的有點奇怪,基本上 TinyGet 是個 HTTP 通訊協定測試工具,支援多執行緒和重複測試,除了可以用來產生 HTTP 要求測試網站之外,也可以用來進行偵錯,可以調整的設定很多: 包括 Authenticaiton, SSL, Client Certificate, HTTP version 等。我們這次只會用到基本的功能。

Tinyget 使用最基本的參數就是 -srv 和 -uri,-srv 是要測試的網站名稱,-uri 是要測試的網頁位置。以下是要測試 https://www.microsoft.com/default.aspx URL 的語法:

 tinyget -srv:www.microsoft.com -uri:/default.aspx

執行完畢後會發現什麼事都沒發生,因為 TinyGet 只是把 HTTP Request 送出,收到回應沒發生問題就結束了。要進行網站測試的話還需要增加 -status 參數,這個參數指定期望回應的 HTTP status code,如果和網站實際回應的 status code 不同的話,TinyGet 會產生錯誤訊息。來看實際的案例:

 C:\TinyGET>tinyget -srv:www.microsoft.com -uri:/default.aspx -status:200 
ERROR: 0x4b8 : returned status code (302) does not match expected one (200) 
Received status/error info: 302 Found

從錯誤訊息可以很清楚的看到,我們預期的 status code 是 200,可是和實際傳回值 302 不同,所以 TinyGet 顯示錯誤訊息。這就是使用 TinyGet 進行網站程式測試的基礎。

到這邊解決了測試的問題,但是網站上程式 URL 那麼多,要一個一個自己輸入然後測試還不如直接使用網路瀏覽器還比較快。這時候就要使用 Logparser 來產生測試所需要的 URL 指令檔。

Logparser 是個神奇的工具,有人叫他 "文字檔的 SQL Engine",也有人叫他 "Log 檔的 XSLT"。基本上 Logparser 是可以直接對支援的 Log 檔案執行 SQL 指令的神奇工具。我在 TechEd 場次也有提到,在我還不認識 Logparser 之前,要分析 IIS Log 的方法就是先匯入到 SQL Server 中,在用 SQL 指令來查詢。這種方法不但所費不貲還曠日廢時。在認識 Logparser 之後,要分析 IIS Log 只要簡單下個指令:

 C:\Logparser>logparser "select count(*) From ex*.log"
COUNT(ALL *)
------------
1361960

Statistics:
-----------
Elements processed: 1361960
Elements output:    1
Execution time:     39.86 seconds

就可以使用 SQL 指令來對 IIS Log 進行查詢。當然 Logparser 的功能不只這樣,今天我們會著重在如何使用 Logparser 產生 TinyGet 需要的指令檔。

接著我們要使用 Logparser 來將 IIS Log 轉變成 TinyGet 所需的測試 Script。我們使用的 SQL 指令如下:

 SELECT TOP 1000  
    cs-method AS verb,
    case cs-uri-query 
        WHEN NULL THEN REPLACE_CHR(cs-uri-stem ,'\\','\\\\')
        WHEN '' THEN REPLACE_CHR(cs-uri-stem ,'\\','\\\\')
        ELSE REPLACE_CHR(
            STRCAT(
                STRCAT(
                    cs-uri-stem,
                    '?'
                ),
                cs-uri-query
            ),
            '\\',
            '\\\\'
            )
    END AS URI,
    count(*) AS WEIGHT,
    sc-status

INTO %output%
FROM %logfile%
WHERE cs-method IN ('GET';'HEAD')
GROUP BY verb, URI, sc-status
ORDER BY weight DESC

接下來是要使用的 Logparser Template

 <LPBODY>-uri "%URI%" -status:%sc-status% -verb:%verb%
</LPBODY>

把以上的 SQL 複製存檔到 TinyGet.sql,Template 複製存檔到 TinyGet.tpl。接下來就要執行以下指令:

 Logparser -file:TinyGet.sql?Logfile=ex080930.log+output=TinyGet.txt -tpl:TinyGet.tpl

請把 Logfile= 後面的參數換成您的 IIS Log 檔案名稱。產生出來的 TinyGet.txt 就是 TinyGet 使用的 Script,檔案內容範例如下:

 -uri "/images/menu_bg.gif" -status:200 -verb:GET
-uri "/images/menu_bg.gif" -status:200 -verb:GET
-uri "/images/sc_p01.jpg" -status:200 -verb:GET
-uri "/images/sc_p01.jpg" -status:200 -verb:GET
-uri "/images/mob_01.jpg" -status:200 -verb:GET
-uri "/images/OnSale.png" -status:200 -verb:GET
-uri "/images/mob_01.jpg" -status:200 -verb:GET
-uri "/images/OnSale.png" -status:200 -verb:GET

準備工作到此就算完成了,接下來就是使用 TinyGet 來執行我們的 Web 測試。指令如下:

 C:\TinyGet>TinyGet -srv:localhost -z:TinyGet.txt
ERROR: 0x4b8 : returned status code (404) does not match expected one (200)
Received status/error info: 404 Not Found 
 

Testcase number: 3 - Explain: (null)
URI: /images/sc_p01.jpg, SSL: Nonsecure, CliCert:(null), Auth:Anon Domain:(null)
User: (null) Password: (null)
ERROR: 0x4b8 : returned status code (404) does not match expected one (200)
Received status/error info: 404 Not Found

 
Testcase number: 8 - Explain: (null)
URI: /images/OnSale.png, SSL: Nonsecure, CliCert:(null), Auth:Anon Domain:(null)
 User: (null) Password: (null)
tinyget.txt                    --------------    Succeeded:   6  Failed:   2
                               Running TOTAL -   Succeeded:   6  Failed:   2

從測試結果可以看到我們使用 TinyGet.txt 中 8 個測試有 6 個成功 2 個失敗,失敗的是 Testcase 3 URI: /images/sc_p01.jpg 和 Testcase 8 URI: /images/OnSale.png,錯誤都是 404 找不到檔案。以上示範就是如何使用 TinyGet + Logparser 進行網站自動測試的範例,給大家參考。