2016-06-21 12 views
0

私のアンドロイドアプリスロージェンキンのjunitテストを実行しています。テストが失敗した場合は、私のテストが失敗した理由を理解するのに役立たないスタックトレースしか見ることができません。自分のコードにいくつかのログを追加して、ローカルマシンでテストをデバッグできるようにしましたが、Jenkinsのコンソール出力でそれらのログを見たいので、テストが失敗したときに何がうまくいかなかったのか分かります。jenkinsのコンソールログにテストログが表示されるのはどうすればいいですか?

+0

ローカル環境でテストを実行するとログが表示されますか(IDEコンソールまたは端末) –

+0

はい。私はアンドロイドスタジオのAndroidモニターコンソールで見ることができます。 – 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レポート内)にログが表示されます。私は簡単な方法でそれを説明しようとする私のコードを適応するので、それが動作を期待

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

:単純にテスト・クラスに注釈@RunWith(MyLoggingTestRunner.class)を追加します。

関連する問題