android自动化测试Uiautomator源码分析之五

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 + ":");
		else
			getWriter().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();
	}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012439416/article/details/70183790
个人分类: ---【自动化测试】
想对作者说点什么? 我来说一句

android测试

2015年09月20日 391KB 下载

没有更多推荐了,返回首页

不良信息举报

android自动化测试Uiautomator源码分析之五

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