大量单元测试导致“Binder事务失败”而出现假死现象

3
我为我的Android应用编写了约400个单元测试。如果我按包运行测试,一切正常,所有的测试都通过了。但是,如果我尝试同时运行它们,最终(大约在360个测试之后),Android开始输出“!!! Failed Binder Transaction Errors !!!”。在大约10-20次这样的错误之后,我正在测试的应用程序的进程被杀死,而单元测试甚至没有完成。
我应该注意到,在此期间,Eclipse在控制台中报告“Collecting test information”。我认为这很奇怪,因为它显示正在运行测试,即使JUnit UI没有反映出来。当一切正常时,在“Collecting test information”阶段,我看到测试运行,然后JUnit UI出现,然后再次运行所有测试(通过阅读logcat知道)。那是(我想)一个单独的问题,但如果有人知道这是关于什么的,我觉得我应该提一下。
根据Christopher在下面的答案,我已经验证了只有在尝试通过Eclipse运行时才会发生这种情况。如果我使用ANT运行测试套件,则所有测试最终都会执行。
当我现在尝试运行我的测试套件时,Eclipse基本上在“collecting test information”上挂起了。我还没有让它运行很长时间,但我会尽快尝试一下,看看它是否完成。

1
我们在大约500个测试中看到了相同的情况。你有没有设法缓解这个问题? - Christopher Orr
抱歉,我还没有想出解决这个问题的方法。也许安卓团队中有人有一些想法... - Justin Breitfeller
2个回答

3
我再次调查了这个问题,据我所知,这只是一个与Android Eclipse插件有关的问题。虽然似乎已经解决了,但有时仍可能发生(可能与机器有关)。
正如您所提到的,Eclipse插件似乎会运行所有测试两次。事实上,第一次它实际上只是收集测试套件和测试名称,以便在漂亮的分层JUnit UI中显示所有测试名称。
然而,像这样“运行”测试似乎会引起问题。作为Android SDK Tools v8的一部分,添加了一个“解决方法”,在检查每个测试之间放置了15ms的延迟。这样做是为了防止“大型测试套件的Binder事务失败”。
事实上,我回去看了一下我的项目,这个项目一直出现“FAILED BINDER TRANSACTION”错误,但我无法在命令行中复制它。我们也尝试过在Eclipse中进行操作,但它不再能被复制(即使我们最初看到这个问题时已经使用了SDK工具r8+)。

然而,我仍然可以在Eclipse中一般性地复制它。请尝试使用最新的Android工具从Eclipse再次运行您的测试,或者尝试使用我创建的这个最小化的GitHub存储库,并查看是否可以复制它:
https://github.com/orrc/android-large-test-failures#readme


我根据您的建议编辑了我的问题并得到了结果。我使用ANT运行了我的测试套件(很奇怪,我们最近刚刚转换到ANT),它起作用了!我将再次在Eclipse中运行我的测试项目,以查看log cat在“收集测试信息”时会说些什么。另外,为了明确起见,我在设备和模拟器上都遇到了这个错误。 - Justin Breitfeller
好的。所以我的项目在Eclipse中仍然明显出现了失败的绑定事务,但这次是在尝试收集测试信息时而不是第二次运行测试时出现的。多么奇怪啊。 - Justin Breitfeller
为了进一步更新这个工作,我认为我已经缩小了问题的范围。在Nexus S上很少会出现这个问题。然而,在一部处理器较慢的旧手机上(在我的情况下是HTC Aria),我可以经常重现这个问题。我猜那部手机上的延迟不够? - Justin Breitfeller
谢谢你的信息。到目前为止,我还没有尝试在不同速度的手机上运行它。无论如何,我刚刚提交了 http://b.android.com/18660 - Christopher Orr
Chris,由于这似乎不会得到解决(我知道,我仍然回顾它!),我想我只是会接受你的答案。至少我们知道我们都不是疯狂和孤独的。 - Justin Breitfeller

1

你可能想尝试在本地 JVM 中运行测试,而不是将它们部署到模拟器或手机上。可以查看Robolectric以获取帮助。


虽然那可能可以工作,但我更感兴趣的是为什么它们在我的设备上不起作用。这对我来说非常奇怪。 - Justin Breitfeller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接