我正在使用Espresso进行一些自动化测试用例。场景是:
我有一个活动,其中包含两个碎片,例如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;
}
}
}
我哪里错了?
答案 0 :(得分:1)
我在使用ListView时遇到了同样的问题。
有趣的是,我注意到如果手动尝试滚动屏幕,测试将恢复。 添加此行解决了问题并重新开始测试。
onView(withId(R.id.myListView)).perform(swipeUp());
答案 1 :(得分:0)
解决方法1:
在导致挂起的测试上添加JUnit超时。这将使测试失败并继续进行下一个测试。超时消息的堆栈跟踪应该表明它被卡在哪里。
有关如何添加超时的信息:Mark as failed running too long JUnit tests
解决方法2:
尝试在较新版本的Android OS(例如Android 5.1(API 22)或更高版本)上运行Espresso测试。某些旧版本(例如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
更新的Android版本将更可靠地运行Instrumentation测试。