[android]android自動化テスト十三のmonkeyRunner自動化フレームワーク
5510 ワード
1.MonkeyRunner自動化で発生した問題
一、元素座標の位置付けが悪い
二、コード多重化に不利
三、問題が発生して調整しにくい
四、大量の余剰コードをカプセル化していない
以上の4つの問題に対して、いくつかの自動化テストフレームワークを試みたが、うまくいかなかったが、成果を以下に示した.
1.あなたのアプリケーションでクリックしたIPを得ることができるアプリケーションを作成します.
例:
結果のエクスポート:
実行時に-oパラメータが入力されると、指定したファイルに結果が格納されます.
サポートされているイベント:
このアプリケーションはIDを持つアプリケーションにのみ適用され、本人の会社のAPKの多くはIDを持たないものが動的に生成されるため、この方法はあまり適用されません.
2.アプリケーションがほとんどのIDを持っている場合は、IDに基づいてレイアウト内の要素の座標位置(X,Y)を取得する第2のステップを実行します.
ここでexampleは例であり,srcではレイアウトツリーの解析およびパッケージングであり,このフレームワークはpythonのUnitTestに合わせて適用できる.
3.調式の問題は、第2部も完了したらpythonのloggingをインポートしてlog解析を行い、Eclipseにプロジェクトをインポートして調式を行うことができます.ここで唯一注意しなければならないのは、pythonの解釈ブロックをmonkeyrunnerに変更すればいいことです.
4.MonkeyRunnerスクリプトを1つ添付
一、元素座標の位置付けが悪い
二、コード多重化に不利
三、問題が発生して調整しにくい
四、大量の余剰コードをカプセル化していない
以上の4つの問題に対して、いくつかの自動化テストフレームワークを試みたが、うまくいかなかったが、成果を以下に示した.
1.あなたのアプリケーションでクリックしたIPを得ることができるアプリケーションを作成します.
$ ./andrec --help
Usage: andrec [options] apkfile
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-a ANDROID_SDK, --android-sdk=ANDROID_SDK
android sdk path
-i, --interact run in jdb interact mode
-p PORT, --port=PORT local debug port
-o OUTPUT, --output=OUTPUT
output file
-v, --verbose print verbose info
例:
$ ./andrec TestRecord.apk
preparing apk...
installing apk...
starting...
connecting debugger...
start recording...
click com.example.R.button1
click com.example.R.submit
click com.example.R.button2
click item 2 in view -1
show menu for item 4 in view -1
click menu item "Edit"
show menu for item 5 in view -1
click menu item "Delete"
click item 18 in view -1
back pressed
show menu
click menu item "New game"
show menu
click menu item "Help"
back pressed
^C
結果のエクスポート:
実行時に-oパラメータが入力されると、指定したファイルに結果が格納されます.
$ ./andrec -o test TestRecord.apk
.
.
.
^C
$ cat test
{"type": "click", "target": "com.example.R.button1"}
{"type": "click", "target": "com.example.R.submit"}
{"type": "click", "target": "com.example.R.button2"}
{"position": 1, "type": "click", "target": -1}
{"position": 3, "type": "menu", "target": -1}
{"content": "\"Edit\"", "type": "click"}
{"position": 5, "type": "menu", "target": -1}
{"content": "\"Delete\"", "type": "click"}
{"type": "back"}
{"type": "menu"}
{"content": "\"New game\"", "type": "click"}
{"type": "menu"}
{"content": "\"Help\"", "type": "click"}
{"type": "back"}
サポートされているイベント:
class Recorder(object):
def click(self, view):
print 'click', view
def change_text(self, view, text):
print 'text in view', view, 'changed to', text
def click_list_item(self, view, position):
print 'click item', position, 'in view', view
def show_list_item_context_menu(self, view, position):
print 'show menu for item', position, 'in view', view
def show_menu(self):
print 'show menu'
def click_menu_item(self, text):
print 'click menu item', text
def back(self):
print 'back pressed'
このアプリケーションはIDを持つアプリケーションにのみ適用され、本人の会社のAPKの多くはIDを持たないものが動的に生成されるため、この方法はあまり適用されません.
2.アプリケーションがほとんどのIDを持っている場合は、IDに基づいてレイアウト内の要素の座標位置(X,Y)を取得する第2のステップを実行します.
ここでexampleは例であり,srcではレイアウトツリーの解析およびパッケージングであり,このフレームワークはpythonのUnitTestに合わせて適用できる.
3.調式の問題は、第2部も完了したらpythonのloggingをインポートしてlog解析を行い、Eclipseにプロジェクトをインポートして調式を行うことができます.ここで唯一注意しなければならないのは、pythonの解釈ブロックをmonkeyrunnerに変更すればいいことです.
4.MonkeyRunnerスクリプトを1つ添付
# coding=UTF-8
import time
import string
import random
import os
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice
device = MonkeyRunner.waitForConnection(61)
device.wake()
ImagePath="/home/eamon/tmp_tmp/"
device.removePackage("cn.opda.a.phonoalbumshoushou")
device.installPackage("DXAndroidOptimizer_DXD_2.6.0.425.apk")
time.sleep(5)
device.startActivity(action='android.intent.action.MAIN',component='cn.opda.a.phonoalbumshoushou/cn.com.opda.android.mainui.MainActivity')
time.sleep(10)
#
device.drag((110,400),(10,400),0.1,5)
time.sleep(5)
device.touch(90,140,MonkeyDevice.DOWN_AND_UP)
time.sleep(2)
device.touch(160,240,MonkeyDevice.DOWN_AND_UP)
time.sleep(5)
device.takeSnapshot().writeToFile(ImagePath+"cpu.png","png")
device.press("KEYCODE_BACK",MonkeyDevice.DOWN_AND_UP)
time.sleep(5)
device.touch(160,300,MonkeyDevice.DOWN_AND_UP)
device.takeSnapshot().writeToFile(ImagePath+"memory.png","png")
device.press("KEYCODE_BACK",MonkeyDevice.DOWN_AND_UP)
#
device.touch(200,160,MonkeyDevice.DOWN_AND_UP)
time.sleep(5)
device.takeSnapshot().writeToFile(ImagePath+"functionCheckButton.png","png")
time.sleep(5)
device.touch(160,240,MonkeyDevice.DOWN_AND_UP)
time.sleep(5)
device.takeSnapshot().writeToFile(ImagePath+"functionBlack.png","png")
time.sleep(5)