这是一个老问题,但我找到了解决方案。
我将Log 类包装成一个自定义类(Logger)。
然后我将 Log 方法包装起来:
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();
}
}
我希望它有效,因为我修改了我的代码,试图以简单的方式解释它。