第一、引言
本測試應用是2014年剛爲自己負責的京東用戶體系自動化最小投入產出的實踐,實現了用戶體系業務線自動化從“無到有”的突破,時過5年在梳理電腦存檔的時候發現該文章,花幾分鐘梳理一下分享給大家,希望能給大家帶來思路上的參考,我以此紀念回味曾經的思路和努力的腳步;
該實踐爲服務用戶組部分功能測試,旨在提高測試效率,解放人力資源,能及時性的得到線上問題反饋,提供分析測試結果條件,能快速定位問題;並對發現的問題和缺陷進行記錄,形成log文檔,以驗證該系統是否符合需求說明書的要求,同時準備進行應用驗收;
1.1需求描述
- 用戶登錄後,進入“我的京東”,不斷刷新該頁面,檢查用戶信息顯示是否正確;
- 618交易研發部需要實時測試的公網鏈接;
1.2添加用例的目的
- 通過測試應用覈對登錄用戶信息;
- 由於公網鏈接比較多,手工測試比較費時,通過測試應用驗證公網鏈接,節省時間,反饋問題及時,提高工作效率;
- 把測試應用添加到jenkins 中,不間斷的自動測試;
二、編寫覈對用戶信息測試用例
2.1搭建環境
2.1.1安裝所需要的軟件
- 安裝jdk1.6 32位
- 安裝springsourece 32 位
- 安裝svn 64位
- 安裝Maven 3.1.1
【說明】軟件安裝過程,不做具體描述。
2.1.2 導入工程
- 根據svn地址:http://10.10.224.40/svn/Test-Dep/AutoTestCase/JAVA/httpTestCoolies,下載代碼
- 把httpTestCoolies maven工程導入springsourece ,導入步驟如下:
- 選擇“file”下 “import”,顯示如下圖:
- 選擇上圖,“Maven”下“Existing Maven Projects”,如下圖:
- 點擊上圖“Next”按鈕,選擇要導入“httpTestCoolies ”工程pom.xml所在的根目錄,如下圖:
- 點擊上圖“Finish”按鈕,已成功導入工程
2.1.3 配置Maven
- 選擇“Window”下“Preferences”,如下圖:
- 打開上圖中“Maven”,如下圖:
- 選擇“Maven”下“Installations”,添加“Maven”安裝所在的路徑,點擊“ok”如下圖:
【說明】上圖中,選擇上面所添加的maven路徑後,下面標紅處會自動生成,不需要自己選擇。
- 選擇“Maven”下“User Settings”,如下圖:
【說明】上圖標紅處,settings.xml是在C:\Users\Administrator\.m2下是不存在,需要手動創建。創建完成後,需要添加內容,建議最好從搭建好環境同事拷貝settings.xml文件。C:\Users\Administrator\.m2\repository 已存在,不需要自己創建。
2.2測試應用
- 編寫流程
- 用戶先登錄,登錄失敗(如果連接超時,重連一次),直接返回併發送郵件,郵件內容爲詳細失敗信息;
- 登錄成功後,根據userNameUrl = http://home.jd.com/myjd_index.action,獲取暱稱。根據dataNumUrl = http://home.jd.com/myjd_getDataCount.action ,獲取京豆、禮品卡、餘額、優惠劵;
- 獲取的值和已存在的值進行比對,比對結果都相等,則返回ture,否則false併發送郵件通知相關人員,郵件內容爲:主題+測試結果詳細(如果有錯誤則爲錯誤詳細信息,報告異常);
2.3 遇到的問題
2.3.1搭建環境
- 在win7 64位機器上安裝了32位svn ,不能用。(解決辦法:卸載32位的svn,重新安裝64位svn)
- 在win7 64位機器上安裝32 位的springsourece 時,選擇64位的jdk1.6 報錯。(解決辦法:卸載64位的jdk1.6,重新安裝32位的jdk1.6)
- 如果用eclipse 需要安裝Maven插件;
2.3.2 配置Maven
- 在springsourece中配置Maven後,pom.xml報錯。錯誤信息如下:
Failure to transfer org.apache.maven.plugins:maven-resources-plugin:jar:2.5 from http://repo.maven.apache.org/maven2
was cached in the local repository, resolution will not be reattempted until the update interval of central has elapsed or
updates are forced. Original error: Could not transfer artifact org.apache.maven.plugins:maven-resources-plugin:jar:2.5
from/to central (http://repo.maven.apache.org/maven2): Remotely Closed [id: 0x015866bf, /10.12.217.35:56929 :>
repo.maven.apache.org/199.27.77.129:80]
報錯原因: C:\Users\Administrator\.m2\ settings.xml 文件內容不正確,導致的。
解決辦法:拷貝同事的setting.xml文件,替換原來的setting.xml文件。
2.4 優化測試應用
- 覈對多個登錄用戶信息
- 把已登錄用戶信息以參數的方式傳入(原因當用戶的優惠劵、京豆發生變化時,需要修改測試應用源碼)
三、編寫驗證公網鏈接測試用例
3.1測試應用
- 編寫流程
- 整理公網鏈接,哪些鏈接可以通過程序驗證
- 把整理後的公網鏈接,加入到List
- 通過循環逐步驗證每個鏈接
- 判斷鏈接是否有跳轉頁面,如果跳轉鏈接中含有“error.html”,發送郵件。
- 通過錯誤信息,區分公網鏈接屬於用戶、促銷、市場活動等
- 在運行過程中,錯誤信息,debug信息、INFO信息寫入日誌文件
- 通過定時器來實現隔多長時間運行一次該用例
【說明】上面5和6是在本地運行。如果通過jenkins運行,不需要5和6。
3.2 遇到的問題
- List 添加 的url 帶空格報錯,錯誤信息如下:
java.lang.IllegalArgumentException
at java.net.URI.create(URI.java:842)
at org.apache.http.client.methods.HttpGet.<init>(HttpGet.java:69)
at common.DoGetResponse.doGetResponse(DoGetResponse.java:17)
at Checker.CheckTicketCardUrl.getCheckTicketCardUrl(CheckTicketCardUrl.java:32)
at Checker.CheckInterface.getCheckInterFace(CheckInterface.java:111)
at common.StartTask.run(StartTask.java:31)
at java.util.TimerThread.mainLoop(Timer.java:512)
at java.util.TimerThread.run(Timer.java:462)
Caused by: java.net.URISyntaxException: Illegal character in query at index 71: http://quan.jd.com/getcouponcount.action?callback=51testing_&_345637334
at java.net.URI$Parser.fail(URI.java:2809)
at java.net.URI$Parser.checkChars(URI.java:2982)
at java.net.URI$Parser.parseHierarchical(URI.java:3072)
at java.net.URI$Parser.parse(URI.java:3014)
at java.net.URI.<init>(URI.java:578)
at java.net.URI.create(URI.java:840)
... 7 more
解決辦法:去掉url中的空格。
- 運行測試用例的過程中,發現有部分連接跳轉到錯誤頁面,是由於登錄用戶沒有開啓“支付密碼”。
解決辦法:開啓賬號支付密碼。
3.3優化測試應用
- url作爲參數傳入(考慮到以後可能運行某個公網鏈接,或者增加公網鏈接,不需要修改程序,就能實現)
四、jenkins部署實現
4.1 創建任務
- 通過瀏覽器http://10.10.224.136:3154/jenkins/,登錄jenkins,只有用戶登錄後,纔可以創建任務。
- 在 Jenkins主菜單點擊“新 Job”,出現如下圖:
鍵入任務名稱,選擇“Build a free-style software project”選項,點擊“OK”按鈕後,出現如下圖:
【說明】:
- Project名稱:項目(任務)名稱不能重複,後面通稱任務。
- 描述:主要對任務進行簡要說明。
- 丟棄舊的構建:是否保留過去的構建,默認是保留。
- 參數化構建過程:如果選擇此選項,Jenkins將允許您提供一套任意的鍵值對參數,它們會被傳遞到構建過程裏。配置的參數往往是構建運行環境中的一些環境變量。
- 停止構建:禁止此任務進行構建 ,默認是不禁止。
- 高級項目選項
- 安靜期:構建前等待時間
- 重試次數:從SCM倉庫中取出嘗試時間
- 該項目的上游項目正在構建時阻止該項目構建
- 該項目的下游項目正在構建時阻止該項目構建
- 試用自定義的工作空間:指定當前任務的workspace,否則 默認爲JENKINS_HOME的工作目錄
7.源碼管理
- CVS:從cvs庫中獲取
- None:手動方式
- SVN:從svn庫中獲取
備註:SVN通過“Add more locations”來添加多個工程。
8.構建觸發器
- Build periodically :設置構建頻率
- Poll SCM:設置從SCM庫中檢查源代碼是否更新。
備註:以上基本配置爲 分鐘 小時 天 月 星期,例如:每5分鐘進行 5 * * * *,每天12點和23整點進行 0 12,23 * * *
9.構建:支持多種方式,例如:shell(運行於linux環境)、Maven(支持Maven編譯)、Command(windows批處理命令)、ant等,如下圖:
下面以Maven舉例:
- Goals:maven命令。
10.構建後操作,主要說一下,郵件提醒;
備註:可以向多個人發送郵件,通過“;”進行分割;
點擊“保存”,新任務創建完成;
4.2 運行並監控構建
- 當配置完成一個任務後,回到主控制面板,如下圖:
- 上圖中右邊列表列舉現在已經配置的任務已經任務當前的狀態;
- 左邊有構建隊列,當有構件時,會把當前正在構建的隊列在上面進行列舉;
- 上圖右下角有RSS訂閱,支持訂閱全部、失敗和最後一次等;
- 手動構建一個任務
當一個任務配置完成後,可以採用手動構建和觸發器構建兩種方式,在項目驗證階段,可以通過手動觸發方式,點擊任務區的“立即構建”,會在“Build History”中出現以下進度條:
點擊進度條,可以進入到具體編譯過程,如下圖:
等構建完成後,可以看到任務構建的結果圖,如下圖:
- 任務構建狀態
- 構建狀態分一下幾種
|
項目從未構建,或者被禁用 |
|
構建失敗 |
|
構建成功,但包含錯誤 |
構建成功 |
2.構建穩定性,jenkins會基於一些後處理器任務構建發佈一個穩健指數(從0~100),越高越穩定
項目健康度高於80%。 |
|
項目健康度介於60%~80% |
|
項目健康度介於40%~60% |
|
項目健康度介於20%~40% |
|
項目健康度低於20% |
期待任務構建完成都處於 和
狀態。
4.3 遇到的問題
- 點擊“立即構建”後,在“Build History”中出現“連接中”。
產生原因:節點沒有啓動
解決方法:在節點管理頁面上,手動啓動該節點
- 構建失敗,錯誤信息如下:
[Dome-tester] $ mvn.bat -f pom.xml -DNODE_SLAVE=192.168.198.135-win7 clean install
FATAL: command execution failed
java.io.IOException: Cannot run program "mvn.bat" (in directory "C:\HudsonWorkSpace\workspace\Dome-tester"): CreateProcess error=2, ?????????
at java.lang.ProcessBuilder.start(Unknown Source)
at hudson.Proc$LocalProc.<init>(Proc.java:244)
at hudson.Proc$LocalProc.<init>(Proc.java:216)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:707)
at hudson.Launcher$ProcStarter.start(Launcher.java:338)
at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:932)
at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:899)
at hudson.remoting.UserRequest.perform(UserRequest.java:118)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:287)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at hudson.remoting.Engine$1$1.run(Engine.java:60)
at java.lang.Thread.run(Unknown Source)
Caused by: java.io.IOException: CreateProcess error=2, ?????????
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 17 more
Build step 'Invoke top-level Maven targets' marked build as failure
Recording test results
Sending e-mails to: [email protected] [email protected]
Notifying upstream projects of job completion
Finished: FAILURE
- 產生的原因:slave所在的機器沒有啓動“slave-agent.jnlp”,沒有辦法和master建立連接。
- 解決辦法:檢查slave所在的機器上是否安裝了jdk、maven,是否設置相應的環境變量,啓動“slave-agent.jnlp”。
五、總結
- 深入的瞭解用戶相關的業務內部設計邏輯;
- 熟悉了jenkins,從怎樣創建任務到運行並監控構建整個過程;
- 學習了同事解決問題的方法,增加溝通;
- 熟悉了添加測試用例的流程;
不足之處
- 編寫測試應用過程中有些異常沒有考慮到;
- 由於對jenkins不熟悉,遇到問題不能獨立解決,需提搞解決問題的能力;