1. 程式人生 > >用python做自動化測試--實現高效能測試工具(1)--序

用python做自動化測試--實現高效能測試工具(1)--序

做過幾年開發或者測試開發的人員,時常會覺得很迷茫,新功能的開發或者老功能的維護,基本是在堆程式碼了, 做過幾年測試的朋友也會有類似的想法。效能調優或者效能測試的確很考驗人分析問題、解決問題的能力,知識是否全面。本人也是第一次實現高效能的測試工具, 記錄下這次diameter協議測試工具的優化過程,供大家一起學習。 有些內容涉及到具體產品,做了些改動或者單獨寫了測試程式碼演示。

   Python用來開發高效能的測試工具的確有天然的缺陷,效能差還有GIL,無法利用多執行緒。 但辦法總比困難多,那麼多大的網際網路公司都使用python與實際產品中,總比我們測試的效能要求搞多了。 本文主要講述在系統設計和架構方面的效能優化,具體演算法和一些小細節的優化,請參考 http://blog.csdn.net/powerccna/article/details/8020289

專案背景:

    實現個高效能的diameter 測試工具, 接受1000+傳送1000,雙向要支援到2000條訊息每秒。 diameter 協議的原始碼是從這裡下載的 http://sourceforge.net/projects/pyprotosim/, 這個開源包還支援SMPP, RADIUS, DHCP, LDAP,  而且新增加的協議欄位都可以在dictionary配置屬性,不需要修改程式碼,實在是方便。 初始階段我們為了實現功能,沒有怎麼考慮效能的問題,很多地方用的是單執行緒,初始效能只能支援到50 訊息。硬體環境: SunFire 4170, 16 核,每核2.4 G 

     Python效能優化的幾個方向:

            1. 換python的解析器:常見的python解析器有pysco,pypy, cython, jython, pysco已經對python 2.7不支援了,就沒有測試,據說跑的很C語言一樣快。對pypy, jython做了簡單測試,pypy在不同機器上可以提高到5-10倍的樣子,Jython雖然可以避免python GIL的問題(因為jython是跑在java虛擬機器上的),但測試看來,效率提升很少。

            2. 優化程式碼

            3. 改變系統架構,多執行緒,多程序或者協程

方案1:  換Python解析器

     如果換Python解析器能達到效能需求是最廉價的方案了,不需要對程式碼做任何改動。下面程式碼只是為了說明pypy的效果,單獨寫的測試程式碼,在windows下執行的結果。在linux下機器上執行效果會更好些。

#!/usr/bin/env python
#coding=utf-8

import  time

def check(num):
    a = list(str(num))
    b = a[::-1]
    if a == b:
        return True
    return False

def test():
    all = xrange(1,10**7)
    for i in all:
        if check(i):
            if check(i**2):
                i**2
if __name__ == '__main__':
    start=time.time()
    test()
    print time.time()-start


分別用python和pypy的執行結果

C:\Python27\python.exeD:/RCC/mp/src/test.py
14.4940001965

C:\pypy-2.1\pypy.exeD:/RCC/mp/src/test.py
4.37800002098

    可以看出來pypy的執行結果效果還是明顯的,雖然能提高5倍(linux機器上),50*5, 離2000還差好遠。 pypy對python 多執行緒的支援沒有明顯效果,這個在後面會提到。

先告一段落,太長了大家看起來累,下一篇文章中將會介紹程式碼優化部分。