1. 程式人生 > >使用Jenkins郵件配置在郵件中輸出測試執行詳細結果

使用Jenkins郵件配置在郵件中輸出測試執行詳細結果

Jenkins的郵件配置還是比較人性化的,提供了很多令牌供使用者獲取特定的內容並輸出。如: 

•     ${BUILD_NUMBER} -顯示當前構建的編號。

•     ${BUILD_STATUS} -顯示當前構建的狀態(失敗、成功等等)

•     ${BUILD_URL} -顯示當前構建的URL地址。

•     ${CHANGES, showPaths, format, pathFormat} -顯示上一次構建之後的變化。 

等等。不過這些令牌大多都是跟構建相關的,單元測試時我們最關注的測試結果反而沒有對應的輸出,比如:   
 

[getlibpath] Library dependencies:

[getlibpath] No Libraries

     [echo] Running tests...

     [echo] Running tests ...

     [exec]

     [exec] com.sg.sledog.test.SMSTest:

     [exec] Failure in testStart:

     [exec] junit.framework.AssertionFailedError: expected: but was:

     [exec]       at com.sg.sledog.test.SMSTest.testStart(SMSTest.java:289)

     [exec]       at java.lang.reflect.Method.invokeNative(Native Method)

     [exec]       at android.test.InstrumentationTestCase.runMethod(InstrumentationTestCase.java:204)

     [exec]       at android.test.InstrumentationTestCase.runTest(InstrumentationTestCase.java:194)

     [exec]       at android.test.ActivityInstrumentationTestCase2.runTest(ActivityInstrumentationTestCase2.java:186)

     [exec]       at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:169)

     [exec]       at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:154)

     [exec]       at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:529)

     [exec]       at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1584)

     [exec]

     [exec] Test results for JUnitReportTestRunner=.F

     [exec] Time: 11.73

     [exec]

     [exec] FAILURES!!! 

[exec] Tests run: 1, Failures: 1, Errors: 0 

這是一次單元測試的控制檯輸出,只能看到測試失敗了,哪裡失敗、失敗的原因卻無從得知。 比較容易想到的解決方案是把單元測試的執行結果在執行時記錄下來,儲存到檔案裡,再把檔案內容輸出到郵件。  
這個方法不錯,但是有以下兩個待解決的問題: 

1.    執行結果是儲存在手機裡的,而jenkins是執行在電腦上的, jenkins怎樣獲取執行結果?

2.    獲取的結果怎樣正確輸出到郵件裡?

第一個問題的解決要依靠萬能的ant指令碼。在ant指令碼中有一段:  

<echo>Downloading XML test report...</echo>
              <exec executable="${adb}" failonerror="true">
              <arg line="${adb.device.arg}"/>
              <arg value="pull" />
              <arg value="/data/data/${tested.project.app.package}/files/junit-report.xml" />
              <arg value="junit-report.xml" />
              </exec>


   這個是用來獲取被測程式data/data/  /files 目錄下的 junit-report.xml檔案的,程式碼很直觀,可以看到用的是adb pull的方法。 如果能把測試結果檔案也寫入被測程式的 data/data/ /files目錄下,再用相同的辦法獲取,第一個問題就解決了: 
mActivity.openFileOutput(fileName, 0)   
其中mActivity是被測程式的主activity. 0表示模式為private。 執行測試工程,會發現在被測應用的data/data/ /files目錄下多了名為filename的檔案。    
 然後在測試工程的build.xml里加上:  

<echo>Downloading test result...</echo>
              <exec executable="${adb}" failonerror="true">
              <arg line="${adb.device.arg}"/>
              <arg value="pull" />
              <arg value="/data/data/${tested.project.app.package}/files/testResult.txt" />
              <arg value="testResult.txt" />
              </exec> 

   
如果有多個檔案,就重複上面的步驟。在jenkins裡執行測試工程,就會發現這些檔案被down到了jenkins workspace中測試工程的根目錄。  
   
如何把這些檔案的內容輸出到郵件內容中呢?jenkins提供了一個很好的令牌,${FILE, path=”PATH”} -包含一個指定檔案的內容 。注意,PATH 是工作區目錄的相對路徑。這樣就把檔案匯入了郵件中。  

新的問題出現了,匯入的檔案內容在郵件中顯示為亂碼,修改jenkins郵件的字符集也無濟於事。  
原因是因為jenkins的郵件是按GBK格式傳送的,如果檔案格式為utf-8,在郵件中就會出現轉碼錯誤。但測試發現,如果檔案本身是GBK編碼的,檔案內容輸出就是正常的。  
這樣解決問題的思路就很明顯了,就是在檔案生成時,就把裡面的內容以GBK格式輸出。實現程式碼為: 

writeFile(String fileName, String content, String charset) {
              try {
                     Writer writer = new OutputStreamWriter(mActivity.openFileOutput(fileName, 0), charset);
                     writer.write(content);
                     writer.close();
            return true;
              } catch (IOException ioex) {
                     return false;
              }
       }

使用時 writeFile("allResult.txt", allResult, "GBK");