Android Espresso测试在执行时卡住(单击());

Android Espresso测试在执行时卡住(单击());,android,gridview,automation,android-espresso,Android,Gridview,Automation,Android Espresso,我正在使用浓缩咖啡进行一些自动测试用例。情况是: 我有一个活动包含两个片段,比如FrgA和FrgB FrgA由一个列表组成,其中包含一些项目,单击这些项目可将用户带到FrgB 显示FrgB后,我检查FrgB上是否存在gridview。我使用的代码是: @Test public void testProductsDisplayed(){ onData(anything()).atPosition(1).perform(click()); onView(withId(R.id.gri

我正在使用浓缩咖啡进行一些自动测试用例。情况是:

我有一个活动包含两个片段,比如FrgA和FrgB

FrgA由一个列表组成,其中包含一些项目,单击这些项目可将用户带到FrgB

显示FrgB后,我检查FrgB上是否存在gridview。我使用的代码是:

@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;
    }
}
public类FrgB扩展BaseFragment实现mclicklinklistener{
私有视图;
私有列表产品;
私人影像助理;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
Log.d(“卡丁车”,“在激活中创建”);
GridView gvProducts=findTypedViewById(mView,R.id.gvProducts);
mAdapter=newimagesdapter(getActivity(),R.layout.image\u grid\u项,new ArrayList());
if(getArguments()!=null&&getArguments().containsKey(Constants.CATEGORY_ID)){
字符串catId=getArguments().getString(常量.CATEGORY\u ID);
Log.d(“Kart”,“在onActivityCreated中-活动是:“+getActivity()”);
如果(getActivity()==null){
Log.e(“卡丁车”,“活动不存在”);
}否则{
MPProducts=((ScrLanding)getActivity()).getProductsForCategory(catId);
mAdapter.addAll(MPProducts);
}
gvProducts.setAdapter(mAdapter);
gvProducts.setOnItemClickListener(本);
}否则{
returnToLastScreen();
}
}
/**
*方法从片段管理器中删除当前片段
*/
私有void returnToLastScreen(){
showtoos(getString(R.string.msg\u no\u products)、Toast.LENGTH\u SHORT);
移除碎片(本);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
super.onCreateView(充气机、容器、保存状态);
mView=充气机。充气(R.layout.frg\u产品清单,容器,假);
返回mView;
}
@凌驾
public void onItemClick(AdapterView父视图、视图、整型位置、,
长id){
开关(parent.getId()){
案例R.id.GV产品:
FrgProductDetails片段=新的FrgProductDetails();
Bundle=新Bundle();
bundle.putSerializable(Constants.PRODUCT_INFO,mpproduct.get(position));
((ScrLanding)getActivity()).setSelectedProductBitmap(mAdapter.getThumbsMap().get(position));
fragment.setArguments(bundle);
addFragment(fragment,R.id.fragment\u容器);
打破
违约:
打破
}
}
}


哪里出了问题?

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

有趣的是,我注意到如果我手动尝试滚动屏幕,测试将恢复。 添加这一行解决了问题并恢复了测试

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

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

解决方案1:

在导致挂起的测试上添加JUnit超时。这将允许测试失败并继续进行下一个测试。超时消息的堆栈跟踪应该指示它被卡住的位置。因此,您应该看到如下失败消息:

org.junit.runners.model.TestTimedOutException: test timed out after 60 seconds
有关如何添加超时的信息:

解决方案2:

尝试在较新版本的Android操作系统上运行浓缩咖啡测试,如Android 5.1(API 22)或更高版本。一些旧版本,如Android 4.1,在运行与其他测试混合的浓缩咖啡测试时可能会出现问题,尤其是在ARM emulator上

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

Test failed to run to completion. Reason: 'Instrumentation run failed due to 'Process crashed.''. Check device logcat for details
更多信息和


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

Hi,问题解决了吗?如果没有,请从失败的testHi添加日志!你有什么解决办法吗?如果是,请分享:)最新的浓缩咖啡仍然存在同样的问题,正如您所描述的,swipeUp()确实有助于解除执行障碍。不幸的是,后来我发现,如果使用swipeUp(),跟随atPosition().perform(click())可以随机地失败执行单击,即使它没有给出任何异常,它只是默默地失败。