qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請(qǐng)?jiān)L問(wèn) http://qaseven.github.io/

          軟件測(cè)試之性能測(cè)試淺談(2)

           模擬演練

            寫(xiě)了一大堆,新手還是不知道如何去做。其實(shí)寫(xiě)本文的目的也不是講具體操作,而是思想,思想。新手學(xué)性能測(cè)試,建議找一本從LOADRUNNER開(kāi)講的書(shū)比較好。如51TESTING上有連載的《性能測(cè)試從零開(kāi)始》。

            不過(guò)還是盡量說(shuō)點(diǎn)具體些的內(nèi)容吧。

            普通BS架構(gòu)的系統(tǒng),一般都采用測(cè)試工具(如LR)直接錄制手工操作的方式進(jìn)行測(cè)試。這種方式簡(jiǎn)單有效,對(duì)測(cè)試人員要求不高。但在一些情況下,這種基于錄制的方法可能無(wú)法完成,比如頁(yè)面上有特殊控件、系統(tǒng)是CS架構(gòu)、或者通訊的協(xié)議無(wú)法捕獲等。這時(shí)就需要更復(fù)雜的測(cè)試方法,如手動(dòng)編寫(xiě)模擬客戶端的JAVA代碼,而把測(cè)試工具當(dāng)作一個(gè)調(diào)度控制臺(tái),去調(diào)度大量的虛擬用戶線程執(zhí)行編寫(xiě)好的代碼。

            現(xiàn)在假設(shè)有一個(gè)簡(jiǎn)易版的12306網(wǎng)站,JAVA實(shí)現(xiàn),中間件為T(mén)OMCAT,數(shù)據(jù)庫(kù)為SYBASE,沒(méi)有集群處理(一切從簡(jiǎn),只有查詢和訂票功能)。如何對(duì)它進(jìn)行性能測(cè)試呢?

            按照上面的幾個(gè)步驟來(lái)想一想吧,這里只簡(jiǎn)單寫(xiě)幾點(diǎn)。

            第一步,測(cè)試確認(rèn)。海量并發(fā),數(shù)據(jù)也應(yīng)該是海量的,但基本都是簡(jiǎn)單查詢,沒(méi)有復(fù)雜的統(tǒng)計(jì),所以主要困難還是在海量并發(fā)事務(wù)的處理上。中間件、數(shù)據(jù)庫(kù)上都會(huì)承受巨大壓力。此類高并發(fā)系統(tǒng)還需要對(duì)一些功能特別注意,比如一個(gè)車次有10張票,5個(gè)人同時(shí)購(gòu)票,如何處理?如果是12個(gè)人同時(shí)點(diǎn)購(gòu)票,又是如何處理?

            第二步,通過(guò)標(biāo)準(zhǔn)。無(wú)非是系統(tǒng)能夠滿足多少人同時(shí)在線,一分鐘內(nèi)能處理多少訂單,用戶最大等待時(shí)間是幾分鐘。注意這個(gè)標(biāo)準(zhǔn)一定要是經(jīng)過(guò)各方面確認(rèn)過(guò)實(shí)際可行的啊,定一個(gè)訂單響應(yīng)時(shí)間不超過(guò)5秒有意義么?確認(rèn)了以后,就要按著這個(gè)目標(biāo)來(lái)設(shè)計(jì)測(cè)試和執(zhí)行。

            另一個(gè)需要注意的問(wèn)題,按照預(yù)期的壓力測(cè)試通過(guò)了以后,是不是就高枕無(wú)憂了?答案是否定的,因?yàn)楹芸赡苓@個(gè)預(yù)期或者標(biāo)準(zhǔn)是不合理的,這個(gè)是非常可能的,只有長(zhǎng)期的數(shù)據(jù)積累,才會(huì)一點(diǎn)點(diǎn)走向精確。想想奧運(yùn)訂票系統(tǒng),開(kāi)通后短短五分鐘,網(wǎng)站就癱瘓了,你們以為這種系統(tǒng)沒(méi)有經(jīng)過(guò)專業(yè)的性能測(cè)試么?據(jù)我所知,奧運(yùn)訂票系統(tǒng)性能測(cè)試時(shí)制定的標(biāo)準(zhǔn)是每分鐘處理四百萬(wàn)訪問(wèn)(具體數(shù)據(jù)記不住了,就假設(shè)是這個(gè)數(shù)吧),出事后的檢查發(fā)現(xiàn),每分鐘的訪問(wèn)量超過(guò)了八百萬(wàn)。這種事故責(zé)任在誰(shuí)呢?測(cè)試機(jī)構(gòu)敢拍胸脯保證,每分鐘處理四百萬(wàn)就是沒(méi)問(wèn)題的。而奧組委自己設(shè)定的每分鐘四百萬(wàn)目標(biāo),和實(shí)際出現(xiàn)偏差也是正常的,畢竟這種系統(tǒng)是第一次上線。最后的處理方法就是,壓力達(dá)到了預(yù)期最大值以后,再后來(lái)的訪問(wèn)就被排隊(duì)了。好好體會(huì)這個(gè)案例吧,會(huì)有收獲的。

            第三步,測(cè)試設(shè)計(jì)。設(shè)計(jì)用戶模型,設(shè)計(jì)測(cè)試場(chǎng)景,設(shè)計(jì)測(cè)試用例。一個(gè)典型的用戶是如何使用系統(tǒng)的?登錄、查詢車次余票、訂票、付款,這是理想化的情況。實(shí)際更可能是這樣的,登錄(一次登不進(jìn)去,重復(fù)多次)、查詢A車次(未到放票時(shí)間、不斷重試,時(shí)間到無(wú)票)、查詢B車次(無(wú)票)、查詢C車次(有票)、訂票、付款、查詢訂單。兩種交互方式對(duì)系統(tǒng)產(chǎn)生的壓力,差別是很大的。

            將多個(gè)用戶行動(dòng)整合到一起,也就是用戶模型,或者叫系統(tǒng)使用模型,是壓力場(chǎng)景設(shè)計(jì)的依據(jù)。假設(shè)系統(tǒng)一天的訪問(wèn)量是一萬(wàn)個(gè)用戶,這一萬(wàn)訪問(wèn)量是在24小時(shí)內(nèi)平均分布的,還是分布在8小時(shí)內(nèi),還是在某一時(shí)間點(diǎn)上集中訪問(wèn)?這些具體到用例中也就是虛擬用戶的加載策略,直接決定了壓力的大小。

            除了這個(gè)壓力場(chǎng)景,針對(duì)此系統(tǒng)還需要進(jìn)行絕對(duì)并發(fā)測(cè)試,參考第一步的分析。

            第四、五步就不細(xì)說(shuō)了,準(zhǔn)備環(huán)境、數(shù)據(jù),針對(duì)大量用戶的并發(fā)進(jìn)行一些預(yù)調(diào)優(yōu)。按照第三步設(shè)計(jì)好的各個(gè)測(cè)試用例準(zhǔn)備腳本、執(zhí)行測(cè)試。

            第六步,發(fā)現(xiàn)問(wèn)題了怎么辦?比如1000人的壓力下,系統(tǒng)響應(yīng)就比較慢了,查詢車次需要1分鐘,下訂單需要2分鐘,接下來(lái)要做什么?能把這些作為一個(gè)性能缺陷提起么?顯然是不可以的,這只是通過(guò)你的壓力測(cè)試場(chǎng)景產(chǎn)生的一個(gè)現(xiàn)象,可能是測(cè)試腳本有問(wèn)題、也可能是測(cè)試環(huán)境有問(wèn)題。作為一個(gè)性能測(cè)試人員,需要盡量深入的定位到問(wèn)題產(chǎn)生的原因。就像這個(gè)響應(yīng)慢,只是一個(gè)表面現(xiàn)象,慢在哪?是中間件還是數(shù)據(jù)庫(kù)?一些簡(jiǎn)單的測(cè)試方法就可以進(jìn)行判斷,如在頁(yè)面上進(jìn)行一些數(shù)據(jù)庫(kù)無(wú)關(guān)的操作,如果依然比較慢,說(shuō)明在中間件上壓力就已經(jīng)比較大了。還可以部署另一套中間件測(cè)試環(huán)境,連接之前相同的數(shù)據(jù)庫(kù),在壓力測(cè)試出現(xiàn)問(wèn)題的同時(shí),手動(dòng)訪問(wèn)新部署的應(yīng)用(只有一個(gè)用戶),如果同樣很慢,那說(shuō)明慢在了數(shù)據(jù)庫(kù)端的處理上。還可以通過(guò)日志的方式更準(zhǔn)確的進(jìn)行判斷,如應(yīng)用日志和數(shù)據(jù)庫(kù)SQL執(zhí)行日志??傊椒ㄊ嵌喾N多樣的,但目的只有一個(gè),就是不斷的排除無(wú)關(guān)部分、縮小問(wèn)題范圍。

            定位到了中間件和數(shù)據(jù)庫(kù)之一,然后又該怎么辦?此時(shí)恐怕就需要一些相關(guān)方面的專業(yè)知識(shí)了,但其實(shí)最常見(jiàn)的還是那些。中間件相關(guān)的一般是線程池、JVM、數(shù)據(jù)庫(kù)連接池等,數(shù)據(jù)庫(kù)相關(guān)的有鎖、緩存、IO(一般就是SQL語(yǔ)句的問(wèn)題)等。要進(jìn)行全面的監(jiān)控和分析,再做一些合理的調(diào)優(yōu)并重復(fù)測(cè)試。

            問(wèn)題定位到什么程度才行?我認(rèn)為是要讓人看了知道改哪就可以了。比如提一個(gè)“這個(gè)SQL語(yǔ)句進(jìn)行了大量的物理IO,性能不好”,這就不是個(gè)好問(wèn)題,物理IO是什么?怎么改?如果這么說(shuō)就好多了“這個(gè)SQL語(yǔ)句沒(méi)有使用索引,導(dǎo)致了全表掃描,進(jìn)行了大量的物理IO,性能不好。如果要避免全表掃描,需要調(diào)整SQL語(yǔ)句或者添加X(jué)X索引”,這才是定位問(wèn)題。

            當(dāng)然了,上面只是一個(gè)非常簡(jiǎn)陋的舉例,真實(shí)的性能測(cè)試要比這復(fù)雜的多。

            總的來(lái)說(shuō),我認(rèn)為,性能測(cè)試的難度主要不在技術(shù)手段上,互聯(lián)網(wǎng)時(shí)代技術(shù)都是共享的,要善于去搜索利用他人的成果。即使自己搞不定,團(tuán)隊(duì)內(nèi)一定還有專業(yè)的開(kāi)發(fā)工程師、數(shù)據(jù)庫(kù)管理員、系統(tǒng)管理員可以幫你搞定。真正的難點(diǎn)在于,你要想出來(lái)如何去測(cè)是有效的、有保障的,這才是測(cè)試工程師最重要的能力。

            還是那個(gè)觀點(diǎn),思想才是根本。

          posted on 2013-01-05 13:33 順其自然EVO 閱讀(286) 評(píng)論(0)  編輯  收藏 所屬分類: 性能測(cè)試

          <2013年1月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 太仓市| 青岛市| 宜君县| 道真| 尉犁县| 吐鲁番市| 岳池县| 温宿县| 富阳市| 惠来县| 精河县| 大丰市| 新乡市| 洪江市| 万宁市| 东安县| 宜城市| 个旧市| 溧阳市| 新巴尔虎左旗| 土默特左旗| 习水县| 洛阳市| 乌拉特中旗| 徐水县| 桓仁| 大港区| 松潘县| 琼海市| 宝坻区| 安溪县| 洛南县| 芜湖市| 新化县| 盐源县| 西宁市| 丹阳市| 凌源市| 新巴尔虎左旗| 巫山县| 泾阳县|