2016-06-21 80 views
0

我正在为我的android应用程序投掷jenkins运行我的junit测试。如果测试失败,我只能看到堆栈跟踪,这有时无法帮助我理解为什么我的测试失败。我在代码中添加了一些日志,所以我可以在我的本地机器上运行它们时调试我的测试,但我希望能够在Jenkins控制台输出中查看这些日志,以便我可以了解当我的测试失败时出了什么问题。如何在jenkins的控制台日志中看到我的测试日志

+0

当您在本地环境中运行测试时,您是否看到日志?(您的IDE控制台或终端) –

+0

是的。我可以在Android工作室的Android Monitor控制台上看到它。 – Benjo

+0

很难说出什么问题,但作为一项解决方案,您可以将日志打印到日志文件中,然后只需“cat/type”该文件。 –

回答

0

这是一个老问题,但我找到了解决方案。 我将Log类包装成自定义类(Logger)。

然后我用像登录方法:

public static void d(String tag, String message) { 
    log(LOG.DEBUG, tag, message); 
} 

然后登录的样子:

private static void log(LOG logLevel, Object message) { 
     LOG_LINES.add(new LogLine(logLevel, tag, content)); 

     switch (logLevel) { 
      case ERROR: 
       Log.e(tag, content); 
       break; 
      case WARNING: 
       Log.w(tag, content); 
       break; 
      case INFO: 
       Log.i(tag, content); 
       break; 
      case DEBUG: 
       Log.d(tag, content); 
       break; 
      case VERBOSE: 
       Log.v(tag, content); 
       break; 
     } 
    } 

LOG_LINES一个的CopyOnWriteArrayList 和LogLine日志数据的持有人。

最后,通过使用自定义测试Runner,日志显示在Jenkins(在HTML报告中)中。只需将注释@RunWith(MyLoggingTestRunner.class)与添加到测试类:

public class MyLoggingTestRunner extends BlockJUnit4ClassRunner { 

    public MyLoggingTestRunner(Class<?> klass) throws InitializationError { 
     super(klass); 
    } 


    @Override 
    protected void runChild(final FrameworkMethod method, RunNotifier notifier) { 
     //override to override errors with logs 
     Description description = describeChild(method); 
     if (method.getAnnotation(Ignore.class) != null) { 
      notifier.fireTestIgnored(description); 
     } else { 
      run(methodBlock(method), description, notifier); 
     } 
    } 

    protected void run(Statement statement, Description description, RunNotifier notifier) { 
     EachTestNotifier eachNotifier = new EachTestNotifier(notifier, description); 
     eachNotifier.fireTestStarted(); 
     try { 
      statement.evaluate(); 
     } catch (AssumptionViolatedException e) { 
      eachNotifier.addFailedAssumption(e); 
     } catch (Throwable e) { 
      String throwableMessage = e.getMessage(); 
      String message = "\nLast logs :\n" + logsToString() + "\n\nStackTrace :\n" + e.getClass() + (TextUtils.isEmpty(throwableMessage) ? "" : ":" + throwableMessage); 

      try { 
       Field detailMessage = Throwable.class.getDeclaredField("detailMessage"); 
       detailMessage.setAccessible(true); 
       detailMessage.set(e, message); 
      } catch (Exception e1) { 
      } 
      eachNotifier.addFailure(e); 
     } finally { 
      eachNotifier.fireTestFinished(); 
     } 
    } 


    private static String logsToString() { 
     List<LogLine> logs = Logger.getLogs(); 
     StringBuilder logBuilder = new StringBuilder(); 
     String sep = ""; 
     for (LogLine logLine : logs) { 
      logBuilder.append(sep).append(logLine.toString()); 
      sep = "\n"; 
     } 
     return logBuilder.toString(); 
    } 
} 

我希望它的作品,因为我适应我的代码试图解释它的简单方法。

相关问题