上一篇博客講了自己在進行Jenkins構建自動化測試時遇到的一些坑和解決方法,爲了更好地讓自己熟悉自動化測試構建過程,在這裏開篇博客做個記錄。
先說一下我一開始被安排的這個任務需求:
在Jenkins上配置一個自動化測試項目,要求該項目每天定時去跑一遍重要接口,當然這些接口是放在一個jmx文件中的。如果其中的某個或多個接口出現了問題,第一時間以郵件或短信(前提是有短信發送接口,這裏需要服務端配合)的方式發送出來。
背景條件:Jenkins部署在了linux服務器上,該服務器上沒有安裝JMeter和Ant。
我是第一次接觸Jenkins的,同事也不是很熟悉,所以在網上看了不少資料,也走了不少的彎路,接下來是我這一路摸索解決的過程。
一、搭建JMeter和Ant環境
1、在本地下載JMeter和Ant的壓縮包,上傳到服務器後,解壓安裝包:
unzip apache-jmeter-5.3.zip
unzip apache-ant-1.10.7-bin.zip
2、在~/.bashrc文件中配置JMeter和Ant的環境變量:
//進入bashrc文件的編輯模式
vi ~/.bashrc
//添加JMeter的環境變量配置,注意要改成你本地的JMeter存放路徑和版本
export JMETER_HOME=.../apache-jmeter-5.2.1
export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH
export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin
//添加Ant的環境變量配置,注意要改成你本地的Ant存放路徑和版本
export ANT_HOME=.../apache-ant-1.10.7
export PATH=$PATH:$ANT_HOME/bin
export PATH=$PATH:.../apache-ant-1.10.7/bin
//退出編輯,先點擊Esc鍵,輸入“:wq”,點擊Enter鍵
:wq
//刷新bashrc文件
source ~/.bashrc
其實還是蠻簡單的,不過要注意的是一定在~/.bashrc文件中配置環境變量,不然會有其他問題,具體可以看我前一篇關於填坑記錄的博客。
3、配置完成後,使用jmeter和ant命令,驗證一下是否正常安裝了JMeter和Ant:
當看到上面的顯示時,說明已經成功安裝了JMeter 5.2.1 版本。
同理,當看到上面的顯示時,說明已經成功安裝了Ant 1.10.7版本。
4、在Ant文件的bin目錄下,新建一個build.xml文件,文件內容如下:
<?xml version="1.0" encoding="utf8"?>
<project name="ant-jmeter-test" default="run" basedir=".">
<tstamp>
<format property="time" pattern="yyyyMMddHHmm" />
</tstamp>
<!-- 需要改成自己本地的jmeter目錄-->
<property name="jmeter.home" value="/home/apache-jmeter-5.2.1" />
<!-- jmeter生成的jtl格式的結果報告的路徑-->
<property name="jmeter.result.jtl.dir" value="/home/apache-jmeter-5.2.1/JMeterTest/resultLog/jtl" />
<!-- jmeter生成的html格式的結果報告的路徑-->
<property name="jmeter.result.html.dir" value="/home/apache-jmeter-5.2.1/JMeterTest/resultLog/html" />
<!-- ʺ生成的報告的前綴-->
<property name="ReportName" value="result" />
<property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}.jtl" />
<property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}.html" />
<target name="run">
<antcall target="test" />
<antcall target="report" />
</target>
<target name="test">
<taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />
<jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}" jmeterlogfile="/home/apache-jmeter-5.2.1/jmeter.log">
<!-- 聲明要運行的腳本"*.jmx"指包含此目錄下的所有jmeter腳本-->
<testplans dir="/home/apache-jmeter-5.2.1/bin/script" includes="*.jmx" />
<property name="jmeter.save.saveservice.output_format" value="xml"/>
</jmeter>
</target>
<path id="xslt.classpath">
<fileset dir="${jmeter.home}/lib" includes="xalan-2.7.2.jar"/>
<fileset dir="${jmeter.home}/lib" includes="serializer-2.7.2.jar"/>
</path>
<target name="report">
<tstamp>
<format property="report.datestamp" pattern="yyyy/MM/dd HH:mm" />
</tstamp>
<xslt
classpathref="xslt.classpath"
force="true"
in="${jmeter.result.jtlName}"
out="${jmeter.result.htmlName}"
style="${jmeter.home}/extras/jmeter.results.shanhe.me.xsl">
<param name="dateReport" expression="${report.datestamp}"/>
</xslt>
<!-- 拷貝報告所需的圖片資源至目標目錄 -->
<copy todir="${jmeter.result.html.dir}">
<fileset dir="${jmeter.home}/extras">
<include name="collapse.png" />
<include name="expand.png" />
</fileset>
</copy>
</target>
</project>
要注意的是,這些地方必須改成你們自己的文件路徑,否則會報錯:
<!-- 需要改成自己本地的jmeter目錄-->
<property name="jmeter.home" value="/home/apache-jmeter-5.2.1" />
<!-- jmeter生成的jtl格式的結果報告的路徑-->
<property name="jmeter.result.jtl.dir" value="/home/apache-jmeter-5.2.1/JMeterTest/resultLog/jtl" />
<!-- jmeter生成的html格式的結果報告的路徑-->
<property name="jmeter.result.html.dir" value="/home/apache-jmeter-5.2.1/JMeterTest/resultLog/html" />
在上面我們可以看到,我把jtl文件、html最終放在對應的文件夾中,如果說你們本身沒有那個路徑的話,記得一定要先新建好對應的文件夾和路徑。
另外要注意的是,我們要運行的jmx文件存放的位置,下面的代碼就是用來設置這個的:
<!-- 聲明要運行的腳本"*.jmx"指包含此目錄下的所有jmeter腳本-->
<testplans dir="/home/apache-jmeter-5.2.1/bin/script" includes="*.jmx" />
5、在jmeter的extras文件夾中找到“ant-jmeter-1.1.1.jar”放入ant的lib文件夾中;
6、由於jmeter默認輸出格式是csv,這時需要修改輸出格式爲“xml”,在jmeter的bin目錄下找到配置文件jmeter.properties,搜索“jmeter.save.saveservice.output_format=csv”,把它修改成“jmeter.save.saveservice.output_format=xml”。
7、運行如下命令行,看是否能正常生成jtl文件和html文件:
// 進入ant文件的bin目錄
cd /home/apache-ant-1.10.7/bin
//運行ant命令,執行build.xml文件
ant
如下圖所示,說明在linux服務器上已經正常配置且可以正常生成jtl文件和html格式的測試報告。
二、Jenkins——系統管理
1、首先打開瀏覽器,輸入正確的網址,登錄到Jenkins工作臺,可以看到左邊有一排功能菜單,如下圖所示:
2、因爲我們要使用到Jenkins的郵件通知服務,我們需要在“系統管理-插件管理”中下載相關的插件,且在“系統管理-系統配置”中進行關於發送郵件的配置:
郵件通知插件下載
1.點擊“系統管理”,點擊右側列表中顯示的“管理插件”:
2.在插件管理界面的右上角搜索框搜索插件“Email Extension”,這個插件是爲了更方便地對郵件通知進行配置,具體可以見它的解釋(這個插件是Jenkins電子郵件發行商的替代品。它允許配置電子郵件通知的每一個方面:當發送電子郵件時,誰應該接收它以及電子郵件所說的內容)。下載完成後,可以在已安裝的插件中找到它,如下圖所示:
郵件通知系統配置
1.重新進入Jenkins工作臺,點擊“系統管理”,點擊右側列表中顯示的“系統配置”:
2.在系統配置界面中找到“Jenkins Location”,配置好相關參數,如下圖所示:
- 輸入Jenkins URL ——Jenkins工作臺對應的網址
- 系統管理員郵件地址——發送郵件的郵箱號碼
3.找到“Extended E-mail Notification”,這個叫做郵件通知擴展,可以對郵件的內容格式、標題等信息進行配置,如下圖所示:
從上面可以看到,我將使用QQ郵箱進行郵件發送,所以SMTP server我填的是“smtp.qq.com”,默認用戶郵箱後綴填的是“@qq.com”。郵件內容類型我選擇的是“HTML(text/html)”,這主要是考慮到我需要在郵件裏設置一些文字格式和排列樣式等,所以使用普通的文字類型無法滿足要求。另外,這裏如果你想使用其他的郵箱,比如網易郵箱啥的,可以自行百度一下SMTP server的填寫,另外一定要記得填寫正確的郵箱後綴(網易的是“@163.com”)。另外默認內容裏面我特地加了一句,是爲方便到時候查看測試郵件通知是否會成功,內容是否顯示正確。
除此之外,可以看到“Default user E-mail suffix”右下方有個“高級”的按鈕,點擊後就可以看到下圖的相關配置項,勾選“Use SMTP Authentication”,然後填寫“User Name”爲發送人的郵箱號,填寫“Password”爲發送人的QQ郵箱授權碼,這裏一定一定要注意了,不是填郵箱密碼。至於授權碼怎麼來的,大家可以參考這個鏈接:https://jingyan.baidu.com/article/fedf0737af2b4035ac8977ea.html
4.找到“郵件通知”,並進行如下圖的配置,SMTP服務器什麼的都與前面“Extened E-mail Notification”一致,注意SMTP端口必須是465(QQ郵箱的),字符集這裏填入的是“UTF-8”,防止出現亂碼:
最後測試一下這個郵件通知服務是否成功。先勾選“通過發送測試郵件測試配置”,並在“Test e-mail recipient”中填寫一個可正常收件的收件人郵箱,點擊“Test Configuration”,如下圖所示:
配置無誤的話,是會正常收到郵件,說明系統管理中關於郵件通知的配置完成。
三、Jenkins——新建任務並查看
1、在Jenkins工作臺的功能菜單中找到並點擊“新建任務”,會進入一個新建任務的界面。這裏我是新建了一個自由風格的軟件項目,名稱是“test-JMeterTest”,因爲我已經建好了,所以也是會提示"***已存在",如下圖所示:
2、建好了之後,在工作臺的右邊可以找到對應的項目了,如下圖所示:
四、Jenkins——項目配置
1、點擊對應的項目,進入項目主頁,可以看到左側同樣有一排項目的功能菜單,如下圖所示,點擊“配置”,進入配置界面:
2、配置裏面分爲六大步驟:General(通用)、源碼管理、構建觸發器、構建環境、構建、構建後操作,接下來我們一個一個看。
1.General(通用)
在通用設置中,我們可以進行一些基礎的設置,比如:
- Change date pattern for the BUILD_TIMESTAMP (build timestamp) variable:顧名思義就是“更改BUILD_TIMESTAMP(BUILD TIMESTAMP)變量的日期模式”
這裏我們勾選了改變日期模式時,要求給一個模式值。如果你不知道怎麼填的話,可以點擊右側的那個“?”看一下提示。這裏提示中給我們舉了個例子:yyyyMMddHHmmss,寫過代碼的同學肯定就知道,如果我這麼設置的話,那麼得到的時間就會是類似於20200526220341這樣一個格式,也就相當於2020年5月26號22點03分41秒。
- Discard old builds:丟棄舊的構建,就是說可以對構建記錄進行保存時間和保存最大個數的設置。每次進行新的構建或者時間推移時,會根據這兩個設置,把不符合條件的構建記錄給刪除,這也是爲了避免太多或者說沒必要保留的構建記錄佔用了服務器內存。這裏勾選“Discard old builds”後,設置“Days to keep builds”爲“1”,“Max # of builds to keep”爲“20”,也就是說構建記錄最多保留一天,只保留最後構建的20條記錄。
2.源碼管理
這塊因爲我這邊是沒有配置的,所以不多做介紹,如果要構建的項目代碼目前是被版本控制工具(SVN或Git)管理的話,那麼需要在這裏進行配置。
3.構建觸發器
前面提到了要求每天定時去跑這個項目,那我不可能每天守着那個時間,手動去構建呀。怎麼辦?此時就需要配置一下構建觸發器。但是構建觸發器有好幾種,這裏只說下面兩種,如下圖所示,我勾選了“Build periodically”,設置“Schedule”爲“H 8 * * *”:
對於“Schedule”的具體配置,大家可以就有疑問了,爲甚要這麼配置呢?,其實還是挺容易的理解的。它的格式爲“* * * * *”,也就是五個*組成,每個*的有不同的解釋如下:
- 第一個*表示分鐘,取值0~59
- 第二個*表示小時,取值0~23
- 第三個*表示一個月的第幾天,取值1~31
- 第四個*表示第幾月,取值1~12
- 第五個*表示一週中的第幾天,取值0~7,其中0和7代表的都是週日
大家可能還發現了另外一個定時輪詢的構建器“Poll SCM”,它與“Build periodically”都是定時輪詢,連配置項都是“Schedule”,那爲什麼選擇“Build periodically”而不是“Poll SCM”呢?
說到這裏要注意了,如果是要對項目定時輪詢且沒有配置源碼管理工具時選擇“Build periodically”,反之優先選擇“Poll SCM”,一定要記住。
4.構建環境
這一塊我是沒有什麼需要配置的,所以跳過。
5.構建
(1)點擊“增加構建步驟”按鈕,點擊下拉列表中的“執行shell”,新增一個shell命令執行步驟,如下圖所示:
這裏因爲jtl文件所在文件夾每次生成jtl文件前必須是一個空文件夾,所以這裏我會先執行一個shell命令去刪除jtl文件夾中的全部文件,防止報錯。
(2)點擊“增加構建步驟”按鈕,點擊下拉列表中的“Invoke Ant”,配置好Ant的版本及Build File,如下圖所示:
這裏的“Ant Version”是我安裝在linux服務中的ant版本,“Build File”輸入框中填入前面新增的那個build.xml文件的路徑。
6.構建後操作
(1)點擊“增加構建後操作步驟”,點擊列表中的“Publish Performance test result report”並進行配置。如果找不到“Publish Performance test result report”,那麼先要去插件管理那邊下載插件“Performance Plugin”,下載完成後,再對它進行如下圖的配置:
(2)同理,點擊“增加構建後操作步驟”,點擊列表中的“Publish HTML reports”,如果找不到的話,那麼先要去插件管理那邊下載插件“HTML Publisher”。下載完成後,再對它進行如下圖的配置:
- HTML directory to archive——輸入jmeter生成的html格式的結果報告的路徑
- Index page[s]——輸入jmeter生成的html格式的結果報告的名稱及後綴
- Report title——輸入自定義報告標題
(3)點擊“增加構建後操作步驟”按鈕,點擊列表中“Editable Email Notification”,編輯郵件通知的配置,首先我們可看到如下圖所示:
(4)點擊右下角的“Advanced Settings...”,在Triggers裏面點擊“新增”按鈕,新增了一個接收人列表“Recipient List”。另外爲了測試方便,我選擇“Always”發送郵件的方式,如下圖所示:
(5)點擊“高級”按鈕,可設置更多的信息,如下圖所示:
- Recipient List——接收人列表,這裏可以輸入一個或多個接收人郵箱,如果是多個接收人,可以用“;”隔開去輸入
- Content Type——內容類型,這裏因爲我是用一個html格式去顯示郵件內容,所以選擇“HTML(html/text)”。
- Subject——項目名稱
- Content——郵件內容
這裏附上我的郵件內容模板:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌</title>
</head>
<body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"
offset="0">
<tr>
本郵件由Jenkins系統自動發出,無需回覆!<br/>
以下爲 ${PROJECT_NAME } 項目構建信息</br>
<td>
<h3>
<font color="#CC0000">構建結果 - ${BUILD_STATUS}</font>
</h3>
</td>
</tr>
<div>
<table width="95%" cellpadding="0" cellspacing="0"
style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">
<tr>
<th><br />
<h2>構建信息</h2>
</th>
</tr>
<tr>
<td>
<ul>
<tr>
<td>
<ul>
<li>項目名稱 : ${PROJECT_NAME}</li>
<li>構建編號 : 第${BUILD_NUMBER}次構建</li>
<li>觸發原因: ${CAUSE}</li>
<li>構建狀態: ${BUILD_STATUS}</li>
<li>構建日誌: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>
<li>構建URL: <a href="${BUILD_URL}">${BUILD_URL}</a></li>
<li>測試報告: <a href="${PROJECT_URL}HTML_20Report">${PROJECT_URL}HTML_20Report</a></li>
<li>圖表展示: <a href="${BUILD_URL}performance">${BUILD_URL}performance</a></li>
</ul>
</td>
</tr>
</table>
</div>
</body>
</html>
如此我們的Jenkins構建就完成,點擊構建按鈕,將收到一個郵件通知,這裏附上我構建成功後的結果顯示界面:
可以看到結果中顯示了“HTML Report”和“Performance Trend”,這些就是我們進行構建後的前兩個操作生成的。
接着我們來看一下郵件顯示:
一切好像沒有什麼問題了,但是我就發現了兩個缺點:
a.這個測試結果看起來不夠直觀,要想查看詳細內容,每次還得點鏈接進去才能看,能不能直接把更詳細的測試結果以表格形式展示出來呢?
b.用Ant去運行總覺得不夠靈活,要運行的jmx文件是在build.xml中設置的。如果我需要修改,還得遠程連接服務器,找到build文件去修改,有沒有更好的方法呢?
答案當然是有的,包括怎樣實現短信發送,這裏先賣個關子,看我下篇博客咯~