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

原创 2017年04月15日 12:42:46

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();
	}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android自动化测试之UIAutomator(一)

Android程序开发迭代周期短,测试case重复度高,大部分case属于功能验证,常规的测试方法是测试人员按照预先写好的Case手顺进行测试,人工比对操作结果和预期结果。这种测试手段重复度高,效率低...
  • xzy2046
  • xzy2046
  • 2014年09月14日 13:55
  • 5086

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

1, 概述 Uiautomator顾名思义,就是UI自动化测试。主要用于仿真UI界面,包括单击,滑动,输入文本等操作。 主要分为三个子命令, rutest/dump/events 同其他大多数a...
  • u012439416
  • u012439416
  • 2017年04月15日 11:46
  • 328

安卓自动化测试之uiautomator(Python篇)四 Uisecltor

Uiautomator选择器,需要用到的类是UiSelector,对应的文件在init.py 这个类用于构造一个组合,传入一个字典参数 需要用到的工具是uiautomatorviewer.bat文...
  • meisailor
  • meisailor
  • 2017年08月20日 14:46
  • 181

Android进阶--android自动化测试python+uiautomator

android自动化测试常用的一些API,具体的请参考API 导入设备唯一一个设备from uiautomator import device as d导入具体设备from uiautomator i...
  • DG_summer
  • DG_summer
  • 2017年08月09日 20:54
  • 711

android自动化测试Uiautomator测试案例

1, 测试案例 如下是一个简单的测试案例代码,模拟了点击Home键回到主屏,然后点击所以应用按钮打开所有应用列表, 并滚动到时钟应用。打开时钟应用 并选择闹铃界面的第一个闹钟设置,修改该设置的开关...
  • u012439416
  • u012439416
  • 2017年04月15日 11:40
  • 661

Espresso 自动化测试(八)- SeekBar的测试

用过UiAutomator的同学其实都应该清楚,SeekBar是一个相当大的痛点,因为我们能够做到最多的就是获取到SeekBar的坐标,再来点击相应的一个坐标。那么问题来了。我根本就不知道我点击的结果...
  • qq744746842
  • qq744746842
  • 2016年02月16日 09:14
  • 1463

uiautomator自动化测试

module:appapply plugin: 'com.android.application' 2 3 android { 4 compileSdkVersion 23 5 ...
  • qq_26818085
  • qq_26818085
  • 2016年12月05日 01:34
  • 799

Uiautomator自动化测试编写和调试---小白入门超详细

Uiautomator建立自动化测试项目 1.建立java项目 (1)选择File-New-JavaProject (注意:是java proect) (2)输入Project Name 输入P...
  • gld824125233
  • gld824125233
  • 2016年10月21日 13:53
  • 3013

Android 自动化测试UiAutomator 视频精讲

Android 自动化测试UiAutomator 视频精讲,带你详细学习Android 自动化测试 全套视频精讲推荐学习 https://ke.qq.com/course/274357&from_...
  • u012861732
  • u012861732
  • 2015年04月02日 20:12
  • 1226

在Android Sudio中使用Uiautomator 自动化测试

在AS中自动化执行计算器,比如:7+1 =8 1.AS版本是1.2.2 2.SDK Manager需要安装Android Support Repository,没有安装的需要自己去下,如图: 【...
  • wyh520java
  • wyh520java
  • 2017年01月22日 13:20
  • 313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android自动化测试Uiautomator源码分析之五
举报原因:
原因补充:

(最多只允许输入30个字)