Android自动化测试在多种屏幕下的注意事项
作者:网络转载 发布时间:[ 2012/10/26 10:19:07 ] 推荐标签:
在编写Android自动化测试用例的时候,可能会碰到这样的情况,在一个Android版本的模拟器上运行的好好的测试用例,在另一个版本的Android模拟器上运行不正常了。基本症状是,在测试代码里获取一个View的实例,然后通过robotium的click函数点击它:
View view = ... // 在代码里获取要点击的View的实例
solo.click(view); // 然后点击它。
如果是在模拟器上执行的话,因为创建模拟器的时候可以指定皮肤,模拟器也有不同的版本,可能你会发现在一个皮肤(或者模拟器版本)上运行的好好的,在另一个皮肤(或版本)上发生点不到控件的问题。
发生这种情况,主要是由于Android支持多种屏幕造成的,不同屏幕的像素密度有可能不一样,而这会导致同样(像素)大小的控件,在低密度屏上看起来要大一些,而在高密度屏上看起来要小一些,如下图所示:
而有些程序,为了避免发生类似上面的情况,会采用密度无关像素的方式指定控件的大小 – 即使用dp单位。因为dp单位采用中等密度屏幕的每英寸的像素个数作为基线,当程序在高密度或低密度屏上运行时,android系统会自动去根据基线来计算并缩放控件,以便相同的控件在不同密度的屏幕上显示的物理大小是一致的,如下图所示:
这样其实给咱们自动化测试带来了一些问题,在Android官方文档里举了一个例子-当然是开发方面的例子:假如一个程序设置了手指在屏幕上至少移动了16个像素才算是滑动,那么在基准屏上,手指需要移动 16像素 / 160 dpi,也是十分之一英寸(或2.5毫米);而如果在高密度屏上面,用户只需要移动16像素 / 240 dpi,也是十五分之一英寸(或1.7毫米)。高密度屏上需要移动的距离远比低密度屏短,给用户的感觉是高密度屏上对手势更敏感些。
放在自动化测试的点击上面,针对使用DPI指定大小的控件,由于在显示的时候会根据屏幕的密度来缩放控件,在模拟点击操作的时候,因为robotium是复用instrumentation类来向android系统发送点击操作这个消息,消息里面自带了点击位置的x,y坐标。Robotium里面点击控件的逻辑是这样的:
1、首先获取要点击的控件View的实例。
2、通过View. getLocationOnScreen函数获取控件左上角在屏幕上的坐标,坐标的单位是像素。
3、通过View.getWidth和View.getHeight函数获取控件的大小。
4、一般来说是点控件的中间位置,这个位置由控件的左上角的坐标和控件大小计算得出,这个单位也是像素。
5、原来robotium得到点击位置的x,y坐标之后,直接发送android消息了:
1: public void clickOnScreen(float x, float y) {
2: long downTime = SystemClock.uptimeMillis();
3: long eventTime = SystemClock.uptimeMillis();
4: MotionEvent event = MotionEvent.obtain(downTime, eventTime,
5: MotionEvent.ACTION_DOWN, x, y, 0);
6: MotionEvent event2 = MotionEvent.obtain(downTime, eventTime,
7: MotionEvent.ACTION_UP, x, y, 0);
8: try{
9: inst.sendPointerSync(event);
10: inst.sendPointerSync(event2);
11: sleeper.sleep(MINISLEEP);
12: }catch(SecurityException e){
13: Assert.assertTrue("Click can not be completed!", false);
14: }
15: }
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11