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();}
0 0
原创粉丝点击