2012-05-08 2 views
5

Я запускаю автоматическое тестирование с использованием эмулятора Android, управляющего приложением с помощью сценария Monkey, написанного на Python. Сценарий копирует файлы на эмулятор, нажимает кнопки в приложении и реагирует в зависимости от действий, которые запускает программное обеспечение во время его работы. Сценарий должен запускать цикл несколько тысяч раз, поэтому у меня есть это в цикле, чтобы запустить инструмент adb, чтобы скопировать файлы, запустить действия и посмотреть, как реагирует программное обеспечение, вызвав метод getProperty на устройстве с помощью параметр «am.current.comp.class». Так вот это очень упрощенная версия моего сценария:Android MonkeyRunner иногда выдает исключения

for target in targets: 
    androidSDK.copyFile(emulatorName, target, '/mnt/sdcard') 

    # Runs the component 
    device.startActivity(component='com.myPackage/com.myPackage.myactivity') 

    while 1: 
     if device.getProperty('am.current.comp.class') == 'com.myPackage.anotheractivity': 
      time.sleep(1) # to allow the scree to display the new activity before I click on it 
      device.touch(100, 100, 'DOWN_AND_UP') 
      # Log the result of the operation somewhere 
      break 

     time.sleep(0.1) 

(androidSDK небольшой класс я написал, что оборачивает некоторые вспомогательные функции для копирования и удаления файлов с помощью ADB инструмента).

В случаях сценарий аварий с одним из ряда исключений, например (я уезжаю из полной трассировки стека)

[com.android.chimpchat.adb.AdbChimpDevice]com.android.ddmlib.ShellCommandUnresponsiveException 

или

[com.android.chimpchat.adb.AdbChimpDevice] Unable to get variable: am.current.comp.class 
[com.android.chimpchat.adb.AdbChimpDevice]java.net.SocketException: Software caused connectionabort: socket write error 

Я прочитал, что иногда подключение сокета к устройству становится нестабильным и может потребоваться перезапуск (полезный сервер запуска и сервер adb kill-server).

Проблема, с которой я сталкиваюсь, заключается в том, что инструменты бросают исключения Java (Monkey работает в Jython), но я не уверен, как они могут быть захвачены из моего сценария Python. Я хотел бы иметь возможность определить точную причину сбоя внутри сценария и восстановить ситуацию, чтобы я мог продолжить свои итерации (например, восстановить соединение, например, повторить инициализацию моего устройства с помощью другого вызова для MonkeyRunner.waitForConnection достаточно?).

Любые идеи?

Большое спасибо, Alberto

EDIT. Я думал, что я упомяну, что я обнаружил, что можно поймать Java-специфических исключений в сценарии Jython, если кто-нибудь это нужно:

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 
+0

Не уверен, точное как это происходит в Jython, но в Python возможно переопределить sys.excepthook и получить информацию о неперехваченных исключениях. Дайте мне знать, если это будет полезно в вашем случае, и я отправлю его в качестве ответа. http://stackoverflow.com/questions/6234405/logging-uncaught-exceptions-in-python/6234491#6234491 – Jacinda

+0

Это звучит очень интересно, хотя я не работаю над этой областью кода уже несколько месяцев, ve забыли все это :-) –

+0

Прохладный. Дайте мне знать, работает ли поведение переопределения аналогично CPython или нет. – Jacinda

ответ

0

можно поймать Java-специфических исключений в сценарии Jython :

from java.net import SocketException 

... 

try: 
    ... 

except(SocketException): 
    ... 

(Взято из редактирования OP на его вопрос)

0

Это работает для меня: device.shell ('выход') # Выход из оболочки

Смежные вопросы