中國廣東省深圳市望海路半島城邦三期
518067
+86 13113668890
<netkiller@msn.com>
nginx
Copyright © 2010-2018 netkillergit
版權聲明程序員
轉載請與做者聯繫,轉載時請務必標明文章原始出處和做者信息及本聲明。github
|
|
|
|
請首先閱讀:數據庫
一步步實施 DevOps (一)json
2005 第一次接觸自動化測試,十年已通過去了,着眼身邊的企業,真正實施自動化測試的企業很是少。 大部分企業,測試仍然處在,點鼠標階段。測試人員一般是驗收交付,而沒有參與整個軟件開發週期。api
爲何自動化測試難以實施,我想有幾個問題,阻礙了自動測試普及。 其實懂得自動化測試工具的人仍是不少的,自動化測試難以實施,並非缺少技術人才。Load Runner, QTP 等等不少測試人員都會使用,爲何他們放棄這些工具,改用手動測試呢?瀏覽器
90%測試仍然處在功能測試緩存
不少測試人員沒有開發背景安全
測試角色,沒有貫穿整個軟件開發週期
各類問題阻礙了自動化腳本
在中國測試人員人力成本過低
隨着技術發展,軟件的多樣性,已經不侷限於基於CS結構的GUI, 基於BS瀏覽器WEB UI。例如目前的安卓系統,蘋果IOS系統,微軟的 Windows Mobile 系統等等。 還有一些非人機交互界面,各類協議/接口,例如json,bson,xml-rpc,soap,mq(message queue)我認爲這些都應該歸入自動化測試範疇。 這就須要測試人員具備必定的開發能力,且測試上述內容速要普遍的技術知識支撐。
我認爲高級測試工程師,須要具有如下能力
嗅探器使用
gdb 使用
瞭解各類協議族
滲透於注入
HTML/CSS/Javascript
數據庫 等等
就WEB測試而言,涉及的內容就太普遍了,從瀏覽器->WEB服務器->APP服務器->緩存->數據庫,中間會通過各類代理,負載均衡,分佈式文件系統等等。
配置這樣一個測試環境都已經很是不容易,幸虧咱們能夠採用自動化運維幹這件事。
各類UI特效
驗證碼
瀏覽器支持
第三方插件(Flash,ActiveX...)
技術封閉
互聯網的快速發展 Load Runner, QTP 等等軟件,我認爲已經跟不互聯網的快速了,他們仍然按照傳統週期發佈軟件更新。 而互聯網須要的是快速變化,互聯網應用程序開發者,須要體驗更多的創新功能,軟件軟件發佈週期至少一年一個版本。真的太慢了。
互聯網不斷加入的新技術成爲了自動化測試障礙,傳統軟件沒法支持這些新技術,甚至向微軟這樣的企業技術跟進都顯得不給力。
Windows Automation 3.0 是很是高大上玩意,可是你在Microsoft官網能找到的資料,少之甚少,我不知道微軟的目的何在。
只有 Load Runner, QTP 這些功能與微軟又合做,才能拿到Windows Automation API。
測試人員的薪水在開發團隊中應該是處於中下等的。與高級程序員,軟件架構師是有很大差距的。這也形成了自動化測試難以實施的緣由。
咱們須要從高級程序員,軟件架構師轉測試的高級測試人員。
咱們須要黑客級的測試人員!!!
自動化測試僅僅被認爲是替代人工,因此咱們看到不少企業實施自動化測試僅僅是將現有的 Test Case 轉換成自動化腳本。
這樣作既沒有提升測試總體水平,也沒有改善測試結果。結果是經過手工能測試出來的問題自動化測試能夠測試出來,手工測試不出來的問題自動化測試也沒有測試出來。
由於測試的觀念仍停留在已有 Test Case 階段,而 Test Case 停留在業務流程測試的階段。
最終自動化測試僅僅是按照測試用例走一邊業務流程,完成業務流程的檢驗。
隨着技術發展,軟件的多樣性,測試已經不侷限於基於CS結構的GUI測試, 基於BS瀏覽器WEB UI測試。例如目前的安卓系統,蘋果IOS系統,微軟的 Windows Mobile 系統等等也加入到自動化測試領域。
應用軟件也愈來愈複雜,例如:
分層的變化:界面層,接口曾,業務邏輯曾,實體模型層
部署的變化:從單機運行到雙機熱備份再到負載均衡,最近進化到分佈式系統。
存儲的變化:關係型數據庫,非關係型數據庫,緩存數據庫,搜索引擎數據庫
從下面的金字塔架構能夠看出軟件展現給用戶的只有UI界面層
/\ / \ / UI \ /------\ / API \ /----------\ / Service \ /--------------\ / Component \ /------------------\ / Database \ /______________________\
上面是軟件的分層,一個軟件通過部署後結構將會更復雜。
/\ / \ /CDN \ /------\ / WEB SER\ /----------\ / APP Server \ /--------------\ / Message Queue \ /------------------\ / Cache|SearchEngine \ / Database| NoSQL \ /________________________\
就WEB應用測試而言,涉及的內容就太普遍了,從瀏覽器->WEB服務器->APP服務器->緩存->數據庫,中間會通過各類代理,負載均衡,分佈式文件系統等等。
咱們測試要涵蓋:
CDN測試,域名解析測試,
WEB UI測試,包括HTML,Ajax
API 服務器測試,api 是非人機交互界面,它是經過特定協議與API服務器交互通訊。
代碼單元測試
配置測試,配置管理過程當中配置變動後的測試,含系統與應用
安全測試,接口安全,認證,權限
注入測試,JS注入,SQL 注入,Shell 注入
緩存測試,命中率測試,包括CDN,WEB服務器,緩存服務器,搜索引擎
壓力測試,健壯性測試
擴展性測試,水平擴展測試,垂直擴展測試
高可用測試,集羣測試
請參考個人另外一篇文章《壓力測試中存在的問題》
這裏我要再單獨強調壓力測試,不少人的測試方法是有問題的。
壓力測試不是準備一臺機器安裝壓力測試軟件就能夠開始測試的。 壓力測試的環境很是重要,不少工做多年的測試人員都沒有意識到這個問題。
壓力測試有兩個重點,一是壓力測試環境的建設,二是壓力測試順序。
壓力測試環境
壓力測試不管是單機仍是網絡,都須要一個好的壓力測試環境,例如網絡比如高速公路,若是公路成爲瓶頸,你能測試出準確的數據嗎?
首先準備測試環境,如單機測試要考慮CPU速度,磁盤IO速度,RAID卡的速度,RAID卡緩存大小,內存速度,PCI—E總線速度,甚至會涉及多對稱CPU相關配置,內存與CPU通道的問題......等等
若是是測試分佈式系統,除了上述單節點的注意事項,還要考慮到路由器/防火牆的包轉發與鏈接數限制,交換機的背板帶寬以及吞吐能力,負載均衡器的轉發能力。
操做系統要考慮內核參數優化,TCP/IP棧優化,各類服務器的配置。
測試順序
壓力測試順序的切入點很是重要,測試順序上多數人是從UI(人機界面)切入,即由UI驅動業務邏輯,這種測試順序是錯誤的,例如用戶->瀏覽器->WEB服務器->APP服務器->緩存->數據庫等等,這就帶來不少問題。
\------------------/ \ Web server / \ App Server / \ Cache / MQ / \ Database / \ Disk IO/ \ /
軟件的性能平靜一般是沙漏型的,最大的瓶頸莫過於數據庫,其餘服務器的瓶頸咱們都能從架構的角度去解決性能問題。
全部咱們應該先從數據庫測試,首先確認數據庫的配置優化是否能達到咱們預期值。而後是緩存,消息隊列,搜索引擎等等.....
至此咱們已經知道數據庫,緩存,消息隊列,搜索引擎不會成爲咱們壓力測試中的瓶頸。接下就能夠測試應用服務器和應用軟件了。
若是你的測試格局可以放大一點要考慮的遠不止上述那些。 你還需考慮硬件,網絡,操做內核參數優化,TCP/IP棧優化,驗證運維配置是否能知足咱們需求等等.....。
瓶頸分析
咱們須要有一套監控解決方案,可以監控到硬件的性能,軟件的性能。
測試目的不是爲了得出一個結果,告訴開發人員你的軟件能支撐XXX併發,而是在咱們測試中監控每項操做,計算出每一個功能所用的時間,分析出性能的平靜,指導開發人員改進軟件。
監控分爲外部監控與內部監控。
外部監控是最容易實現的,有成熟的工具以及解決方案,CPU,內存,磁盤IO,網絡流量等等。
內部監控是指軟件運行加載到內存中以後的變化狀態,例如內存地址,變量,函數調用,動態連接庫載入,打開文件句柄,Socket地址和數據包等等。
指導開發
經過數據,圖表,快速定位軟件存在的問題點,指導開發完成軟件的改進
持續集成,自動化構建幾乎麼個測試團隊都會實施,但實際境況並不理想,僅僅停留在工具配置的階段。幾乎沒有人在生產環境上使用自動化構建。
爲何持續集成沒法應用到生產環境?
我認爲測試不只僅是完成按照測試用例完成軟件驗收,若是僅僅測試用戶可見的UI(人機接口)是不能知足現代軟件的測試需求的。
測試者應該站在更高的角度看問題,測試者是有能力指導開發人員,改善軟件的性能,健壯性,安全性,以及影響軟件架構的設計。 測試者須要有普遍的跨界知識支撐,要不斷學習提升,打破現有格局。
軟件壓力測試是一種基本的質量保證行爲,它是每一個重要軟件測試工做的一部分。軟件壓力測試的基本思路很簡單: 不是在常規條件下運行手動或自動測試,而是在計算機數量較少或系統資源匱乏的條件下運行測試。 一般要進行軟件壓力測試的資源包括內部內存、CPU 可用性、磁盤空間和網絡帶寬。
壓力測試涵蓋,性能測試,負載測試,併發測試等等,這些測試點經常交織耦合在一塊兒。
30.2.1.1. 壓力測試存在那些問題
我概括一下又幾點:
操做系統默認安裝,在未作任何優化的狀況下實施壓力測試
未考慮磁盤IO對軟件的影響
未考慮網絡帶寬對軟件的影響
網絡軟件測試,沒有考慮到TCP特色
各類超時參數優化
測試客戶端未優化
併發理解有誤
WEB服務器,數據庫,等等服務器未優化
若是上面幾項沒有作優化,壓力測試數據基本沒有任何參考價值,任何一項沒有優化,都會致使你的壓力測試數據出現誤差。 下面我來逐條說明:
操做系統問題 操做系統是大衆化軟件,出廠優化都是面向大衆,不可能爲某個領域作單獨優化。因此咱們第一步須要優化操做系統。 Linux 系統優化內核參數,Windows 系統優化註冊表等等。
磁盤IO 這是最容易出現瓶頸的地方,經常是CPU尚未達到極限,磁盤已經不堪重負。
網絡IO 與磁盤IO相同
TCP鏈接 幾乎全部 B/S, C/S 軟件都是採用多線程,或者多進程技術。這種技術有個特色,開發者將程序設計爲線程可自動伸縮模式,開啓進程後會啓動少許線程,當鏈接不斷提升後,線程數逐漸增長,隨着線程運行結束後,線程逐漸減小。 這樣的設計會更有效地利用硬件資源,在程序空閒時將硬件資源讓給其餘進程。少有軟件設計爲開啓服務獨佔資源。 這樣測試軟件作壓力測試,不能一次併發不少請求,而是要採用逐漸增長的方式,不然第一次測試會有一部們併發不能及時響應,致使測試數據誤差。另外也你能夠多作幾回壓力請求(讓多線程工做起來),從第三次開始記錄測試數據,忽律前面兩次的測試數據。
提示:另外一個問題是TCP鏈接複用,這也是一個重要配置項。若是這項沒有配置,我想測試出的數據也會有誤差
超時參數 超時參數在壓力測試中是很是重要的參數,例如從WEB到數據庫鏈接超時是60秒,若是有一個SQL查詢超過300秒,那麼後面的請求會持續排隊等待,當鏈接數達到數據庫的最大鏈接時,接下來的全部請求都是失敗的。 一般咱們的WEB服務器超時不會超過30秒,有時我設置爲10秒,一旦出現超時,寧肯讓該鏈接Timeout,不要讓他影響總體服務。
客戶端 不少網絡軟件須要從客戶端發出壓力測試請求,因此客戶端的優化也是必須的,不然客戶端壓力出不去,服務端壓力進不來。
併發 不少人認爲併發,就是同一時間內的最大鏈接數,這是錯誤的。若是你寫過多線程程序,就會發現多線程運行時又規律的。是順序排隊運行的,根本不是同時運行的。 因此併發是指,相對時間內能完成的鏈接總和,例如,每秒併發,每分鐘併發等等,一般咱們已秒爲單位。 咱們目前使用的操做系統叫分時操做系統,這種系統的特色就是可能實現多用戶,多任務。操做系統將進程排隊(優先級)輪詢運行,只不過這個操做太快了,使你認爲多個進程在同時運行。
服務器優化 主要B/S軟件壓力測試,WEB,緩存,數據庫等等服務器,都須要逐一優化到最佳狀態
若是在軟件設計階段都將這些問題元素都考慮進去,同時開發階段嚴格執行。那麼開發出些軟件幾乎不用作這個勞人傷神的壓力測試。
因此在軟件設計階段就要考慮,靈活性,擴展性,可靠性與性能,還要考慮高可用與負載均衡。
同時軟件優化伴隨開發,持續集成,持續測試,持續部署。
有些軟件須要封閉的環境測試,不能在共享資源的環境中作測試。因此你有必要作Vlan隔離,甚至獨立的路由器與交換機在封閉網絡中測試。
任什麼時候間均可能作壓力測試,爲何我將「時間」重點提出呢?目前受地球自轉影響,常常閏秒,你不的不考慮這個問題。
運維部門
開發部門
測試部門
下面咱們舉一些例子,講述壓力測試方法,限於篇幅不可能面面俱到,我僅僅是給你提供思路。
測試前你須要一些監控工具,事實監控服務器的資源變化。
例如 Web 服務器壓力測試,測試場景是 nginx :
worker_processes 8; 處理器數 worker_rlimit_nofile 65530; 容許最多打開文件數 worker_connections 4096; 最大鏈接數數爲 keepalive_timeout 65; 開啓複用鏈接 gzip on; 壓縮傳輸數據
怎麼測試呢?你要活得最大化性能嗎?仍是相對性能?咱們一般須要的是知足需求就好的相對性能,而不是最大化性能。爲何呢?由於要活得最大化性能是要作出不少配置犧牲的,例如關閉日誌,禁止訪問時間等等。
按照上面的配置你的測試用例應該是,每次併發4000 請求 8000~10000 次, 你不能併發8000 請求 4000 這樣測試。非常不少人經常犯的錯誤,因此測試者須要鏈接系統的配置參數,不能盲目使用數字實驗。
上面我說過線程的開啓時隨着請求,逐漸增長的,因此首次發起測試數據是不許確的,經過pstree命令能夠看到線程數量。等第三次之後線程逐漸增長到4096個,而且以前開啓的TCP能夠複用,這時測試的結果比較有說服力。
延伸閱讀《Netkiller Web 手札》《Netkiller Testing 手札》《Netkiller Linux 手札》