軟件測試:Lab 3 Jemter壓力測試


Lab 3 Jemter壓力測試

 

實驗內容:

(1)整體目標:

        安裝虛擬機,並安裝一套LAMP(Linux+Apache+Mysql+PHP)待測系統,推薦ECShop(http://www.ecshop.com),基於此進行Jmeter壓力測試,並在測試后得出Jmeter測試報告,並根據sysstat得出Linux服務器的CIMN(CPU、IO、Memory以及Network)的性能。

(2)隊員分工:

        角色1:安裝LAMP:Linux服務器(Centos)、Apache及PHP

        角色2:安裝MySQL及ECShop(或類似B/S結構的系統)

        角色3:安裝sysstat並使用sysstat查看Linux服務器的CIMN的性能 

        角色4:使用Jmeter進行5*10、50*20的壓力測試並得出Jmeter Aggregate Report,同時運用sysstat對服務器信息進行統計。

(3)實驗要求:

         1. 基本要求:團隊分工完成,實踐壓力測試工具Jmeter

         2. 實驗相關內容:

                1) Linux下top命令結果截圖

                2) 訪問的B/S系統截圖

                3) Jmeter的Testplan展開截圖

                4) Beanshell代碼

                5) 運行Jmeter測試之后的Aggregate Report Result

                6) 運行Jmeter測試之后的服務器性能

 

實驗過程:

 

目錄:

准備工作及說明................................................................................................... 

安裝Apache2,PHP5.6,MySQL,ECShop,sysstat....................................... 

    1安裝PHP5.6.................................................................................................... 

    2安裝Apache2................................................................................................ 

    3安裝MySQL...................................................................................................

    4安裝ECShop..................................................................................................

    5安裝sysstat....................................................................................................

安裝Jmeter...................................................................................................

Jmeter壓力測試實驗步驟..................................................................................................

實驗結果............................................................................................................... 

    1 Linux下top命令結果截圖...........................................................................

    2訪問的B/S系統截圖................................................................................... 

    3 Jmeter的Testplan展開截圖.........................................................................

    4 Beanshell代碼.............................................................................................

    5運行Jmeter測試之后的Aggregate Report Result........................................ 

    6運行Jmeter測試之后的服務器性能     

 

一、准備工作及說明

       服務端機器:安裝VMware workstation(版本不限),同時下載Ubuntu鏡像文件,本次實驗使用的是Ubuntu16.04。然后配置Apache2, PHP5, MySQL,再安裝ECShop和sysstat作為服務器。

       客戶端機器:安裝Jmeter,通過錄制腳本然后訪問服務器端搭建好的ECShop網站,在服務器端通過sysstat來查看服務器的性能。

 

