Python Web 性能和壓力測試 multi-mechanize


引用: http://www.aikaiyuan.com/5318.html

 

對Web服務做Performance & Load測試,最常見的工具有Apache Benchmark俗稱ab和商用工具LoadRunner。ab簡單直接,功能也相對較弱,但我們經常看到的對一些Web server或者Framework的性能測試用的ab做的,而LoadRunner功能也確實很強大,各種大型軟件公司、軟件外包企業幾乎是必備了,用起來很High,當然其價格也確實很High

這里要介紹的multi-mechanize(這名忒難記)是一款用Python開發的Performance & Load測試工具,是由Pylot的作者新近開發的,算是升級換代的產品。用multi-mechanize可以通過編寫Python腳本來實現較復雜的測試邏輯,其並發測試是通過multiprocessing(多進程)和多線程機制來實現的。

1. 安裝

萬能的pip&easy_install

pip install multi-mechanize mechanize numpy matplotlib

  • mechanize是一個模擬browser行為的一個庫,當然你也可以用其它的如urllib2、request、tornado.httpclient等等庫,不是必須。
  • 后面兩個numpy和matplotlib也是可選的,當你需要它自動生成圖形化報表時才會用到,安裝matplotlib你的系統有可能需要安裝libpng和freetype庫。

2. 使用方法

  • 創建項目
    multimech-newproject my_project

自動創建一個my_project目錄,子目錄test_scripts用來放測試腳本,config.cfg是測試配置,主要要配的是測試時間、測試腳本和並發threads量。

  • 腳本編寫,借用官方的一個簡單例子:
#
#  Copyright (c) 2010 Corey Goldberg (corey@goldb.org)
#  License: GNU LGPLv3
#
#  This file is part of Multi-Mechanize
#

import mechanize
import time

class Transaction(object):
    def __init__(self):
        self.custom_timers = {}

    def run(self):
        br = mechanize.Browser()
        br.set_handle_robots(False)

        start_timer = time.time()
        resp = br.open('http://www.example.com/')
        resp.read()
        latency = time.time() - start_timer

        self.custom_timers['Example_Homepage'] = latency

        assert (resp.code == 200), 'Bad HTTP Response'
        assert ('Example Web Page' in resp.get_data()), 'Failed Content Verification'

if __name__ == '__main__':
    trans = Transaction()
    trans.run()
    print trans.custom_timers

注意:按multi-mechanize的默認規則,每個腳本必須有一個Transaction的類,類要有一個run方法,在run里面寫測試業務邏輯。這個例子是打開http://www.example.com,記錄訪問所耗時長,非常簡單明了,而實際的場景你可能需要有用戶登錄、然后測試某個或多個頁面(API),只是測試業務復雜一些,寫法是類似的。一個腳本文件只能有一個Transaction的類、類也只能有一個run方法,寫起case來是不是覺得非常不方便?不用急,針對這點,后面的小技巧部分會另辟蹊徑給你指條明路。

  • 運行項目的測試腳本
multimech-run my_project

測試結果報表和原始數據將放到results目錄下按測試時間生成的子目錄中,生產的html版本的結果統計如下圖所示:

multi-mechanize-report

3. 使用小技巧

  • Cookie:

如果使用的是mechanize,可以通過下面的方式,從上面的browser對象br里獲取到cookie信息。

br._ua_handlers[“_cookies”].cookieja

    • 單個腳本多個測試用例的支持:這個思路來源於testsuite的概念,同一個testsuite里的case作為一組相關的case可以共享一些代碼邏輯和資源(如browser對象),而multi-mechanize默認的方式是不支持的,要實現這一點,只需要一點小小的技巧即可,上代碼:

base.py,Transaction基類:

# -*- coding: utf-8 -*-

import mechanize
import time
import traceback
import logging

class BaseTransaction(object):
    _TEST_CASE_PREFIX = "test_"

    def __init__(self):
        self._init()

        self.custom_timers = {}

        self.browser = mechanize.Browser()
        self.browser.set_handle_robots(False)
        self.browser.set_handle_redirect(True)
        self.browser.set_handle_referer(True)

    def _init(self):
        self.funcs = []
        funcs_ = dir(self)
        for func_ in funcs_:
            if func_.startswith(self._TEST_CASE_PREFIX):
                self.funcs.append(func_)

    def run(self):
    """"所有繼承BaseTransaction的類,只需要在以test_開頭的方法里實現測試case即可,運行時多個case都可以得到測試"""
        try:
            for func in self.funcs:
                start_timer = time.time()
                getattr(self, func)()  # run test
                latency = time.time() - start_timer

                self.custom_timers['%s' % func[len(self._TEST_CASE_PREFIX):]] = latency
        except Exception, e:
            logging.error(traceback.format_exc())
            raise e

test_case_google.py里是真正的測試case,這里是同時測試多個google站點:

# -*- coding: utf-8 -*-

from base import BaseTransaction

class Transaction(BaseTransaction):

    def test_google_com_hk(self):
       #  測試邏輯代碼,如類似於上面的測試example.com
        pass

    def test_google_com_sg(self):
        pass

    def test_google_com(self):
        pass
  • 真實的並發量計算:multi-mechanize使用了multiprocessing庫,會同時起多個進程,且每個進程按config里的配置起多個線程來實現並發測試,但真正的單位時間內的並發量並不是config里設置threads=10這樣的表示每秒10個並發,真實的並發量需要根據最終完成的transaction數和這些transaction里面包含多少次http請求和總的完成時間來計算得知,這點不是很直觀。
  • 自定義統計數據:你可以往self.custom_timers這個內建的字典里塞任意的自定義統計數據,他們在報表中都能夠得到體現。

更多的文檔和一手資料請參考文檔http://testutils.org/multi-mechanize/和git代碼庫https://github.com/cgoldberg/multi-mechanize 

最后multi-mechanize還不是很好用,一是使用過程中發現有一些情況會拋異常,導致不能正確生成報表,另一個別扭的是case的編寫不是unittest那一套,是作者自創Transaction流:)

 

后記:

使用multi-mechanize發現win7下有問題,詳情見。

multi-mechanize error: can not find test script: v_user.py問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM