我有几个简单的测试,例如assertNotNull(mActivity);
(我正在阅读M.D.Torres“Android应用程序测试指南”)。被测活动运行良好。每一次测试都运行良好。但是如果我在第二次测试中同时运行多个测试getActivity()
永远不会返回。 logcat中没有错误(最后一行“Starting Intent ...”),没有任何错误。调试也没有多大帮助,如果我进入getActivity()
它会抱怨没有可用的源代码
另一个测试项目 - 来自Google的ActivityTesting即使进行了多次测试也运行正常,因此Eclipse配置正确
有没有人遇到类似的东西?
答案 0 :(得分:8)
我再次重新创建了测试项目(比如“洁净室”)并且它有效。然后我比较了两个项目并找到了罪魁祸首。这是空的拆解:
protected void tearDown() throws Exception {
}
如果我删除它,所有测试都会运行绿色。如果我将其粘贴回去,则第二次测试会挂起。现在我想阅读解释并准备将其标记为答案。
修改:我应该在super.tearDown()
方法的末尾调用tearDown
。
很抱歉打扰了所有人。
答案 1 :(得分:1)
我使用ActivityInstrumentationTestCase2来测试使用ExoPlayer的Activity并更正资源清理。由于所有测试的清理和最终检查都是相同的,我认为tearDown()是实现它们的好地方。所有测试都单独运行而没有任何问题,但是当我运行多个测试时,有时候getActivity()没有返回。我的tearDown()实现了各种各样的东西:
我尝试了所有建议的解决方法,例如重写getActivity()并使用其他检测方法来创建和清理活动。这些方法没有帮助。
许多调试显示,在上述情况下,上一个测试的活动的onDestory()可以与下一个测试的活动的onCreate()重叠。因此,日志按此顺序显示生命周期事件:
test1.getActivity();
test1.tearDown() called;
test1.tearDown() over;
test2.getActivity()
test2.onCreate();
test1.onStop(); --> why is this late?
test1.onDestroy(); --> why is this late?
test2.tearDown() called;
test2.tearDown() over;
test3.getActiviy() --> this should call test3.onCreate, but did not and never returned.
即使测试用例在单独的ActivityInstrumentationTestCase2类/文件中实现,也会发生这种情况。第一次这种重叠不会造成麻烦,所以2次测试总是没问题,但是以任何顺序运行3次测试导致这种重叠导致第3次调用getActivity()永远不会返回。
我尝试了所有操作,例如使用检测手动调用onPause()+ onStop()+ onDestroy(),在测试之间引入非常长的睡眠时间,强制清除instrumentationTestCase的活动,重新排序我的tearDown检查,但没有任何帮助。最后,我在检查之前意外删除了setActivity(null),并且生命周期事件得到了正确的排序:
test1.tearDown() called;
test1.onStop();
test1.onDestroy();
test1.tearDown() over;
test2.getActivity()
test2.onCreate();
...
那么在我的案例中真正有所作为:不要调用ActivityTestCase.setActivity()。这会导致super.tearDown()不直接调用活动的生命周期事件,以后会发生清理并造成麻烦。