二、安裝Apache2,PHP5.6,MySQL,ECShop,sysstat

       1. 安裝PHP5.6

     Ubuntu 16.04默認安裝php7.0環境,但是php7目前兼容性並不是很好,如果自行安裝php5需要清除php7的已安裝包,否則會報錯。

     //移除默認及已安裝的PHP包

     sudo dpkg -l | grep php| awk '{print $2}' |tr "\n" " "

     sudo apt-get install aptitude
     sudo aptitude purge 'dpkg -l | grep php| awk '{print $2}' |tr "\n" " "'
 
     //添加 PPA
     sudo add-apt-repository ppa:ondrej/php
              
     //安裝php5.6
     sudo apt-get update
     sudo apt-get install php5.6
 
     //安裝擴展
     sudo apt-get install php5.6-gd
     sudo apt-get install php5.6-mysql
 
              【備注:如果已經安裝了php7,建議卸載,如果實在卸載不了,那就重裝Ubuntu,重頭來過。】

       2. 安裝Apache2         

     //安裝Apache2
     sudo apt install apache2
     //整合一下php和Apache  
     sudo apt-get install libapache2-mod-php5.6
 
          打開Ubuntu火狐瀏覽器,輸入http://localhost,出現如下界面,則Apache安裝成功。
            
 

       3. 安裝MySQL

     //安裝MySQL,過程中會要求輸入兩次密碼
     sudo apt install mysql-server php5.6-mysql
     sudo apt-get install mysql-client
 
     //重啟MySQL和Apache
     sudo service mysql restart
     sudo service apache2 restart
               
             Apache,php,MySQL安裝全部完成。
 
         【備注】Apache,php和MySQL 的目錄為  computer/etc/  。同時查看php版本,可以通過 php5.6 -v 命令。
                      
 

       4. 安裝ECShop

 

             4.1打開Ubuntu里面的火狐瀏覽器,下載ECShop V2.7.3(下載地址:https://pan.baidu.com/s/1dDAJvZN)。點擊圖中的下載--->save files。

             

 

            4.2下載后的zip在Downloads中,將其復制粘貼到Home下重命名為ECShop,使用命令 unzip ECShop 解壓,然后將解壓后的文件重命名為ECShop。

               ECShop下有三個目錄,分別是docs(ecshop的安裝說明和介紹等),upgrade(升級包),upload(ecshop安裝程序文件等)。

                

                

                

           

          4.3使用命令 cd  /var ;sudo chmod -R 777 www ,然后把ECShop拷貝到 computer/var/www/html 文件夾下,再把ECShop中的upload文件夾重命名為ecshop。

                

                

 

          4.4命令行進入/var/www/html/ECShop/ecshop, 使用chmod修改如下目錄及其所有子目錄權限   

                 a)  data/ 目錄及其所有子目錄

                 b)  temp/ 目錄及其所有子目錄

                 c)   cert/ 目錄及其所有子目錄

                 d)   includes/ 目錄及其所有子目錄

                 e)   images/ 目錄及其所有子目錄

                 f)   themes/ 目錄及其所有子目錄

                  

                

          4.5用Ubuntu自帶的火狐瀏覽器訪問 http://localhost/ECShop/ecshop ,出現如下安裝界面,執行安裝即可。

               

               

               

               

 

                 【--------------------------------------------------------------------------------------------------------------------------------------------------------------------------

                     從上圖看到不支持JPEG格式,解決辦法:打開 /var/www/html/ECShop/ecshop/install/includes/lib_installer.php 文件,找到下圖所示代碼,把第六行的JPG改成JPEG即可。

                          

                   --------------------------------------------------------------------------------------------------------------------------------------------------------------------------】

                  

                     

               

              下圖建議勾選 安裝測試數據。

               

               出現下圖所示界面,說明安裝成功。

                

         

          4.6安裝完成后,訪問http://localhost/ECShop/ecshop 。

               

 

       【問題解決】

             (1)出現錯誤:Parse error:syntax error,unexpected 'endforeach'(T_ENDFOREACH)  in /var/www/html/ECShop/ecshop/temp/compiled/vote.lbi.php on line 13.

                         解決方法:用chmod修改報錯文件所在文件夾的權限。修改vote.lbi.php (建議在Windows上發郵件到Ubuntu里面,然后復制粘貼就好)。

                            (777 :每個人都有讀和寫以及執行的權限)

vote.lbi.php 

<?php if ($this->_var['vote']): ?>
<?php echo $this->smarty_insert_scripts(array('files'=>'transport.js')); ?>
 
<div id="ECS_VOTE">
<div  class="box">
 <div class="box_1">
  <h3><span><?php echo $this->_var['lang']['online_vote']; ?></span></h3>
  <div  class="boxCenterList">
    <form id="formvote" name="ECS_VOTEFORM" method="post" action="javascript:submit_vote()">
    <?php $_from = $this->_var['vote']; if (!is_array($_from) && !is_object($_from)) {
 settype($_from, 'array'); 
}; $this->push_vars('', 'title');if (count($_from)):
    foreach ($_from AS $this->_var['title']):
?>
     <?php echo $this->_var['title']['vote_name']; ?><br />
     (<?php echo $this->_var['lang']['vote_times']; ?>:<?php echo $this->_var['title']['vote_count']; ?>)<br />
     <?php endforeach; endif; unset($_from); ?><?php $this->pop_vars();; ?>
     <?php $_from = $this->_var['vote']; if (!is_array($_from) && !is_object($_from)) {
 settype($_from, 'array'); 
}; $this->push_vars('', 'title');if (count($_from)):
    foreach ($_from AS $this->_var['title']):
?>
          <?php $_from = $this->_var['title']['options']; if (!is_array($_from) && !is_object($_from)) {
 settype($_from, 'array'); 
}; $this->push_vars('', 'item_0_30844800_1297167693');if (count($_from)):
    foreach ($_from AS $this->_var['item_0_30844800_1297167693']):
