测试应用程序生命周期,破坏和创建

时间:2012-10-15 05:55:41

标签: java android unit-testing

我需要测试我的应用程序生命周期及其破坏和重新创建,因为当键盘滑入/滑出(或旋转)时,应用程序将被销毁并重新创建。我还需要在执行此操作时测试内存泄漏。

我在教程http://developer.android.com/tools/testing/activity_test.html#StateManagementTests

中看到了
Terminate the activity and restart it:
mActivity.finish();
mActivity = this.getActivity();

然而,这非常简化。我的日志记录似乎表明调用finish()会生成一个具有不同线程ID的后台线程,然后调用onPause(),finish(),onStop()和onDestroy()。我甚至尝试getInstrumentation().waitForIdleSync();尝试等待后台线程完成,但是当我测试预期值时,我仍然会遇到竞争条件。

不仅如此,但是当它重新创建Activity时(当第一个竞争条件没有发生或我注释掉断言时),使用getActivity(),它只返回我刚刚完成的完全相同的对象!我可以说,因为我在onXXX ...()方法中记录this

这与方向旋转/键盘滑动应用程序生命周期不同,后者始终会创建一个新的Activity对象。

那么如何测试这种破坏/转世场景?

2 个答案:

答案 0 :(得分:1)

我知道复制方向变化的唯一方法就是实际做到这一点。 (键盘#7键)也许您真正想要的是防止应用程序在方向更改时被杀死。;)您可以通过覆盖活动中的onConfigurationChanged()函数来实现此目的。见:http://developer.android.com/guide/topics/resources/runtime-changes.html

答案 1 :(得分:0)

好的我找到了!它涉及很多waitForIdleSync(),因为它是多线程开始的,而setActivity(null)。我只能在相同内存的±30%范围内。我也想赞扬Peter Carpenter,因为他的想法加快了我的应用程序,我永远不会想到这一点!

public void testMemoryLeaks() {
    Log.e(TAG, "------------ testMemoryLeaks()");
    getInstrumentation().waitForIdleSync();
    System.gc();
    Main mActivity = getActivity();
    Log.d(TAG, "-- Extractor.stop() "+mActivity.getExtractor());
    mActivity.getExtractor().stop();
    getInstrumentation().waitForIdleSync();
    System.gc();
    long mem = Runtime.getRuntime().freeMemory();
    Log.d(TAG, "-- freeMemory: " + mem);
    Log.d(TAG, "-- mActivity.finish()");
    mActivity.finish();
    getInstrumentation().waitForIdleSync();
    Log.d(TAG, "-- setActivity()");
    setActivity(null);
    getInstrumentation().waitForIdleSync();
    System.gc();
    Log.d(TAG, "-- getActivity()");
    mActivity = getActivity();
    assertTrue(mActivity != null);
    Log.d(TAG, "-- Extractor.stop() "+mActivity.getExtractor());
    mActivity.getExtractor().stop();
    getInstrumentation().waitForIdleSync();
    System.gc();
    long memAfter = Runtime.getRuntime().freeMemory();
    Log.d(TAG, "-- freeMemory: " + memAfter);
    assertTrue("Memory leak", mem > memAfter * .70 && mem < memAfter * 1.30);
    mActivity.finish();
    getInstrumentation().waitForIdleSync();
    Log.d(TAG, "-- end testMemoryLeaks()");
}