MonkeyRunner检测在测试执行期间发送ShellCommandUnresponsiveException

时间:2016-02-05 17:00:38

标签: android adb monkeyrunner

我正在尝试使用MonkeyRunner运行一些测试仪器,但我不知道怎么能让它像它应该的那样工作。经过几秒钟的测试后,执行将以ShellCommandUnresponsiveException停止,而测试实际上仍在设备上运行。

我的MonkeyRunner脚本如下:

# -*- coding: utf-8 -*-

# Imports the monkeyrunner modules used by this program
import os
from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice

# Connects to the current device, returning a MonkeyDevice object
device = MonkeyRunner.waitForConnection()

# Variables for commands
params = dict()
params['class'] = 'com.foo.test.TestCases#testMethod'

device.instrument('com.foo.test.test/android.test.InstrumentationTestRunner', params)

我得到了例外

160205 17:33:48.856:S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice] Error executing command: am instrument -w -r -e class com.foo.test.TestCases#testMethod com.foo.test.test/android.test.InstrumentationTestRunner
160205 17:33:48.856:S [MainThread] [com.android.chimpchat.adb.AdbChimpDevice] com.android.ddmlib.ShellCommandUnresponsiveException
...

我不明白的是,如果我尝试将所提到的命令与adb shell分开使用,那么它的工作完全正常并且测试通过,所以问题并非来自命令语法或正在执行的测试。

我尝试用device.instrument替换device.shell并输入命令,虽然它没有抛出异常,但它不会等待测试结束,然后再移动其余的代码。

问题可能来自我的测试使用Thread.sleep()等待一段时间的事实。我注意到其中一个睡眠时间非常短的测试似乎已经通过,并没有导致异常。 有没有办法防止这种异常发生?我想我可以切换到device.shell方法并等待任意数量的时间,但这会大大减慢我的测试速度,因为我无法预测测试将持续多长时间。

1 个答案:

答案 0 :(得分:0)

我认为您可以使用AndroidViewClient/culebra来实现目标。更具体地说,如果你看一下RunTestsThread class它几乎完全符合你的需要。 另请查看其用法,主要是在UiAutomatorHelper.__runtests中使用无超时创建AdbClient的方式:

# We need a new AdbClient instance with timeout=None (means, no timeout) for the long running test service
newAdbClient = AdbClient(self.adbClient.serialno, self.adbClient.hostname, self.adbClient.port, timeout=None)
self.thread = RunTestsThread(adbClient=newAdbClient, testClass=self.TEST_CLASS, testRunner=self.TEST_RUNNER)
if DEBUG:
    print >> sys.stderr, "__runTests: starting thread"
self.thread.start()