0

我刚开始研究 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为我的项目执行任务,并将这两个文件安装assembleDebug到我的测试设备上。assembleTestapk

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

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

更新:

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

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

在我停止应用程序之前,没有更多的记录。停止活动后,将记录以下内容:

11-11 15:35:05.205  24730-24748/at.example.activity I/TestRunner﹕ finished: testAppHomeButtonExists(BasicAppTestCase)
11-11 15:35:05.205  24730-24748/at.example.activity I/TestRunner﹕ passed: testAppHomeButtonExists(BasicAppTestCase)

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

提前致谢!

4

2 回答 2

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);

    }
}
于 2013-11-11T12:40:06.973 回答
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动画是一个类似的问题。我的快速解决方案是将invalidate()调用推迟到父 ViewPager。由于我的视差效果只需要在我的页面位置发生变化时更新,我现在使用一个ViewPager.OnPageChangeListener()在子视图移动时立即更新它们的方法。

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

于 2013-11-12T11:22:36.783 回答