請首先閱讀:
一步步實施 DevOps (一)
為什麼自動化測試難以推廣
2005 第一次接觸自動化測試,十年已經過去了,着眼身邊的企業,真正實施自動化測試的企業非常少。 大部分企業,測試仍然處在,點滑鼠階段。測試人員通常是驗收傳遞,而沒有參與整個軟體開發周期。
為什麼自動化測試難以實施
為什麼自動化測試難以實施,我想有幾個問題,阻礙了自動測試普及。 其實懂得自動化測試工具的人還是很多的,自動化測試難以實施,并不是缺乏技術人才。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(人機接口)是不能滿足現代軟體的測試需求的。
測試者應該站在更高的角度看問題,測試者是有能力指導開發人員,改善軟體的性能,健壯性,安全性,以及影響軟體架構的設計。 測試者需要有廣泛的跨界知識支撐,要不斷學習提高,打破現有格局。
壓力測試中存在的問題
(What) 什麼是壓力測試
軟體壓力測試是一種基本的品質保證行為,它是每個重要軟體測試工作的一部分。軟體壓力測試的基本思路很簡單: 不是在正常條件下運作手動或自動測試,而是在計算機數量較少或系統資源匮乏的條件下運作測試。 通常要進行軟體壓力測試的資源包括内部記憶體、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,緩存,資料庫等等伺服器,都需要逐一優化到最佳狀态
(Why) 為什麼做壓力測試
如果在軟體設計階段都将這些問題元素都考慮進去,同時開發階段嚴格執行。那麼開發出些軟體幾乎不用做這個勞人傷神的壓力測試。
是以在軟體設計階段就要考慮,靈活性,擴充性,可靠性與性能,還要考慮高可用與負載均衡。
同時軟體優化伴随開發,持續內建,持續測試,持續部署。
(Where) 在哪裡做壓力測試
有些軟體需要封閉的環境測試,不能在共享資源的環境中做測試。是以你有必要做Vlan隔離,甚至獨立的路由器與交換機在封閉網絡中測試。
(When) 什麼時間做壓力測試
任何時間都可能做壓力測試,為什麼我将“時間”重點提出呢?目前受地球自轉影響,經常閏秒,你不的不考慮這個問題。
(Who) 壓力測試過程參與人員
- 運維部門
- 開發部門
- 測試部門
(How) 如何做壓力測試
下面我們舉一些例子,講述壓力測試方法,限于篇幅不可能面面俱到,我僅僅是給你提供思路。
測試前你需要一些監控工具,事實監控伺服器的資源變化。
例如 Web 伺服器壓力測試,測試場景是 nginx :
怎麼測試呢?你要活得最大化性能嗎?還是相對性能?我們通常需要的是滿足需求就好的相對性能,而不是最大化性能。為什麼呢?因為要活得最大化性能是要做出很多配置犧牲的,例如關閉日志,禁止通路時間等等。
按照上面的配置你的測試用例應該是,每次并發4000 請求 8000~10000 次, 你不能并發8000 請求 4000 這樣測試。很是很多人常常犯的錯誤,是以測試者需要連接配接系統的配置參數,不能盲目使用數字實驗。
上面我說過線程的開啟時随着請求,逐漸增加的,是以首次發起測試資料是不準确的,通過pstree指令可以看到線程數量。等第三次以後線程逐漸增加到4096個,并且之前開啟的TCP可以複用,這時測試的結果比較有說服力。
延伸閱讀《Netkiller Web 手劄》《Netkiller Testing 手劄》《Netkiller Linux 手劄》
版權聲明
轉載請與作者聯系,轉載時請務必标明文章原始出處和作者資訊及本聲明。