Android Espresso(三)——ListView

Android Espresso(三)——ListView

ListView是平时使用频率较高的一个组件,所以先来看下AdapterView的Espresso操作,以ListView为例。

代码UI示例可以在android/testing-samples找到。

为方便独立运行程序并测试,我将ListView相关UI代码提取到一个新project中,简化操作。

运行页面

在这里插入图片描述

列表中有100条数据,每个item上有一个text,一个button。

点击Item测试

先看下简单的点击测试,代码如下(含代码注释)。

@RunWith(AndroidJUnit4.class)
public class ListViewTest {
    private static final String TAG = "ListViewTest";

    // 1 ActivityTestRule 在test程序运行时会启动对应设置的Activity。可以在测试程序中通过 getActivity() 方法获取Activity,
    // 直接操作Activity实例。
    @Rule
    public ActivityTestRule<LongListActivity> activityRule = new ActivityTestRule<>(LongListActivity.class);

    // 2 在每个test case 运行时,都会执行一次 @Before 标注的方法。
    @Before
    public void setup() {
        Log.i(TAG, "start~~~");
    }

    // 3 具体的 test case 方法,内部程序就是一个完整的测试过程。这个方法方法中 inAdapterView() 方法不调用依然可以运行成功,因为在 Activity 内
    // 只有一个 AdapterView
    @Test
    public void testListItemPositionClick() {
        // onData() 参数 instanceOf() 表示ListView 内每个Item 的数据类型。 
        // inAdapterView() 参数指定具体的AdapterView,这个方法在一个页面内存在多个AdapterView是很有用处。
        // atPosition() 参数是 position 参数,从0开始,若position位置超出了屏幕的显示,ListView会先滚动到对应位置
        onData(instanceOf(Map.class)).inAdapterView(withId(R.id.list)).atPosition(20).perform(click());
        onView(withId(R.id.selection_row_value)).check(matches(withText("20")));
    }

    // 4 在每个test case 运行结束后,都会执行一次 @After 标注的方法。
    @After
    public void tearDown() {
        Log.i(TAG, "end~~~");
    }
}

运行效果。
在这里插入图片描述

运行说明: 运行效果可以看到test程序运行后,ListView先滚动到position等于20的item位置,然后执行了click点击事件。在顶部 "Clicked on row " 的值发生了变化 “Clicked on row 20”,结束。

注意:若position的值大于可加在数据的总量,会抛出 android.support.test.espresso.PerformException: Error performing ‘load adapter data’ on view 'Animations or transitions are enabled on the target device.

点击Item内ToggleButton

代码及注释如下:

@RunWith(AndroidJUnit4.class)
public class ListViewTest {

    @Rule
    public ActivityTestRule<LongListActivity> activityRule = new ActivityTestRule<>(LongListActivity.class);

    // ...

    @Test
    public void testListItemPositionClick() {
        // 通过position找到item,并在Item内id为rowToggleButton的view上执行点击操作。检查字符串值为"ON"
        // 在position等于50的item view找到id是rowToggleButton的ToggleButton并执行click操作。检查字符串值"ON"
        onData(instanceOf(Map.class)).atPosition(50)
            .onChildView(withId(R.id.rowToggleButton)).perform(click()).check(matches(withText("ON")));

        // 通过item view内包含的字符串值找到对应的Item。 ListView的数据类型对应的是List<Map<String, Object>>, 每个
        // 每个Item对应的数据类型是 Map<String, Object>, hasEntry(T key, T value) 对应了Map数据类型进行值得匹配。
        onData(allOf(is(instanceOf(Map.class)), hasEntry("ROW_TEXT", "item: 88"))).
            onChildView(withId(R.id.rowToggleButton)).perform(click()).check(matches(withText("ON")));
  }

    // ...
}

运行操作是:1. 在位置50的 toggle button 上,执行点击操作。

​ 2. 找到文本值是 “item: 88” 的item上,找到 toggle button,执行点击操作。

在这里插入图片描述

这是对ListView最基本的两种操作。

其他操作

@RunWith(AndroidJUnit4.class)
public class ListViewTest {

    @Rule
    public ActivityTestRule<LongListActivity> activityRule = new ActivityTestRule<>(LongListActivity.class);
  
    @Test
    public void checkDisplayed() {
        // 滚动到最后一条,判断完全显示
        onData(hasEntry(equalTo("ROW_TEXT"), is("item: 99"))).check(matches(isCompletelyDisplayed()));
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VoidHope

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值