0
我正在为我的android应用程序投掷jenkins运行我的junit测试。如果测试失败,我只能看到堆栈跟踪,这有时无法帮助我理解为什么我的测试失败。我在代码中添加了一些日志,所以我可以在我的本地机器上运行它们时调试我的测试,但我希望能够在Jenkins控制台输出中查看这些日志,以便我可以了解当我的测试失败时出了什么问题。如何在jenkins的控制台日志中看到我的测试日志
我正在为我的android应用程序投掷jenkins运行我的junit测试。如果测试失败,我只能看到堆栈跟踪,这有时无法帮助我理解为什么我的测试失败。我在代码中添加了一些日志,所以我可以在我的本地机器上运行它们时调试我的测试,但我希望能够在Jenkins控制台输出中查看这些日志,以便我可以了解当我的测试失败时出了什么问题。如何在jenkins的控制台日志中看到我的测试日志
这是一个老问题,但我找到了解决方案。 我将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();
}
}
我希望它的作品,因为我适应我的代码试图解释它的简单方法。
当您在本地环境中运行测试时,您是否看到日志?(您的IDE控制台或终端) –
是的。我可以在Android工作室的Android Monitor控制台上看到它。 – Benjo
很难说出什么问题,但作为一项解决方案,您可以将日志打印到日志文件中,然后只需“cat/type”该文件。 –