文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

移动设备Android平台自动化测试方法

2022-06-06 13:00

关注

   在编写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: }

  由于所有的坐标位置都是以像素计算的,没有考虑到缩放的情形,所以在不同密度的屏幕上会发生点击错位的情况。

  为了修复这个问题,解决方案是获取当前屏幕的密度和对dpi计算大小的控件的缩放比例,然后恢复原始的比例再发送点击消息:

  1: // 需要传递要点击的控件View的实例

  2: public void clickOnScreen(View view, boolean longClick, int time) {

  3: if(view == null)

  4: Assert.assertTrue("View is null and can therefore not be clicked!", false);

  5: int[] xy = new int[2];

  6:

  7: // 获取控件在屏幕上的位置 – 如果是dpi计算大小的控件,这个位置是缩放后的位置

  8: view.getLocationOnScreen(xy);

  9:

  10: // 获取控件的大小,并且计算出点击的控件中点位置

  11: final int top = view.getTop();

  12: final int viewWidth = view.getWidth();

  13: final int viewHeight = view.getHeight();

  14: float x = xy[0] + (viewWidth / 2.0f);

  15: float y = xy[1] + (viewHeight / 2.0f);

  16:

  17: // 计算缩放比例,将要点击的x, y坐标恢复到缩放前的情况。

  18: Activity activity = activityUtils.getCurrentActivity();

  19: DisplayMetrics rdm = activity.getResources().getDisplayMetrics();

  20: DisplayMetrics wdm = new DisplayMetrics();

  21: activity.getWindowManager().getDefaultDisplay().getMetrics(wdm);

  22: x *= wdm.scaledDensity / rdm.scaledDensity;

  23: y *= wdm.scaledDensity / rdm.scaledDensity;

  24:

  25: // 后再发送Android点击消息

  26: if (longClick)

  27: clickLongOnScreen(x, y, time);

  28: else

  29: clickOnScreen(x, y);

  30: }


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