我在真实设备上使用 MonkeyRunner 进行Android自动化测试并运行隔夜测试。在其中一项广泛的自动化测试中,我发现只要MonkeyRunner截取屏幕截图,就会在设备内部系统上创建僵尸进程。在这里,当我运行adb shell ps
命令时,您可以在下面看到僵尸进程:
随着僵尸进程的增加,设备无响应并开始挂起。在MonkeyRunner中,截屏是唯一的验证方式。因此,当运行需要花费数小时的大量测试时,这个问题非常关键。
我还看到this说
framebuffer_service没有对产生的“等待” screencap进程完成。因此,孩子进程 成为僵尸进程。
并建议修改adb源代码本身。但是,我认为必须有任何其他解决方案,而不是深入到源代码。
任何想法/建议如何解决这个问题?
答案 0 :(得分:1)
我发现这很大程度上取决于Android版本和screencap
实现。
您可以运行此测试(在 KitKat 上成功,但在以前的版本上可能会失败)来验证您的情况。
#! /usr/bin/python -u
# -*- coding: utf-8 -*-
'''
Copyright (C) 2014 Diego Torres Milano
'''
import sys
import unittest
from com.dtmilano.android.adb.adbclient import AdbClient
VERBOSE = True
TIMES = 40
SLEEP = 0
def repeat(times):
def repeater(t):
def caller(*args):
for f in (t,)*times:
if VERBOSE:
sys.stdout.write('.')
f(*args)
if SLEEP:
time.sleep(SLEEP)
return caller
return repeater
class TakeSnapshotTests(unittest.TestCase):
def setUp(self):
self.device = AdbClient(serialno=serialno)
def tearDown(self):
pass
@repeat(TIMES)
def testSnapshot(self):
self.device.takeSnapshot(reconnect=True).save('/dev/null', 'PNG')
out = self.device.shell('ps | grep screencap').split('\n')
if len(out) > 1:
self.fail(out)
@staticmethod
def main():
unittest.main()
if __name__ == '__main__':
if len(sys.argv) >= 2:
serialno = sys.argv.pop(1)
else:
serialno = '.*'
TakeSnapshotTests.main()