首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android InstrumentTest挂起,直到最小化应用程序。

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

Stack Overflow用户
提问于 2013-11-11 12:29:23
回答 2查看 600关注 0票数 0

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

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

代码语言:javascript
运行
复制
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为我的项目执行assembleDebugassembleTest任务,并将两个apk文件安装到我的测试设备上。

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

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

更新:

这就是TestRunner登录到我设备的logcat流中的内容:

代码语言:javascript
运行
复制
11-11 15:34:59.750  24730-24748/at.example.activity I/TestRunner﹕ started: testAppHomeButtonExists(BasicAppTestCase)

直到我停止应用程序,没有更多的记录。停止活动后,将记录以下活动:

代码语言:javascript
运行
复制
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)

我做错了什么吗?我是不是遗漏了什么?是什么导致了这种行为?

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-12 11:22:36

我发现了这个问题:我在我的一个视图onDraw()方法中创建了一个无限失效循环。伶盗龙应该吃掉我使用旧代码,而不首先检查它。视图的绘图方法是这样的:

代码语言:javascript
运行
复制
@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(),更新子视图一移动。

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

票数 0
EN

Stack Overflow用户

发布于 2013-11-11 12:40:06

与检查这样的视图不同,您可以尝试这样的方法:

代码语言:javascript
运行
复制
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);

    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19906407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档