看過我上篇博客的人就知道,使用Ant的方式去構建自動化測試確實有一些不太靈活的地方,而我們郵件通知返回的內容也不是那麼讓人滿意,所以今天我來講講自己的一個優化過程。
首先說一下我的處理方式:
1、下載xsltproc,並用它去替換Ant;
2、更改構建步驟,用xslt實現jtl文件轉換成html文件,並且添加發送短信的jmx文件執行步驟;
3、修改郵件的html模板,解決結果顯示不直觀的問題。
一、安裝xsltproc
一般情況下,linux服務器是自帶xsltproc的,這裏如果沒有的話,可以用下面的命令去安裝:
yum install libxslt
安裝完成後,大家需要查找到它的位置,因爲我們後面的命令行需要用到,所以可以使用
rpm -qa|grep libxslt
找到對應的xslt版本,例如libxslt-1.1.28-5.el7.x86_64,然後運行命令行
rpm -ql libxslt-1.1.28-5.el7.x86_64
找到xsltproc所在路徑。
二、更改構建步驟
1、刪除“Invoke Ant”的這個構建步驟;
2、添加一個“Execute Shell”的構建步驟,輸入生成jtl文件的命令行,具體模式爲
jmeter.sh -n -t jmx文件路徑 -l jtl文件路徑
示例見下圖:
3、添加一個“Execute Shell”的構建步驟,使用xslt實現jtl文件轉換成html測試報告,具體命令行如下:
xsltproc文件路徑 --stringparam dateReport "`date +%y-%m-%d\ %H:%M:%S`" jmeter-results-detail-report_21.xsl文件路徑 jtl文件路徑>html文件路徑
示例見下圖:
- --stringparam dateReport "`date +%y-%m-%d\ %H:%M:%S`" 是爲了解決測試報告日期不顯示的問題,我後面會說明。
- jmeter-results-detail-report_21.xsl文件路徑 在jmeter安裝路徑的extras文件夾下。
4、添加一個“Execute Shell”的構建步驟,執行短信發送接口的jmx命令行,具體命令行如下:
jmeter.sh -n -t 短信發送接口的jmx文件路徑
示例如下圖:
這個短信接口是需要後臺去配合的,具體需要參照你們自己的短信接口,我在腳本中添加了一個BeanShell PreProcessor,對數據IP和content做了一下處理,附上主要的腳本代碼:
String fileContent = readFileContent(path); // 讀取測試報告內容,path是html測試報告的路徑
ArrayList strList = toArrayByInputStreamReader(path);
int reportLines = 0;
try {
reportLines = getTotalLines(new File(path));
} catch (IOException e) {
e.printStackTrace();
}
if (fileContent.contains("Failure Detail") && fileContent.contains("Failure Message")) {
int[] failDetLines = new int[100];
int failMsgLine = 0;
int detCount = 0;
int msgCount = 0;
String failMsg = "";
for (int i = 0; i < strList.size(); i++) {
if (strList.get(i).contains("<h3>")) { // 只有報錯接口才會用這個格式去限制
failDetLines[detCount] = i;
detCount++;
}
if (strList.get(i).contains("Failure Message") && msgCount == 0) {
int toLine = i + 4;
failMsg = strList.get(toLine);
int frontPos = failMsg.indexOf(">");
int behindPos = failMsg.indexOf("<", 2);
failMsg = failMsg.substring(frontPos + 1, behindPos - 1);
msgCount++;
}
}
String failName = "";
for (int j = 0;j < detCount;j++) {
String con = strList.get(failDetLines[j]);
int frontPos = con.indexOf(">");
int behindPos = con.indexOf("<", 2);
con = con.substring(frontPos + 1, behindPos);
if (j != 0) {
failName += "、" + con;
}else {
failName = con;
}
}
vars.put("IP", "xxx.xxx.xxx.xxx");//這裏的“xxx.xxx.xxx.xxx”填寫正確的IP地址
vars.put("content","出現問題,報錯的接口是:\"" + toUTF8(failName) + "\",報錯的內容是\"" + failMsg + "等,\"具體查看通知郵件");
log.info("測試報告文件的行數是:" + reportLines + ",報錯的接口是:\"" + failName + "\",報錯的內容是\"" + failMsg + "\"");
} else {
vars.put("IP", "no IP"); // IP置空,使之不能調用真正的短信接口
vars.put("content","服務一切正常");
log.info("服務一切正常");
}
在上面的代碼中我通過讀取html格式測試報告,找到報錯接口的位置,然後獲取到相關的信息,要注意主要幾個加了註釋的地方。這裏順便加上我http Request的截圖:
可以看到,IP這裏填的是“${IP}”,所以它會根據測試報告中是否有報錯信息而填入正確的IP地址或者不填,content的內容也是從上面BeanShell PreProcessor中的處理結果得到。
5、最後添加一個“Execute System Groovy Script”,按下圖添加命令行,用於解決css格式顯示的問題,配置內容如下:
System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "sandbox; style-src 'self';")
示例圖如下:
三、修改郵件模板
這裏其實我實在構建步驟下面添加了一個文件路徑去獲取測試報告的展示結果,具體代碼如下:
<div>
<table>
<tr>
<th><br />
<h2>測試報告</h2>
</th>
</tr>
<tr>
<td>
<div>${FILE ,path="html文件路徑"}</div>
</td>
</tr>
</table>
</div>
四、最終展示
1、這些操作都做完之後,開始構建,最終的郵件展示如下圖所示:
2、如果有接口出問題,手機上的短信內容展示如下:
3、HTML Report 的截圖展示:
注:紅框區域就是我前面提到的生成報告的日期,通過“--stringparam”命令行去設置格式。
4、Performance Report的截圖展示
所有的優化過程就在這裏啦~