转载地址:http://blog.csdn.net/prjay/article/details/50429083
基于jmeter和shell的接口性能自动化
1. 总体需求
由于性能测试中涉及的查询接口多,版本迭代频繁,版本更新后自动跑一轮查询业务的性能,可以及时发现一些开发修复bug触发的非预期的bug,利用晚上时间快速重测性能接口可以解放人工测试的时间,让测试人员可以把精力集中在测试复杂接口,调优分析性能瓶颈上。
2. 实现流程
自动化的场景模拟真实手工测试,操作步骤和手工测试一样。
开始读取接口测试用例执行用例,发起服务器监控收集执行结果和监控结果执行完所有用例?整理结果,发送邮件结束yesno
3.准备工作
准备软件:
- 系统环境:CentOS release 6.7 (Final)
- 内核版本:Linux localhost 2.6.32-573.7.1.el6.x86_64
- 测试工具:apache-jmeter-2.13 http://jmeter.apache.org/download_jmeter.cgi
- 运行JDK环境:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
- python环境:Python 2.6.6
- 服务器监控nmon:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download
4.具体实现
4.1用例执行
Jmeter的执行支持命令行的方式执行,并且会有一个粗略报告,我们取这个报告里面的执行结果并保存下来
Jmeter的执行结果:
<code class="hljs r has-numbering">[root@localhost bin]<span class="hljs-comment"># ./jmeter -n -t singin.jmx </span> Creating summariser <summary> Created the tree successfully using singin.jmx Starting the test @ Mon Dec <span class="hljs-number">14</span> <span class="hljs-number">16</span>:<span class="hljs-number">42</span>:<span class="hljs-number">33</span> CST <span class="hljs-number">2015</span> (<span class="hljs-number">1450082553651</span>) Waiting <span class="hljs-keyword">for</span> possible shutdown message on port <span class="hljs-number">4445</span> summary + <span class="hljs-number">1</span> <span class="hljs-keyword">in</span> 1s = <span class="hljs-number">1.3</span>/s Avg: <span class="hljs-number">268</span> Min: <span class="hljs-number">268</span> Max: <span class="hljs-number">268</span> Err: <span class="hljs-number">0</span> (<span class="hljs-number">0.00</span>%) Active: <span class="hljs-number">1</span> Started: <span class="hljs-number">1</span> Finished: <span class="hljs-number">0</span> summary + <span class="hljs-number">2</span> <span class="hljs-keyword">in</span> 0s = <span class="hljs-number">50.0</span>/s Avg: <span class="hljs-number">17</span> Min: <span class="hljs-number">14</span> Max: <span class="hljs-number">20</span> Err: <span class="hljs-number">0</span> (<span class="hljs-number">0.00</span>%) Active: <span class="hljs-number">0</span> Started: <span class="hljs-number">1</span> Finished: <span class="hljs-number">1</span> summary = <span class="hljs-number">3</span> <span class="hljs-keyword">in</span> 1s = <span class="hljs-number">3.7</span>/s Avg: <span class="hljs-number">100</span> Min: <span class="hljs-number">14</span> Max: <span class="hljs-number">268</span> Err: <span class="hljs-number">0</span> (<span class="hljs-number">0.00</span>%) Tidying up <span class="hljs-keyword">...</span> @ Mon Dec <span class="hljs-number">14</span> <span class="hljs-number">16</span>:<span class="hljs-number">42</span>:<span class="hljs-number">34</span> CST <span class="hljs-number">2015</span> (<span class="hljs-number">1450082554551</span>) <span class="hljs-keyword">...</span> end of run</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li></ul>
由sumary统计行可以得到我们需要收集的测试结果:
测试结果项 | 值 |
---|---|
总请求数 | 3 |
平均tps | 3.7 |
平均响应时间 | 100ms |
请求失败率 | 0.00% |
主流程脚本
<code class="hljs nginx has-numbering"><span class="hljs-comment">#/bin/bash</span> <span class="hljs-title">source</span> /etc/profile Jmeter_Home=<span class="hljs-string">'/usr/local/apache-jmeter-2.13'</span> TestReport=<span class="hljs-string">'/data/loadtest/report'</span> LogDIR=<span class="hljs-string">'/data/loadtest/log'</span> Date=`date +<span class="hljs-string">"%F"</span>` cd /data/loadtest/ >summary.txt <span class="hljs-comment">#清理上次执行结果</span> run_test() { <span class="hljs-comment">#获取测试用例</span> <span class="hljs-title">for</span> i in `find ./testcase/ -name <span class="hljs-regexp">*.jmx</span>|awk -F <span class="hljs-string">'.'</span> <span class="hljs-string">'{print <span class="hljs-variable">$2</span>}'</span>` do casename=`echo <span class="hljs-string">"<span class="hljs-variable">$i</span>"</span>|awk -F <span class="hljs-string">'/'</span> <span class="hljs-string">'{print <span class="hljs-variable">$4</span>}'</span>` >log/<span class="hljs-variable">${casename}</span>.txt echo -n <span class="hljs-string">"<span class="hljs-variable">$i</span> "</span>>>summary.txt <span class="hljs-comment">#发起监控</span> ./monitor.sh >/dev/null <span class="hljs-number">2</span>>&<span class="hljs-number">1</span> & <span class="hljs-comment">#开始执行测试</span> <span class="hljs-variable">$Jmeter_Home</span>/bin/jmeter -n -t /data/loadtest<span class="hljs-variable">${i}</span>.jmx >>log/<span class="hljs-variable">${casename}</span>.txt & sleep <span class="hljs-number">310</span> <span class="hljs-comment">#如果执行310s还未结束,强制终止执行</span> ps -ef | grep java |grep -v grep | awk <span class="hljs-string">'{print <span class="hljs-variable">$2</span>}'</span> |xargs kill -<span class="hljs-number">9</span> sleep <span class="hljs-number">3</span> <span class="hljs-comment">#提取结果</span> grep <span class="hljs-string">'summary ='</span> log/<span class="hljs-variable">${casename}</span>.txt| tail -<span class="hljs-number">1</span> |awk -F <span class="hljs-string">'[\t / (]+'</span> <span class="hljs-string">'{if(<span class="hljs-variable">$7</span>>10000 && <span class="hljs-variable">$17</span><10.00){printf("%s %d %d %d %.2f% pass ",<span class="hljs-variable">$7</span>,<span class="hljs-variable">$10</span>,<span class="hljs-variable">$3</span>,<span class="hljs-variable">$16</span>,100-<span class="hljs-variable">$17</span>)}else{printf("%s %d %d %d %.2f%% fail ",<span class="hljs-variable">$7</span>,<span class="hljs-variable">$10</span>,<span class="hljs-variable">$3</span>,<span class="hljs-variable">$16</span>,100-<span class="hljs-variable">$17</span>)}}'</span>>>summary.txt cat monitor.txt >>summary.txt echo <span class="hljs-string">''</span> >> summary.txt <span class="hljs-comment">#获取关键日志</span> ssh <span class="hljs-number">10.1.30.54</span> <span class="hljs-string">'tail -n 300 /data/logs/fcuh-user/catalina.out'</span>><span class="hljs-variable">${LogDIR}</span><span class="hljs-variable">${i}</span>.log done } run_test sleep <span class="hljs-number">3</span> <span class="hljs-comment">#生成html报告</span> sh genHTML.sh sleep <span class="hljs-number">1</span> <span class="hljs-comment">#发送邮件</span> python sendmail.py</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li></ul>
4.2服务器监控
服务器资源收集方面,选用的是nmon监控工具,因为它可以后台收集结果保存到文件。由于每个用例测试5分钟,所以只需要监控300秒,每5s监控一次,对应命令:
<code class="hljs lasso has-numbering">nmon <span class="hljs-attribute">-f</span> <span class="hljs-attribute">-t</span> <span class="hljs-attribute">-s5</span> <span class="hljs-attribute">-c60</span> <span class="hljs-attribute">-F</span> /<span class="hljs-built_in">data</span>/test<span class="hljs-built_in">.</span>nmon</code><ul style="" class="pre-numbering"><li>1</li></ul>
测试用例跑完再读取这个结果文件,获取有用的信息
当前只统计了磁盘io和cpu的占用率信息,原始文件保存在本地目录,如果需要,可以手动查看到。
监控脚本:
<code class="hljs bash has-numbering"><span class="hljs-shebang">#!/bin/bash</span> <span class="hljs-comment">#读取监控服务器列表</span> SERVERLIST=`cat serverlist` DATE=`date +<span class="hljs-string">'%F'</span>` mkdir -p /data/loadtest/monitor/<span class="hljs-variable">$DATE</span> TIME=`date +<span class="hljs-string">'%T'</span>` <span class="hljs-comment">#发起监控</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$SERVERLIST</span> <span class="hljs-keyword">do</span> ssh <span class="hljs-variable">$i</span> <span class="hljs-string">'nmon -f -t -s5 -c60 -F /data/test.nmon >/dev/null 2>&1 &'</span> <span class="hljs-keyword">done</span> <span class="hljs-comment">#监控5分钟</span> sleep <span class="hljs-number">303</span> >monitor.txt <span class="hljs-comment">#收集监控结果,保存到monitor.txt</span> <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$SERVERLIST</span> <span class="hljs-keyword">do</span> scp <span class="hljs-variable">$i</span>:/data/test.nmon /data/loadtest/monitor/<span class="hljs-variable">$DATE</span>/<span class="hljs-variable">${i}</span>_<span class="hljs-variable">${TIME}</span>.nmon io=`cat /data/loadtest/monitor/<span class="hljs-variable">$DATE</span>/<span class="hljs-variable">${i}</span>_<span class="hljs-variable">${TIME}</span>.nmon|grep <span class="hljs-string">"DISKBUSY,T"</span> | awk -F <span class="hljs-string">','</span> <span class="hljs-string">'{sum+=$3} END {printf("%.2f%",sum/NR)}'</span>` cpu=`cat /data/loadtest/monitor/<span class="hljs-variable">$DATE</span>/<span class="hljs-variable">${i}</span>_<span class="hljs-variable">${TIME}</span>.nmon|grep <span class="hljs-string">"CPU_ALL,T"</span> | awk -F <span class="hljs-string">','</span> <span class="hljs-string">'{sum+=$6} END {printf("%.2f%",100-sum/NR)}'</span>` <span class="hljs-comment">#net=`cat /data/loadtest/monitor/$DATE/${i}_${TIME}.nmon|grep "NET,T"|awk -F ',' '{sum_r+=$4}{sum_w+=$6} END {print sum_r/NR,sum_w/NR}'`</span> <span class="hljs-built_in">echo</span> -n <span class="hljs-string">"<span class="hljs-variable">${cpu}</span> <span class="hljs-variable">${io}</span> "</span>>>monitor.txt <span class="hljs-keyword">done</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li></ul>
将用例执行结果和监控结果都汇总到summary.txt里
生成的格式如下,方便后面生成html格式的报告
<code class="hljs coffeescript has-numbering">[root<span class="hljs-property">@localhost</span> loadtest]<span class="hljs-comment"># cat summary.txt </span> <span class="hljs-regexp">/testcase/user/</span>获取用户自己的信息 <span class="hljs-number">10748.6</span> <span class="hljs-number">8</span> <span class="hljs-number">3225296</span> <span class="hljs-number">0</span> <span class="hljs-number">100.00</span>% pass <span class="hljs-number">32.87</span>% <span class="hljs-number">5.34</span>% <span class="hljs-number">81.59</span>% <span class="hljs-number">2.12</span>% <span class="hljs-number">0.15</span>% <span class="hljs-number">1.78</span>% <span class="hljs-number">12.13</span>% <span class="hljs-number">32.83</span>% <span class="hljs-number">17.18</span>% <span class="hljs-number">6.14</span>% <span class="hljs-regexp">/testcase/user/</span>未读消息数 <span class="hljs-number">11487.4</span> <span class="hljs-number">7</span> <span class="hljs-number">3446960</span> <span class="hljs-number">0</span> <span class="hljs-number">100.00</span>% pass <span class="hljs-number">32.33</span>% <span class="hljs-number">12.57</span>% <span class="hljs-number">69.02</span>% <span class="hljs-number">1.86</span>% <span class="hljs-number">0.18</span>% <span class="hljs-number">1.74</span>% <span class="hljs-number">13.55</span>% <span class="hljs-number">35.85</span>% <span class="hljs-number">18.56</span>% <span class="hljs-number">7.65</span>% </code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>
服务器监控脚本
<code class="hljs bash has-numbering"><span class="hljs-shebang">#!/bin/bash </span> SERVERLIST=`cat serverlist` DATE=`date +<span class="hljs-string">'%F'</span>` mkdir -p /data/loadtest/monitor/<span class="hljs-variable">$DATE</span> TIME=`date +<span class="hljs-string">'%T'</span>` <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$SERVERLIST</span> <span class="hljs-keyword">do</span> ssh <span class="hljs-variable">$i</span> <span class="hljs-string">'nmon -f -t -s5 -c60 -F /data/test.nmon >/dev/null 2>&1 &'</span> <span class="hljs-keyword">done</span> sleep <span class="hljs-number">303</span> >monitor.txt <span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-variable">$SERVERLIST</span> <span class="hljs-keyword">do</span> scp <span class="hljs-variable">$i</span>:/data/test.nmon /data/loadtest/monitor/<span class="hljs-variable">$DATE</span>/<span class="hljs-variable">${i}</span>_<span class="hljs-variable">${TIME}</span>.nmon io=`cat /data/loadtest/monitor/<span class="hljs-variable">$DATE</span>/<span class="hljs-variable">${i}</span>_<span class="hljs-variable">${TIME}</span>.nmon|grep <span class="hljs-string">"DISKBUSY,T"</span> | awk -F <span class="hljs-string">','</span> <span class="hljs-string">'{sum+=$3} END {printf("%.2f%",sum/NR)}'</span>` cpu=`cat /data/loadtest/monitor/<span class="hljs-variable">$DATE</span>/<span class="hljs-variable">${i}</span>_<span class="hljs-variable">${TIME}</span>.nmon|grep <span class="hljs-string">"CPU_ALL,T"</span> | awk -F <span class="hljs-string">','</span> <span class="hljs-string">'{sum+=$6} END {printf("%.2f%",100-sum/NR)}'</span>` <span class="hljs-built_in">echo</span> -n <span class="hljs-string">"<span class="hljs-variable">${cpu}</span> <span class="hljs-variable">${io}</span> "</span>>>monitor.txt <span class="hljs-keyword">done</span> </code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li></ul>
4.3生成html报告
<code class="hljs handlebars has-numbering"><span class="xml">#!/bin/sh >index.html echo "<span class="hljs-tag"><<span class="hljs-title">html</span>></span><span class="hljs-tag"><<span class="hljs-title">head</span>></span><span class="hljs-tag"><<span class="hljs-title">META</span> <span class="hljs-attribute">http-equiv</span>=<span class="hljs-value">\"Content-Type\"</span> <span class="hljs-attribute">content</span>=<span class="hljs-value">\"text</span>/<span class="hljs-attribute">html</span>; <span class="hljs-attribute">charset</span>=<span class="hljs-value">utf-8\"</span>/></span><span class="hljs-tag"><<span class="hljs-title">title</span>></span>用户端自动化性能测试报告<span class="hljs-tag"></<span class="hljs-title">title</span>></span>">>index.html echo `cat style.css`>>index.html ( cat <span class="hljs-tag"><<<span class="hljs-attribute">EOF</span> <<span class="hljs-attribute">script</span> <span class="hljs-attribute">language</span>=<span class="hljs-value">"JavaScript"</span>></span> function show_detail(detail){ if(detail.style.display=="none"){ detail.style.display=""; } else{ detail.style.display="none"; } } <span class="hljs-tag"></<span class="hljs-title">script</span>></span> EOF )>>index.html echo "<span class="hljs-tag"></<span class="hljs-title">head</span>></span><span class="hljs-tag"><<span class="hljs-title">body</span>></span><span class="hljs-tag"><<span class="hljs-title">h1</span>></span>用户端自动化性能测试报告<span class="hljs-tag"></<span class="hljs-title">h1</span>></span><span class="hljs-tag"><<span class="hljs-title">hr</span> <span class="hljs-attribute">size</span>=<span class="hljs-value">"1"</span>></span>">>index.html sum=`cat summary.txt | wc -l` sucess=`cat summary.txt|grep pass |grep -v grep|wc -l` fail=`expr $sum - $sucess` rate=`echo "$sucess $sum"|awk '{printf("%.2f%%",$1/$2*100)}'` ( cat <span class="hljs-tag"><<<span class="hljs-attribute">EOF</span> <<span class="hljs-attribute">table</span>></span><span class="hljs-tag"><<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span> <span class="hljs-tag"><<span class="hljs-title">h2</span>></span>结果汇总<span class="hljs-tag"></<span class="hljs-title">h2</span>></span> <span class="hljs-tag"><<span class="hljs-title">table</span> <span class="hljs-attribute">width</span>=<span class="hljs-value">"60%"</span> <span class="hljs-attribute">cellspacing</span>=<span class="hljs-value">"2"</span> <span class="hljs-attribute">cellpadding</span>=<span class="hljs-value">"5"</span> <span class="hljs-attribute">border</span>=<span class="hljs-value">"0"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"details"</span> <span class="hljs-attribute">align</span>=<span class="hljs-value">"left"</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>总接口数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>成功接口数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>失败接口数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>测试通过率<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span> <span class="hljs-attribute">align</span>=<span class="hljs-value">"center"</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>$sum<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>$sucess<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>$fail<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>$rate<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span> <span class="hljs-tag"></<span class="hljs-title">tr</span>></span><span class="hljs-tag"></<span class="hljs-title">table</span>></span> <span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span> EOF )>>index.html ( cat <span class="hljs-tag"><<<span class="hljs-attribute">EOF</span> <<span class="hljs-attribute">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span> <span class="hljs-tag"><<span class="hljs-title">h2</span>></span>概要结果<span class="hljs-tag"></<span class="hljs-title">h2</span>></span> <span class="hljs-tag"><<span class="hljs-title">table</span> <span class="hljs-attribute">width</span>=<span class="hljs-value">"95%"</span> <span class="hljs-attribute">cellspacing</span>=<span class="hljs-value">"2"</span> <span class="hljs-attribute">cellpadding</span>=<span class="hljs-value">"5"</span> <span class="hljs-attribute">border</span>=<span class="hljs-value">"0"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"details"</span> <span class="hljs-attribute">align</span>=<span class="hljs-value">"left"</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span> <span class="hljs-attribute">valign</span>=<span class="hljs-value">"top"</span>></span> <span class="hljs-tag"><<span class="hljs-title">th</span>></span>测试接口<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>每秒请求数(tps)<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>平均响应时间(ms)<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>总事务数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>失败事务数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>事务成功率<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>测试结果<span class="hljs-tag"></<span class="hljs-title">th</span>></span> <span class="hljs-tag"></<span class="hljs-title">tr</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span> <span class="hljs-attribute">valign</span>=<span class="hljs-value">"top"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">""</span>></span> EOF )>>index.html cat summary.txt |while read line do echo $line | awk '{if($7=="pass"){print "<span class="hljs-tag"><<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$1"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$2"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$3"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$4"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$5"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$6"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">\"Pass\"</span>></span>"$7"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span>"}else{print "<span class="hljs-tag"><<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$1"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$2"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$3"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$4"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$5"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span>"$6"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">\"Failure\"</span>></span>"$7"<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span>"}}'>>index.html done echo "<span class="hljs-tag"></<span class="hljs-title">tr</span>></span><span class="hljs-tag"></<span class="hljs-title">table</span>></span><span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span>">>index.html echo "<span class="hljs-tag"><<span class="hljs-title">table</span>></span><span class="hljs-tag"><<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">font</span> <span class="hljs-attribute">color</span>=<span class="hljs-value">"red"</span>></span><span class="hljs-tag"><<span class="hljs-title">b</span>></span>测试结果pass标准:tps>10000且事务成功率>90%<span class="hljs-tag"></<span class="hljs-title">b</span>></span><span class="hljs-tag"></<span class="hljs-title">font</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">tr</span>></span><span class="hljs-tag"><<span class="hljs-title">td</span>></span><span class="hljs-tag"><<span class="hljs-title">h2</span>></span><span class="hljs-tag"><<span class="hljs-title">a</span> <span class="hljs-attribute">href</span>=<span class="hljs-value">\"javascript:show_detail(detail)\"</span>></span>详细结果查看附件<span class="hljs-tag"></<span class="hljs-title">a</span>></span><span class="hljs-tag"></<span class="hljs-title">h2</span>></span><span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span><span class="hljs-tag"></<span class="hljs-title">table</span>></span>">>index.html #echo "<span class="hljs-tag"><<span class="hljs-title">div</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">\"page_details_expanded\"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">\"detail\"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">\"display:none;\"</span> <span class="hljs-attribute">width</span>=<span class="hljs-value">\"95%\"</span>></span>">>index.html ( cat <span class="hljs-tag"><<<span class="hljs-attribute">EOF</span> <<span class="hljs-attribute">table</span> <span class="hljs-attribute">width</span>=<span class="hljs-value">"95%"</span> <span class="hljs-attribute">cellspacing</span>=<span class="hljs-value">"2"</span> <span class="hljs-attribute">cellpadding</span>=<span class="hljs-value">"5"</span> <span class="hljs-attribute">border</span>=<span class="hljs-value">"0"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">"details"</span> <span class="hljs-attribute">align</span>=<span class="hljs-value">"left"</span> <span class="hljs-attribute">id</span>=<span class="hljs-value">"detail"</span> <span class="hljs-attribute">style</span>=<span class="hljs-value">"display:none"</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span> <span class="hljs-attribute">valign</span>=<span class="hljs-value">"top"</span>></span> <span class="hljs-tag"><<span class="hljs-title">th</span>></span>测试接口<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>每秒请求数tps<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>平均响应时间(ms)<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>总事务数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>失败事务数<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>成功率<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>测试结果<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>nginx服务器cpu<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>nginx服务器io<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>web服务器cpu<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>web服务器io<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>service服务器cpu<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>service服务器io<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>主数据库服务器cpu<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>主数据库服务器io<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>从数据库服务器cpu<span class="hljs-tag"></<span class="hljs-title">th</span>></span><span class="hljs-tag"><<span class="hljs-title">th</span>></span>从数据库服务器io<span class="hljs-tag"></<span class="hljs-title">th</span>></span> <span class="hljs-tag"></<span class="hljs-title">tr</span>></span> <span class="hljs-tag"><<span class="hljs-title">tr</span> <span class="hljs-attribute">valign</span>=<span class="hljs-value">"top"</span> <span class="hljs-attribute">class</span>=<span class="hljs-value">""</span>></span> EOF )>>index.html j=1 for i in `cat summary.txt` do if [ `expr $j % 17 ` != 0 ]; then echo '<span class="hljs-tag"><<span class="hljs-title">td</span> <span class="hljs-attribute">align</span>=<span class="hljs-value">"left"</span>></span>'$i'<span class="hljs-tag"></<span class="hljs-title">td</span>></span>'>>index.html else echo '<span class="hljs-tag"><<span class="hljs-title">td</span> <span class="hljs-attribute">align</span>=<span class="hljs-value">"left"</span>></span>'$i'<span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span>'>>index.html fi j=`expr $j + 1` done echo "<span class="hljs-tag"></<span class="hljs-title">tr</span>></span><span class="hljs-tag"></<span class="hljs-title">table</span>></span><span class="hljs-tag"></<span class="hljs-title">td</span>></span><span class="hljs-tag"></<span class="hljs-title">tr</span>></span><span class="hljs-tag"></<span class="hljs-title">table</span>></span><span class="hljs-tag"></<span class="hljs-title">body</span>></span><span class="hljs-tag"></<span class="hljs-title">html</span>></span>">>index.html</span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li></ul>
html样式表
<code class="hljs xml has-numbering"><span class="hljs-tag"><<span class="hljs-title">style</span> <span class="hljs-attribute">type</span>=<span class="hljs-value">"text/css"</span>></span><span class="css"> <span class="hljs-tag">body</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">font</span>:<span class="hljs-value">normal <span class="hljs-number">68</span>% verdana,arial,helvetica</span></span>; <span class="hljs-rule"><span class="hljs-attribute">color</span>:<span class="hljs-value"><span class="hljs-hexcolor">#000000</span></span></span>; <span class="hljs-rule">}</span></span> <span class="hljs-tag">table</span> <span class="hljs-tag">tr</span> <span class="hljs-tag">td</span>, <span class="hljs-tag">table</span> <span class="hljs-tag">tr</span> <span class="hljs-tag">th</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">font-size</span>:<span class="hljs-value"> <span class="hljs-number">78</span>%</span></span>; <span class="hljs-rule">}</span></span> <span class="hljs-tag">table</span><span class="hljs-class">.details</span> <span class="hljs-tag">tr</span> <span class="hljs-tag">th</span><span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">color</span>:<span class="hljs-value"> <span class="hljs-hexcolor">#ffffff</span></span></span>; <span class="hljs-rule"><span class="hljs-attribute">font-weight</span>:<span class="hljs-value"> bold</span></span>; <span class="hljs-rule"><span class="hljs-attribute">text-align</span>:<span class="hljs-value">center</span></span>; <span class="hljs-rule"><span class="hljs-attribute">background</span>:<span class="hljs-value"><span class="hljs-hexcolor">#2674a6</span></span></span>; <span class="hljs-rule"><span class="hljs-attribute">white-space</span>:<span class="hljs-value"> nowrap</span></span>; <span class="hljs-rule">}</span></span> <span class="hljs-tag">table</span><span class="hljs-class">.details</span> <span class="hljs-tag">tr</span> <span class="hljs-tag">td</span><span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">background</span>:<span class="hljs-value"><span class="hljs-hexcolor">#eeeee0</span></span></span>; <span class="hljs-rule"><span class="hljs-attribute">white-space</span>:<span class="hljs-value"> nowrap</span></span>; <span class="hljs-rule">}</span></span> <span class="hljs-tag">h1</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">margin</span>:<span class="hljs-value"> <span class="hljs-number">0</span>px <span class="hljs-number">0</span>px <span class="hljs-number">5</span>px</span></span>; <span class="hljs-rule"><span class="hljs-attribute">font</span>:<span class="hljs-value"> <span class="hljs-number">265</span>% verdana,arial,helvetica </span></span></span>} <span class="hljs-tag">h2</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">margin-top</span>:<span class="hljs-value"> <span class="hljs-number">1</span>em</span></span>; <span class="hljs-rule"><span class="hljs-attribute">margin-bottom</span>:<span class="hljs-value"> <span class="hljs-number">0.5</span>em</span></span>; <span class="hljs-rule"><span class="hljs-attribute">font</span>:<span class="hljs-value"> bold <span class="hljs-number">185</span>% verdana,arial,helvetica </span></span></span>} <span class="hljs-tag">h3</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">margin-bottom</span>:<span class="hljs-value"> <span class="hljs-number">0.5</span>em</span></span>; <span class="hljs-rule"><span class="hljs-attribute">font</span>:<span class="hljs-value"> bold <span class="hljs-number">115</span>% verdana,arial,helvetica </span></span></span>} <span class="hljs-class">.Failure</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">font-weight</span>:<span class="hljs-value">bold</span></span>; <span class="hljs-rule"><span class="hljs-attribute">color</span>:<span class="hljs-value">red</span></span>; <span class="hljs-rule">}</span></span> <span class="hljs-class">.Pass</span> <span class="hljs-rules">{ <span class="hljs-rule"><span class="hljs-attribute">font-weight</span>:<span class="hljs-value">bold</span></span>; <span class="hljs-rule"><span class="hljs-attribute">color</span>:<span class="hljs-value">green</span></span>; <span class="hljs-rule">}</span></span> </span><span class="hljs-tag"></<span class="hljs-title">style</span>></span></code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li></ul>
4.4发送测试结果邮件
发邮件脚本
<code class="hljs python has-numbering"><span class="hljs-comment">#!/usr/bin/env python</span> <span class="hljs-comment">#coding: utf-8 </span> <span class="hljs-keyword">import</span> string <span class="hljs-keyword">import</span> smtplib <span class="hljs-keyword">import</span> os <span class="hljs-keyword">import</span> datetime <span class="hljs-keyword">from</span> email.mime.multipart <span class="hljs-keyword">import</span> MIMEMultipart <span class="hljs-keyword">from</span> email.mime.text <span class="hljs-keyword">import</span> MIMEText <span class="hljs-keyword">from</span> email.mime.base <span class="hljs-keyword">import</span> MIMEBase <span class="hljs-keyword">from</span> email.header <span class="hljs-keyword">import</span> Header today = datetime.date.today() sender = <span class="hljs-string">'xx@xx.com'</span> receiverlist = [<span class="hljs-string">"a@a.com"</span>,<span class="hljs-string">"b@b.com"</span>,<span class="hljs-string">"c@c.com"</span>] subject = <span class="hljs-string">'%s %s'</span> % (<span class="hljs-string">'用户端自动化性能测试报告'</span>,today) smtpserver = <span class="hljs-string">'smtp.exmail.qq.com'</span> username = <span class="hljs-string">'xx@xx.com'</span> password = <span class="hljs-string">'xxx'</span> f = open(<span class="hljs-string">'index.html'</span>,<span class="hljs-string">"r"</span>) content = f.read() <span class="hljs-comment">#msg = MIMEText(content,'html','utf-8')</span> msg = MIMEMultipart() msg.attach(MIMEText(content,<span class="hljs-string">'html'</span>,<span class="hljs-string">'utf-8'</span>)) msg[<span class="hljs-string">'From'</span>] = <span class="hljs-string">'xx@xx.com'</span> msg[<span class="hljs-string">'to'</span>] = <span class="hljs-string">','</span>.join(receiverlist) msg[<span class="hljs-string">'Subject'</span>] = subject att=MIMEText(open(<span class="hljs-string">'index.html'</span>,<span class="hljs-string">'rb'</span>).read(),<span class="hljs-string">'base64'</span>,<span class="hljs-string">'gb2312'</span>) att[<span class="hljs-string">"Conten-Type"</span>]=<span class="hljs-string">'application/octet-stream'</span> att[<span class="hljs-string">"Content-Disposition"</span>]=<span class="hljs-string">'attachment;filename="Load test result.html"'</span> msg.attach(att) smtp = smtplib.SMTP() smtp.connect(smtpserver) smtp.ehlo() smtp.starttls() smtp.ehlo() <span class="hljs-comment">#smtp.set_debuglevel(1)</span> smtp.login(username, password) smtp.sendmail(msg[<span class="hljs-string">'From'</span>],msg[<span class="hljs-string">'to'</span>],msg.as_string()) smtp.quit()</code><ul style="" class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li></ul>
测试结果截图: