被测试手机:Android6.0,非root,须要考虑动态权限的处理。
控制程序:对多台手机进行群控,使每个手机自己进行测试流程,并返回执行结果(可能是象征性的结果)。
一.示例设计
1.《让微信自动加好友》
首先,有几个陌生的微信号,
然后,将微信号发给不同的手机,
接着,每个手机去自动切换Activity点击目标控件搜索微信号加好友,
下一步,手机再接收下一个微信号重复查找加好友,
最后,全部手机处理完毕后汇总,结束程序。
2.技术方案(Java)
手机和电脑通过usb连接。
首先,手机端基于UiAutomator2开发测试app,其中实现加好友的脚本,
然后,在电脑上开发控制程序,通过adb shell向手机发指令,启动测试脚本。
UiAutomator2
这里使用UiAutomator2进行非root下的执行测试,关于它就不介绍了。
若干关键api:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation(); Context context = instrumentation.getTargetContext().getApplicationContext(); UiDevice device = UiDevice.getInstance(instrumentation); // 拿到模拟器 Bundle bundle = InstrumentationRegistry.getArguments(); String value = bundle.getString("arg"); // 接收从控制点adb指令发来的参数,arg是参数的key Boolean withOrWithout = device.wait(Until.hasObject(By.textContains("添加朋友")), 5000); // 等待界面上出现带有字样“添加朋友”的控件,等待5秒。withOrWithout为true表示等到了,否则就是没有出现 device.wait(Until.hasObject(By.res("com.tencent.mm", "jh")), 5000); // 等待界面上出现其在布局文件中ID为“jh”的控件。这个ID可以使用uiautomatorviewer工具获取 UiObject2 object = device.findObject(By.textContains("添加朋友")); object.click(); // 查找带有字样“添加朋友”的控件,模拟点击这个控件 object.setText("TextView或EditText可以set文本"); UiScrollable listViewObject = new UiScrollable(new UiSelector().className("android.widget.ListView")); // 获取界面上的ListView,多个ListView的话会取从屏幕底部找到的第一个 String targetString = "接受"; UiObject targetObject = device.findObject(new UiSelector().textContains(targetString)); // UiAutomator1的方式查找控件,UiScrollable不支持UiAutomator2进行scrollIntoView try { hasStartChatObject = listViewObject.scrollIntoView(targetObject); // 这个总是从listview最底部向上滚动查找,每找到一个匹配项就停止 } catch (UiObjectNotFoundException e) { e.printStackTrace(); } try { Rect bounds = targetObject.getBounds(); // 获取控件的左上角和右下角坐标,相对于屏幕左上角(0,0)。targetObject是UiObject1,所以要显式处理异常 int clickY = bounds.centerY(); // 控件自身的垂直中线,centerX就是自身水平中线 int clickX = device.getDisplayWidth() / 2; // device.getDisplayWidth()获取手机屏幕宽度 device.click(clickX, clickY); // 模拟点击屏幕的某个点 } catch (UiObjectNotFoundException e) { e.printStackTrace(); } |
adb shell
常用adb指令
1 2 3 4 5 6 7 8 9 |
adb devices # 获取设备号 adb -s 设备号 push /Users/root/app-debug.apk /data/local/tmp/com.cuiweiyou.uiautomator20 # 向指定手机发指令 adb -s 设备号 -d shell pm install -t -r '/data/local/tmp/com.cuiweiyou.uiautomator20' ; pm install -t -r '/data/local/tmp/com.cuiweiyou.uiautomator20.test' # 指定手机连续执行两个指令 adb -s 设备号 shell am instrument -w -r -e arg_key 自定义数据 -e debug false -e class 'com.cuiweiyou.uiautomator20.TestUIAutomator200#testAddFriend' com.cuiweiyou.uiautomator20.test/android.support.test.runner.AndroidJUnitRunner #-e arg_key 自定义数据 即向手机发一个自定义参数,手机通过“arg_key”获取。“testAddFriend”即手机上的测试脚本 |
群控的处理
adb指令是阻塞的,所以不能向手机A发了指令又向手机B发。但通过子线程可以同时执行多个adb指令,所以,为每个手机指令开辟一个子线程就能实现多个手机同时进行测试用例。
Rxjava是非常理想的方式,异步开始,同步结束。flatMap函数可以异步开始多个任务,每个任务开始一个手机的测试指令。
end
声明
本文由崔维友 威格灵 cuiweiyou vigiles cuiweiyou 原创,转载请注明出处:http://www.gaohaiyan.com/2316.html
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设