移動設備Android平臺自動化測試方法

發表于:2012-11-12來源:博客園作者:知平軟件點擊數: 標簽:Android
移動設備Android平臺自動化測試方法.在編寫Android自動化測試用例的時候,可能會碰到這樣的情況,在一個Android版本的模擬器上運行的好好的測試用例,在另一個版本的Android模擬器上就運行不正常了

  在編寫Android自動化測試用例的時候,可能會碰到這樣的情況,在一個Android版本的模擬器上運行的好好的測試用例,在另一個版本的Android模擬器上就運行不正常了?;景Y狀是,在測試代碼里獲取一個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: }

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97