?>
            <?php if ($this->_var['title']['can_multi'] == 0): ?>
            <input type="checkbox" name="option_id" value="<?php echo $this->_var['item_0_30844800_1297167693']['option_id']; ?>" />
            <?php echo $this->_var['item_0_30844800_1297167693']['option_name']; ?> (<?php echo $this->_var['item_0_30844800_1297167693']['percent']; ?>%)<br />
            <?php else: ?>
            <input type="radio" name="option_id" value="<?php echo $this->_var['item_0_30844800_1297167693']['option_id']; ?>" />
            <?php echo $this->_var['item_0_30844800_1297167693']['option_name']; ?> (<?php echo $this->_var['item_0_30844800_1297167693']['percent']; ?>%)<br />
            <?php endif; ?>
            <?php endforeach; endif; unset($_from); ?><?php $this->pop_vars();; ?>
            <input type="hidden" name="type" value="<?php echo $this->_var['title']['can_multi']; ?>" />
     <?php endforeach; endif; unset($_from); ?><?php $this->pop_vars();; ?>
     <input type="hidden" name="id" value="<?php echo $this->_var['vote_id']; ?>" />
     <input type="submit" name="submit" style="border:none;" value="<?php echo $this->_var['lang']['submit']; ?>"  class="bnt_bonus" />
     <input type="reset" style="border:none;" value="<?php echo $this->_var['lang']['reset']; ?>" class="bnt_blue" />
     </form>
  </div>
 </div>
</div>
</div>
<div class="blank5"></div>
<script type="text/javascript">
 
/**
 * 處理用戶的投票
 */
function submit_vote()
{
 
  var frm     = document.forms['ECS_VOTEFORM'];
  var type    = frm.elements['type'].value;
  var vote_id = frm.elements['id'].value;
  var option_id = 0;
 
  if (frm.elements['option_id'].checked)
  {
 
    option_id = frm.elements['option_id'].value;
   
}
  else
  {
 
    for (i=0; i<frm.elements['option_id'].length; i++ )
    {
 
      if (frm.elements['option_id'][i].checked)
      {
 
        option_id = (type == 0) ? option_id + "," + frm.elements['option_id'][i].value : frm.elements['option_id'][i].value;
       
}
     
}
   
}
 
  if (option_id == 0)
  {
 
    return;
   
}
  else
  {
 
    Ajax.call('vote.php', 'vote=' + vote_id + '&options=' + option_id + "&type=" + type, voteResponse, 'POST', 'JSON');
   
}
 
}
 
/**
 * 處理投票的反饋信息
 */
function voteResponse(result)
{
 
  if (result.message.length > 0)
  {
 
    alert(result.message);
   
}
  if (result.error == 0)
  {
 
    var layer = document.getElementById('ECS_VOTE');
 
    if (layer)
    {
 
      layer.innerHTML = result.content;
     
}
   
}
 
}
 
