使用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脚本中有一段:  

Downloading XML test report...
              
              
              
              
              
              


   这个是用来获取被测程序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里加上:  

Downloading test result...
              
              
              
              
              
               

   
如果有多个文件,就重复上面的步骤。在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");

你可能感兴趣的:(jenkins,单元测试)