2016-06-21 2 views
0

내 jroid를위한 내 jroid 테스트를 실행하고 있습니다. 테스트가 실패 할 경우 스택 트레이스 만 볼 수 있는데, 때로는 내 테스트가 실패한 이유를 이해하는 데 도움이되지 않습니다. 로컬 컴퓨터에서 실행할 때 테스트를 디버그 할 수 있도록 코드에 일부 로그를 추가했지만 테스트 결과가 잘못되었을 때 Jenkins 콘솔 출력에서 ​​로그를 볼 수 있기를 원했습니다.jenkins의 콘솔 로그에 테스트 로그가 표시되는 방법

+0

로컬 환경에서 테스트를 실행할 때 로그가 표시됩니까? (IDE 콘솔 또는 터미널) –

+0

예. 내 안드로이드 스튜디오 안드로이드 모니터 콘솔에서 볼 수 있습니다. – Benjo

+0

문제가 무엇인지 알기는 어렵지만, 해결 방법은 로그 파일에 로그인 한 다음이 파일을 "cat/type"으로 인쇄하는 것입니다. –

답변

0

낡은 질문이지만 해결책을 찾았습니다. Log 클래스를 사용자 정의 클래스 (Logger)로 감 쌉니다. LOG_LINES으로 CopyOnWriteArrayList 및 LogLine 로그 데이터의 홀더

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; 
     } 
    } 

: 같은

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

그런 다음 로그인 외모 :

그런 다음 내가 좋아하는 로그 방법을 포장.

마지막으로 사용자 정의 테스트 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(); 
    } 
} 

나는 그것이 내가 간단한 방법으로 그것을 설명하려고 내 코드를 적용하기 때문에 작동 바랍니다.

관련 문제