android自动化测试Uiautomator源码分析之五
来源:互联网 发布:手机淘宝店招尺寸多少 编辑:程序博客网 时间:2024/06/05 14:54
6 WatcherResultPrinter
WatcherResultPrinter是UiAutomatorTestRunner的内部类,实现了ResultReporter接口,而ResultReporter继承于TestListener,
private interface ResultReporter extends TestListener { public void print(TestResult result, long runTime, Bundle testOutput); public void printUnexpectedError(Throwable t); }
private class WatcherResultPrinter implements ResultReporter {
该类在start进行实例化,主要是一些回调方法,打印测试结果等。
6.1 构造方法
public WatcherResultPrinter(int numTests) {mResultTemplate = new Bundle();mResultTemplate.putString(Instrumentation.REPORT_KEY_IDENTIFIER, REPORT_VALUE_ID);mResultTemplate.putInt(REPORT_KEY_NUM_TOTAL, numTests);mStream = new ByteArrayOutputStream();mWriter = new PrintStream(mStream); // 输出流 打印结果mPrinter = new SimpleResultPrinter(mWriter, false);}
SimpleResultPrinter也是UiAutomatorTestRunner的内部类,定义如下,
private class SimpleResultPrinter extends ResultPrinter implements ResultReporter {
除了实现ResultReporter接口,还继承了ResultPrinter类。
SimpleResultPrinter构造方法如下,
public SimpleResultPrinter(PrintStream writer, boolean fullOutput) { super(writer); mFullOutput = fullOutput; }
ResultPrinter也实现了TestListener接口,定义如下,
public class ResultPrinter implements TestListener {
ResultPrinter的构造方法如下,
public ResultPrinter(PrintStream writer) {fWriter= writer;}
ResultPrinter有一个变量fWriter,主要是打印测试结果。
PrintStream fWriter;
6.2 回调方法
startTest
startTest中会调用SimpleResultPrinter的startTest方法,实际上是调用其父类ResultPrinter的startTest方法,方法如下,
public void startTest(Test test) {getWriter().print(".");if (fColumn++ >= 40) {getWriter().println();fColumn= 0;}}
getWriter方法获取的是fWriter变量,然后调用其print打印 . 表示开始测试。
public PrintStream getWriter() {return fWriter;}
addError
addError中会调用ResultPrinter的addError方法,方法如下,
public void addError(Test test, Throwable t) {getWriter().print("E");}
打印 E 表示测试项测试错误
addFailure
addFailure中会调用ResultPrinter的addFailure方法,方法如下,
public void addFailure(Test test, AssertionFailedError t) {getWriter().print("F");}
打印 F 表示测试项测试失败
endTest
endTest中会调用ResultPrinter的endTest方法,方法如下,
public void endTest(Test test) {}
endTest什么也没有打印。
6.3 print
在UiAutomatorTestRunner 的start最后,测试完成之后,会调用WatcherResultPrinter的print方法打印测试结果以及测试用时等信息。
resultPrinter.print(testRunResult, runTime, testRunOutput);
WatcherResultPrinter的print方法如下,
@Override public void print(TestResult result, long runTime, Bundle testOutput) { mPrinter.print(result, runTime, testOutput); testOutput.putString(Instrumentation.REPORT_KEY_STREAMRESULT, String.format("\nTest results for %s=%s", getClass().getSimpleName(), mStream.toString())); mWriter.close(); // 关闭输出流 mAutomationSupport.sendStatus(Activity.RESULT_OK, testOutput); }
调用SimpleResultPrinter的print方法,
@Override public void print(TestResult result, long runTime, Bundle testOutput) { printHeader(runTime); // 打印头部 if (mFullOutput) { // 该值在构造时赋值false printErrors(result); printFailures(result); } printFooter(result); //打印尾部 }
这四个方法都是调用的父类的ResultPrinter对应方法。
protected void printHeader(long runTime) {getWriter().println();getWriter().println("Time: "+elapsedTimeAsString(runTime));}
protected void printErrors(TestResult result) {printDefects(result.errors(), result.errorCount(), "error");}
protected void printFailures(TestResult result) {printDefects(result.failures(), result.failureCount(), "failure");}
printFailures方法如下,打印错误或者失败测试项个数的详细信息。
protected void printDefects(Enumeration<TestFailure> booBoos, int count, String type) {if (count == 0) return;if (count == 1)getWriter().println("There was " + count + " " + type + ":");elsegetWriter().println("There were " + count + " " + type + "s:");for (int i= 1; booBoos.hasMoreElements(); i++) {printDefect(booBoos.nextElement(), i);}}
printFooter方法如下,
protected void printFooter(TestResult result) {if (result.wasSuccessful()) {getWriter().println();getWriter().print("OK");getWriter().println (" (" + result.runCount() + " test" + (result.runCount() == 1 ? "": "s") + ")");} else {getWriter().println();getWriter().println("FAILURES!!!");getWriter().println("Tests run: "+result.runCount()+ ", Failures: "+result.failureCount()+ ", Errors: "+result.errorCount());} getWriter().println();}
- android自动化测试Uiautomator源码分析之五
- android自动化测试Uiautomator源码分析之二
- android自动化测试Uiautomator源码分析之三
- android自动化测试Uiautomator源码分析之四
- android自动化测试Uiautomator源码分析之一
- Android自动化测试之UIAutomator
- Android自动化测试之UIAutomator
- android自动化测试CTS源码分析之五
- android自动化测试Uiautomator API分析之二
- android自动化测试Uiautomator API分析之一
- Android自动化测试之UIAutomator(一)
- android自动化测试之Uiautomator-UiDevice-API
- Android自动化测试之 Uiautomator-UiDevice-API
- Android自动化测试之UIAutomator(一)
- Android自动化测试UiAutomator之环境配置
- 自动化测试之uiautomator
- android uiautomator自动化测试
- UiAutomator android自动化测试
- JNI/NDK开发指南(十一)
- angularjsFileUpload+Springmvc上传文件
- 题目1068:球的半径和体积
- XGBoost Plotting API以及GBDT组合特征实践
- (转)高盛:老牌投行新生意,华尔街“谷歌”如何炼成?
- android自动化测试Uiautomator源码分析之五
- 如何定位和解决Andorid的内存溢出问题(大总结)
- 动态规划练习一 03:采药
- 安排教学计划
- HTML+CSS小白入门
- 迭代器测试
- Julia语言的介绍
- 关于银行家算法!
- (转)因巨亏而著名的10大魔鬼交易员