安卓自动化业务层测试接口
阅读前需知的基本知识:
1. uiautomator 脚本的执行通过 shell 命令调起执行,向执行的方法传递参数也是通过 shell 命令
2 调起的执行方法所在类必须要继承 UIATestCasel 类
3. 调起方法内部,职能通过 bundle 获取外部传递的参数,而不是通过函数参数的方式传递
抛出问题:
在新的自动化测试框架中,业务层属于 API 层级,非继承于 UIATestCasel 类 (com.android.uiautomator.testrunner.UiAutomatorTestCase)
1. 业务 API 不支持外部通过命令或其他方式执行进行业务 API,进行测试;如果每次都构造 Case 来进行业务 API 的测试,严重影响业务 API 的测试开发效率
2. uiautomator 执行只支持通过 shell,通过 bundle 传递参数和获取参数;不支持业务 API 的直接传参方式
3. shell 执行 uiautomator,传递参数只能传递字符串;而业务 API 的参数是多变的,包括 int boolean string String[] 等
解决方案:
1. 针对第一个问题,业务 API 外部无法直接调起问题;使用 java 反射机制实现业务 API 的外部调起:
新建一个统一的业务 API 访问类 Agent,继承 UIATestCasel 类,使其可以通过外部 shell 命令调起
在外部通过命令传递 object 和 method 这两个参数到 bundle,在 Agent 类 entry 方法中获取 bundle 并解析出要测试的 API 的类路径和方法名
根据类路径和方法名,通过反射在本地调用
2. 针对 uiautomator 执行,传递参数只能传递字符串,不满足业务 API 的参数个数和类型不定问题;采用添加中间层,处理后传递到业务层 API
首先根据业务 API 方法,获取其参数类型列表
根据每个参数的类型和参数的序号({index}),把 bundle 中 ‘p{index}’ 对应的 value 的值转化成对应类型
把转化后的所有参数放到一个对象里,然后通过反射加载到业务 API
Demo: adb shell uiautomator runtest IQiyiAppAutomatedTest.jar -c com.qiyi.library.base.Agent#entry -e object ReaderBusiness -e method runtest0 -e p0 [0,1,3] -e p1 [rer,re,re]
3. bundle 中的值通过 shell 命令传递,shell 命令中有些字符使用,通过自建转义字符列表的方式来解决
bundle 在使用前,进行一次预处理,把当中的自定义转义字符替换掉;现在有的转义字符见下表
字符 对应的转义字符
空格 {{SPACE}}
空字符 {{EMPTY}}
单引号 {{SINGLEQUOTES}}
双引号 {{DOUBLEQUOTES}}
左括号 {{LEFTPARENTHESIS}}
右括号 {{RIGHTPARENTHESIS}}
Demo: adb shell uiautomator runtest IQiyiAppAutomatedTest.jar -c com.qiyi.library.base.Agent#entry -e object ReaderBusiness -e method runtest1 -e p0 {{LEFTPARENTHESIS}}who{{LEFTPARENTHESIS}}
CODE LINK: http://files.cnblogs.com/files/udld/Agent_Uiautomator.rar