我正在尝试使用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
方法并等待任意数量的时间,但这会大大减慢我的测试速度,因为我无法预测测试将持续多长时间。
答案 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()