安卓自动化业务层测试接口
安卓自动化业务层测试接口
阅读前需知的基本知识:
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: https://files.cnblogs.com/files/udld/Agent_Uiautomator.rar