Android InstrumentTest会挂起,直到最小化应用程序

时间:2013-11-11 12:29:23

标签: java android android-studio android-testing android-gradle

我刚刚开始研究Android测试测试,但在执行测试时遇到了一些问题。这是我试过的:

使用Android Studio和gradle,我在src/instrumentTest/java/中创建了一个简单的测试类。这是:

package at.example.test;

import android.test.ActivityInstrumentationTestCase2;
import android.view.View;
import at.example.activity.MainActivity;

public class BasicAppTestCase extends ActivityInstrumentationTestCase2<MainActivity> {

    private MainActivity activity;

    public BasicAppTestCase() {
        super(MainActivity.class);
    }

    @Override protected void setUp() throws Exception {
        super.setUp();
        activity = getActivity();
    }

    public void testAppHomeButtonExists() {
        View homeButton = activity.findViewById(android.R.id.home);
        assertNotNull("Home button does not exist", homeButton);
    }
}

接下来,我通过右键单击我的项目并选择Run 'All Tests'来开始测试。 Android Studio为我的项目执行assembleDebugassembleTest任务,并将apk个文件安装到我的测试设备上。

之后,应用程序在我的测试设备上成功启动。 setUp()方法正在执行(我通过将失败的断言放入方法以及使用logcat来检查这一点)然后测试执行挂起,显示Running tests...和{{1}当前正在执行。

在我通过最小化应用程序按下主页按钮或打开应用程序切换器来更改活动状态之前,测试执行将不会继续。然后执行测试方法testAppHomeButtonExists并且(取决于方法主体)成功或失败。同样,我使用assert调用和testAppHomeButtonExists输出测试了这种行为。

更新

这是logcat记录到我设备的logcat流中的内容:

TestRunner

直到我停止应用程序,不再记录任何内容。停止后,记录以下活动:

11-11 15:34:59.750  24730-24748/at.example.activity I/TestRunner﹕ started: testAppHomeButtonExists(BasicAppTestCase)

我做错了吗?我错过了什么吗?什么可能导致这种行为?

提前致谢!

2 个答案:

答案 0 :(得分:0)

不是像你那样检查视图,你可以尝试这样的事情:

public class BasicAppTestCase extends ActivityInstrumentationTestCase2<MainActivity> {

    private MainActivity activity;
    private Button;
    public BasicAppTestCase() {
        super(MainActivity.class);
    }

    @Override protected void setUp() throws Exception {
        super.setUp();
        activity = getActivity();
        button = (Button) activity
                .findViewById(android.R.id.home);
    }


    public final void testPreconditions() {
        assertNotNull(activity);
    }

    public final void testFieldsOnScreen() {
        final Window window = tAes_Activity.getWindow();
        final View origin = window.getDecorView();
        assertOnScreen(origin, button);

    }
}

答案 1 :(得分:0)

我发现了问题:我在我的一个视图onDraw()方法中创建了一个无限的失效循环。 快速消遣器应该让我使用旧代码而不先检查它。这就是视图的绘图方法:

@Override protected void onDraw(Canvas canvas) {
    // Get the current location on screen in pixels (left = 0)
    int[] location = new int[2];
    this.getLocationOnScreen(location);

    // Translate the canvas for the same location as its current offset (resulting in a doubled shift).
    canvas.translate(location[0], 0);

    // Now draw the translated content.
    super.onDraw(canvas);

    this.invalidate();
}

上述绘图方法创建了视图内容的“伪视差效果”。问题是,尽管这不会导致ANR,但它导致托管Activity永远不会空闲,导致我的测试getActivity()方法不返回,因为它的实现等待空闲活动(意味着设置)完成)。问题Android animation causing "Activity idle timeout for History Record" on start up是一个类似的问题。我的快速解决方案是将invalidate()调用推迟到父ViewPager。由于我的视差效果只需要在我的页面位置发生变化时进行更新,因此我现在使用的ViewPager.OnPageChangeListener()会在移动后立即更新子视图。

这解决了我的问题!我的测试现在正在运行并且功能齐全!