</script>
<?php endif; ?>

 

            (2)出現錯誤:Strict Standards: Only variables should be passed by reference in /var/www/html/ECShop/ecshop/includes/cls_template.php on line 422。

                     解決方法:打開 /var/www/ECShop/html/ecshop/includes/cls_template.php ,找到第422行,把$tag_sel = array_shift(explode(' ', $tag));  改成

                                       $tagArr = explode(' ', $tag);
                                       $tag_sel = array_shift($tagArr);

                        【備注:后面出現Strict Standards這種類似的錯誤,都是這樣拆成兩條語句】

 

           (3)出現錯誤:Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /var/www/html/ECShop/ecshop/includes/cls_template.php on line 300

                    解決方法:參考博客 https://www.cnblogs.com/yxhblogs/p/5886191.html  ,該博客里面有一個錯誤,cls_template.php的493行應該換成:

                               $out = "<?php \n" . '$k = ' . preg_replace_callback("/(\'\\$[^,]+)/" , function($r) {return stripslashes(trim($r[1],'\''));}, var_export($t, true)) . ";\n";

 

           (4)出現錯誤:頂部的報錯沒掉了,左側和底部的報錯還在。

                    解決方法:清除ecshop的后台緩存。

                                      關閉SQL查詢結果緩存:打開 in /var/www/html/ECShop/ecshop/includes/cls_template.php ,把最大緩存時間改為0或較小的時間。

                                      

                                      關閉SMARTY的緩存:注釋掉cls_template.php中下面的代碼。

                                       

                                             (ECshop清除緩存的參考網址:http://bbs.ecmoban.com/thread-20941-1-1.html)

 

           (5)出現錯誤:Parse error:syntax error,unexpected 'endif'(T_ENDIF)  in /var/www/html/ECShop/ecshop/temp/compiled/promotion_info.lbi.php on line 18.

                    解決方法:if 開始與結束語句不匹配,把promotion_info.lbi.php文件第18行的 <?php endif; ?> 改成 {/if} 即可。

                  【備注:(1)類似‘endif' 'foreach' 的語法錯誤是因為格式不匹配,可以都改成{if} {/if} 語句,或者都聲明為php語句。

                               (2)可以注釋掉所有的if 和 foreach (如:),就不會出現下圖:

                                           ---------------->   

 

       5. 安裝sysstat

 

    //安裝sysstat

    sudo apt-get install sysstat

    //查看sysstat是否安裝成功

    sar -v

    //出現下圖錯誤(下面的值23一般是當天的日期,此處測試時間為2018年4月23日)

           

    //解決方法

    sudo gedit /etc/default/sysstat , 將ENABLED="false"改為ENABLED="true"

    sudo /etc/init.d/sysstat restart

    //sysstat安裝成功

    

 

三、安裝Jmeter 

 

        下載apache-jmeter-2.11.zip(下載地址:https://archive.apache.org/dist/jmeter/binaries/ ),解壓到文件夾即可。

        直接打開解壓后的文件 ./apache-jmeter-2.11/bin/jmeter.bat 即可打開Jmeter工具界面,注意有兩個窗口,一個為命令行窗口,一個為GUI窗口,且使用過程中命令行窗口不可關閉。(建議將語言改成英文,選項選擇語言即可)

          

           

         【可能出現的問題】命令行窗口出現warning提示(也可以忽略)

          1. 

 

             //警告原因:PermSize和MaxPermSize不需要配置了

           //解決方法:注釋掉PermSize和MaxPermSize的配置即可(建議忽略這個警告)

           2.

          //錯誤原因:java.util.prefs.WindowsPreferences需要保存信息到HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs

                              而不是HKEY_CURRENT_USER\Software\JavaSoft\Prefs。

          //解決方法:win+R 輸入regedit,運行進入注冊表,創建HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs項(雖然Jmeter不會保存任何

                              東西到該項,仍會將信息保存到HKEY_LOCAL_MACHINE\Software\JavaSoft\Prefs)。

                               

 

 

四、Jmeter壓力測試實驗步驟 (參考視頻:https://www.imooc.com/learn/278)

       

       【備注1】ecshop前台登錄地址:ip地址/ECShop/ecshop ;  后台管理登錄地址: ip地址/ECShop/ecshop/admin 。

                     

      【備注2】在進行測試之前,先注冊一個前台登錄賬號,並登錄。

                      為方便起見,可以先登錄后台管理界面,進入后台管理/系統設置/會員注冊項,將注冊時的手機號、qq、msn、手機等改成非必填。

                      

        

        1)  打開apache-jmeter-2.11/bin/jmeter.bat ,右鍵Test Plan->Add->Threads(Users)->Thread Group ,並將新建的thread group命名為test ecshop。

             

 

        2)  右鍵test ecshop,添加HTTP Request Defaults

             

 

        3)  右鍵WorkBench,添加HTTP(s) Test Script Recorder 和Transaction Controller。

             

              

 

        4)  右鍵Transaction Controller,添加HTTP Request Defaults和Recording Controller。

             

             

 

        5)  點擊workbench下面的HTTP(s) Test Script Recorder,修改各項如下:

             

 

        6)  啟動HTTP(s) Test Script Recorder,點擊上圖的start。打開火狐瀏覽器(建議是火狐瀏覽器),設置代理服務器。

              

 

        7) 在火狐瀏覽器中訪問http://192.168.174.128/ECShop/ecshop(已登錄狀態下,IP地址在Ubuntu中查看),並點擊首頁、GSM手機、任意點擊一個商品。

 

        8) 關閉HTTP(s) Test Script Recorder,點擊stop即可,並關閉火狐的代理服務器。然后刪除workbench->transaction controller中訪問的相關標簽,只留下下圖中的三個,

             分別是根目錄,category.php , goods.php ,並把其復制到test ecshop中。

             -------->

 

        9)  右鍵test ecshop,添加User Defined Variables,並設置IP變量。然后將根目錄,category.php , goods.php中的ip地址都用參數${IP} 表示。然后保存Test Plan到/bin/examples目錄里面。

             

            

           

        10)  右鍵test ecshop,添加CSV Data Set Config。然后去到bin目錄下,新建data文件夾,在文件夾中新建catgd.csv文件;

               並設置參數如下圖,然后把根目錄,category.php , goods.php中的相關id都用參數${catid} 和${gdid}表示。

               cat.gd.csv:

               

               

               

        11)  右鍵category.php,添加CSS/JQuery Extractor,並設置如下圖:

                

 

               

 

        12)  右鍵category.php,添加BeanShell Assertion,BeanShell代碼如下圖:

               

              

               

        13)  右鍵test ecshop,添加Aggregate Report和View Results。

 

        14)  設置test ecshop參數如下,進行壓力測試。

                5*10壓力測試 :

                

                

                Aggregate Report:

                

                5*20壓力測試同上。

                

        15)  性能測試。

               先clear一下,然后設置test ecshop為多個進程(保證測試時,系統進程不間斷即可)。

               打開Ubuntu,根據sysstat得出Linux服務器的CIMN(CPU、IO、Memory以及Network)的性能。

 

              //查看CPU,每1秒查看一次,一共查看8次

               sar -q 1 8  

               sar -u 1 8

               //查看Memory

 

               sar -r 1 8        

             //查看IO

               sar -b 1 8  

               sar -n 1 8

             //查看Network 

               sar -n SOCK 1 8  

               sar -n DEV 1 10

 

    

