我刚刚开始研究Android工具测试,但在执行测试时遇到了一些问题。以下是我尝试过的:
使用Android和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为我的项目执行assembleDebug
和assembleTest
任务,并将两个apk
文件安装到我的测试设备上。
之后,应用程序在我的测试设备上成功启动。setUp()
方法正在被执行(我通过将失败的断言放入该方法并使用logcat
来检查这个方法),然后测试执行挂起,显示Running tests...
和testAppHomeButtonExists
当前正在执行。
在我通过最小化应用程序按home按钮或打开应用程序开关来改变活动状态之前,测试执行不会继续进行。然后执行测试方法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)
我做错了什么吗?我是不是遗漏了什么?是什么导致了这种行为?
提前感谢!
发布于 2013-11-12 11:22:36
我发现了这个问题:我在我的一个视图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()
,更新子视图一移动。
这解决了我的问题!我的测试现在正在运行,并且功能齐全!
发布于 2013-11-11 12:40:06
与检查这样的视图不同,您可以尝试这样的方法:
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);
}
}
https://stackoverflow.com/questions/19906407
复制相似问题