【问题标题】:Android Espresso Test gets stuck at perform(click());Android Espresso 测试卡在 perform(click());
【发布时间】:2020-03-21 22:02:43
【问题描述】:

我将 Espresso 用于一些自动化测试用例。场景是:

我有一个包含两个片段的活动,即 FrgA 和 FrgB。

FrgA 由一个包含一些项目的列表组成,用户点击它们即可将其带到 FrgB。

一旦显示 FrgB,我会检查 FrgB 上是否存在网格视图。我用于此的代码是:

@Test
public void testProductsDisplayed(){
    onData(anything()).atPosition(1).perform(click());
    onView(withId(R.id.gridview)).check(matches(isDisplayed()));
}

我一直面临的问题是,来自 FrgA 的列表项被成功单击,它也将我带到具有 GridView 的 FrgB。但是我的测试不会进行到测试用例的第 2 行,而是卡在了第一行(click())。一段时间后,它会超时。奇怪的是,如果我删除 gridview 并放置一些 TextView 并搜索它的存在,则测试通过而没有任何错误。

我唯一能想到的是在 FrgB 中加载 gridview 内容时的一些时间问题。 FrgB的代码如下:

public class FrgB extends BaseFragment implements OnItemClickListener {
private View mView;
private List<Product> mProducts;
private ImagesAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Log.d("Kart", "In onActivityCreated");

    GridView gvProducts = findTypedViewById(mView, R.id.gvProducts);
    mAdapter = new ImagesAdapter(getActivity(), R.layout.image_grid_item, new ArrayList<Product>());

    if(getArguments() != null && getArguments().containsKey(Constants.CATEGORY_ID)){
        String catId = getArguments().getString(Constants.CATEGORY_ID);
        Log.d("Kart", "In onActivityCreated - activity is: "+getActivity());
        if(getActivity() == null){
            Log.e("Kart", "Activity does not exist");
        }else{
            mProducts = ((ScrLanding)getActivity()).getProductsForCategory(catId);
            mAdapter.addAll(mProducts);
        }

        gvProducts.setAdapter(mAdapter);
        gvProducts.setOnItemClickListener(this);

    } else{
        returnToLastScreen();
    }
}
/**
 * Method to remove current fragment from fragment manager
 */
private void returnToLastScreen() {
    UiHelper.showToast(getString(R.string.msg_no_products), Toast.LENGTH_SHORT);
    removeFragment(this);       
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    mView = inflater.inflate(R.layout.frg_product_listing, container, false);
    return mView;
}


@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
        long id) {
    switch (parent.getId()) {
    case R.id.gvProducts:
        FrgProductDetails fragment = new FrgProductDetails();
        Bundle bundle = new Bundle();
        bundle.putSerializable(Constants.PRODUCT_INFO, mProducts.get(position));
        ((ScrLanding)getActivity()).setSelectedProductBitmap(mAdapter.getThumbsMap().get(position));
        fragment.setArguments(bundle);
        addFragment(fragment, R.id.fragment_container);
        break;

    default:
        break;
    }
}

}

我哪里错了?

【问题讨论】:

  • 您好,解决了吗?如果没有,请添加失败测试的日志
  • 嗨!你有什么解决办法吗?如果是,请分享:)

标签: android gridview automation android-espresso


【解决方案1】:

我在使用 ListView 时遇到了同样的问题。

有趣的是,我注意到如果我手动尝试滚动屏幕​​,测试会继续进行。 添加此行解决了问题并恢复了测试。

 onView(withId(R.id.myListView)).perform(swipeUp());

【讨论】:

  • 最新的 Espresso 仍然存在同样的问题,正如您所描述的,swipeUp() 确实有助于解除阻塞执行。不幸的是,后来我发现,如果使用 swipeUp(),即使没有给出任何异常,跟随 atPosition().perform(click()) 也会随机执行点击失败,它只是默默地失败。
【解决方案2】:

当尝试单击尚未滚动到视图中的首选项行时,此问题可能发生在 PreferenceFragment 屏幕上。 Espresso 通常应该自动滚动到该行以单击它,但有时它不会,并且只会导致测试挂起。 Saksham Dhawan 的swipeUp() 建议效果很好。以下是一些其他建议:

解决方法 1:

在导致挂起的测试上添加 JUnit 超时。这将允许测试失败并继续下一个测试。超时消息的堆栈跟踪应该指出它卡在哪里。所以你应该会看到这样的失败消息:

org.junit.runners.model.TestTimedOutException: test timed out after 60 seconds

关于如何添加超时的信息:Mark as failed running too long JUnit tests

解决方法 2:

尝试在较新版本的 Android 操作系统上运行 Espresso 测试,例如 Android 5.1 (API 22) 或更高版本。某些旧版本(例如 Android 4.1)在运行与其他测试混合的 Espresso 测试时可能会出现问题,尤其是在 ARM 模拟器上。

示例问题可能是测试挂起或应用在测试套件期间崩溃。例如,您也可能在较旧的 Android 操作系统上收到此错误:

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Process crashed.''. Check device logcat for details

更多信息hereherehere

较新的 Android 版本将更可靠地运行 Instrumentation 测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多