五、實驗結果及截圖

        1)  Linux下top命令結果截圖

             

 

        2)  訪問的B/S系統截圖

              

        

        3)  Jmeter的Testplan展開截圖

             

 

        4)  Beanshell代碼

              

 

java.util.regex.Pattern p = java.util.regex.Pattern.compile("id=(\\d+)");
java.util.regex.Matcher m = p.matcher(bsh.args[0]);
boolean found = m.find();
if (found) {
    if(!m.group(1).equals(bsh.args[1])) {
        Failure = true;
        FailureMessage = m.group(1) + "<>" + bsh.args[1];
    }
}
else failure=true;

 

 

        5)  運行Jmeter測試之后的Aggregate Report Result

             5*10壓力測試:

             

 

              5*20壓力測試:

               

 

        6)  運行Jmeter測試之后的服務器性能

             top監控:

            

 

              CPU:

            

            【注釋:上圖是查看系統內進程隊列的情況,runq-sz 表示准備運行的進程運行隊列。

 

            

             【CPU:表示機器內所有的CPU;%user 表示CPU的利用率;

                 %nice 表示CPU在用戶層優先級的百分比,0表示正常;
                 %system 表示當系統運行時,在用戶應用層上所占用的CPU百分比;
                 %iowait 表示請求硬盤I/0數據流出時,所占用CPU的百分比;
                 %idle 表示空閑CPU百分比,值越大系統負載越低;

               上圖可見idle值非常低,一般為90%以上,空閑CPU百分比明顯偏低,可見壓力測試已占用絕大多數得CPU資源。】

 

           Memory:

            

            【kbmemfree 空閑內存大小、kbmemused  使用內存大小、kbcached  緩存內存大小、 

             kbbuffers:內核中作為緩存區使用的物理內存容量 
             kbcached:內核中作為緩存使用的物理內存容量 
             kbswpfree:交換區的空閑容量 
             kbswpused:使用中的交換區容量 
             相比於平常時候的值,kbmemused, memused%和kbdirty的值顯著偏大,顯然是內存得使用率比平常要高而且存在着頁面交換。

 

           IO:

           

           【bread/s: 每秒從硬盤讀入系統緩沖區buffer的物理塊數。

               lread/s: 平均每秒從系統buffer讀出的邏輯塊數。

               %rcache: 在buffer cache中進行邏輯讀的百分比。

               bwrit/s: 平均每秒從系統buffer向磁盤所寫的物理塊數。

               lwrit/s: 平均每秒寫到系統buffer邏輯塊數。

               %wcache: 在buffer cache中進行邏輯讀的百分比。

               pread/s: 平均每秒請求物理讀的次數。

               pwrit/s: 平均每秒請求物理寫的次數。

               可見每秒請求寫得次數比一般時候要高,猜測是mysql得寫入數據】

 

          Network:

           

           

           

            【IFACE:設備名;

             rxpck/s:每秒收到的包;
             rxbyt/s:每秒收到的所有包的體積;
             txbyt/s:每秒傳輸的所有包的體積;
             rxcmp/s:每秒收到數據切割壓縮的包總數;
             txcmp/s :每秒傳輸的數據切割壓縮的包的總數;
             rxmcst/s: 每秒收到的多點傳送的包;
如圖可見每秒收到得包數量顯著增加,網絡吞吐量大。】

 

           


免責聲明!

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



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