Android Espresso测试在执行时卡住(单击());
我正在使用浓缩咖啡进行一些自动测试用例。情况是: 我有一个活动包含两个片段,比如FrgA和FrgB FrgA由一个列表组成,其中包含一些项目,单击这些项目可将用户带到FrgB 显示FrgB后,我检查FrgB上是否存在gridview。我使用的代码是: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
@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())可以随机地失败执行单击,即使它没有给出任何异常,它只是默默地失败。