android Simple Espresso测试“循环x次迭代超过60秒”错误

64jmpszr  于 2023-06-27  发布在  Android
关注(0)|答案(3)|浏览(162)

我实际上试图设置一些单元测试与咖啡和经过几个小时的研究,应用程序只做点击,并获得焦点的编辑文本,但之后没有什么

  1. Caused by: android.support.test.espresso.AppNotIdleException: Looped for 1996 iterations over 60 SECONDS. The following Idle Conditions failed .

我已经删除了所有的动画和SwipeRefreshLayout,因为我看到有一个与swipefresh错误
我实际上使用了一些回调函数来替换Activity中的当前片段
如果有人有一些提示,我在搜索u_u 4小时后就出来了。
Thank you:)
我的Gradle依赖项:

  1. // App dependencies
  2. compile 'com.android.support:support-annotations:23.3.0'
  3. compile 'com.google.guava:guava:18.0'
  4. // Testing-only dependencies
  5. // Force usage of support annotations in the test app, since it is internally used by the runner module.
  6. androidTestCompile 'com.android.support:support-annotations:23.3.0'
  7. androidTestCompile 'com.android.support.test:runner:0.4.1'
  8. androidTestCompile 'com.android.support.test:rules:0.4.1'
  9. androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2'
  10. androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.2.2'

我在defaultConfig中添加了以下内容:

  1. testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

这是我的测试:

  1. @RunWith(AndroidJUnit4.class)
  2. @LargeTest
  3. public class HelloWorldEspressoTest {
  4. public static final String USERNAME = "do_f";
  5. @Rule
  6. public ActivityTestRule<LoginActivity> mActivityRule = new ActivityTestRule(LoginActivity.class);
  7. private LoginActivity mActivity = null;
  8. @Before
  9. public void setActivity() {
  10. mActivity = mActivityRule.getActivity();
  11. }
  12. @Test
  13. public void login_LoginActivity() {
  14. onView(withId(R.id.menu_login)).perform(click());
  15. onView(withId(R.id.login_username))
  16. .perform(typeText(USERNAME), closeSoftKeyboard());
  17. }
  18. }

我的活动:

  1. public class LoginActivity extends AppCompatActivity
  2. implements MenuFragment.OnFragmentInteractionListener {
  3. private FragmentManager fm;
  4. public static void newActivity(Activity activity)
  5. {
  6. Intent i = new Intent(activity, LoginActivity.class);
  7. activity.startActivity(i);
  8. }
  9. @Override
  10. protected void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_login);
  13. SharedPreferences sp = getSharedPreferences(Utils.SP, Context.MODE_PRIVATE);
  14. if (!sp.getString(Utils.TOKEN, "null").equals("null"))
  15. {
  16. MainActivity.newActivity(this);
  17. finish();
  18. }
  19. fm = getFragmentManager();
  20. fm.beginTransaction()
  21. .replace(R.id.container, MenuFragment.newInstance())
  22. .addToBackStack(null)
  23. .commit();
  24. }
  25. @Override
  26. public void onBackPressed()
  27. {
  28. if (getFragmentManager().getBackStackEntryCount() > 1)
  29. getFragmentManager().popBackStack();
  30. else
  31. super.onBackPressed();
  32. }
  33. @Override
  34. public void showLogin() {
  35. fm.beginTransaction()
  36. .replace(R.id.container, LoginFragment.newInstance())
  37. .addToBackStack(null)
  38. .commit();
  39. }
  40. @Override
  41. public void showRegister() {
  42. fm.beginTransaction()
  43. .replace(R.id.container, RegisterFragment.newInstance())
  44. .addToBackStack(null)
  45. .commit();
  46. }
  47. }

我的LoginFragment:

  1. private static final String TAG = "LoginFragment";
  2. @Bind(R.id.loading_spinner)
  3. ProgressBar loading;
  4. @Bind(R.id.content)
  5. LinearLayout content;
  6. @Bind(R.id.login_username)
  7. EditText username;
  8. @Bind(R.id.login_password)
  9. EditText password;
  10. public LoginFragment() {
  11. }
  12. public static LoginFragment newInstance() {
  13. return new LoginFragment();
  14. }
  15. @Override
  16. public void onCreate(Bundle savedInstanceState) {
  17. super.onCreate(savedInstanceState);
  18. }
  19. @Override
  20. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  21. Bundle savedInstanceState) {
  22. View v = inflater.inflate(R.layout.login_fragment_login, container, false);
  23. ButterKnife.bind(this, v);
  24. return v;
  25. }
  26. @Override
  27. public void onActivityCreated(Bundle saveInstanceState) {
  28. super.onActivityCreated(saveInstanceState);
  29. }
  30. @OnClick(R.id.login_submit)
  31. public void onSubmit(View v)
  32. {
  33. if (username.getText().length() == 0
  34. || password.getText().length() == 0)
  35. {
  36. Snackbar.make(getView(), "blabla", Snackbar.LENGTH_SHORT).show();
  37. return ;
  38. }
  39. //hideContent();
  40. LoginPost p = new LoginPost(username.getText().toString(), password.getText().toString());
  41. Call<LoginResponse> call = RestClient.get().login(p);
  42. call.enqueue(new Callback<LoginResponse>() {
  43. @Override
  44. public void onResponse(Call<LoginResponse> call, Response<LoginResponse> response) {
  45. if (response.body() == null) {
  46. String msg = getResources().getString(R.string.login_error_bad_credentials);
  47. Snackbar.make(getView(), msg, Snackbar.LENGTH_SHORT).show();
  48. //showContent();
  49. } else {
  50. SharedPreferences sp = getActivity().getSharedPreferences(Utils.SP, Context.MODE_PRIVATE);
  51. sp.edit().putString(Utils.TOKEN, response.body().getToken()).apply();
  52. sp.edit().putString(Utils.USERNAME, username.getText().toString()).apply();
  53. MainActivity.newActivity(getActivity());
  54. getActivity().finish();
  55. }
  56. }
  57. @Override
  58. public void onFailure(Call<LoginResponse> call, Throwable t) {
  59. Snackbar.make(getView(), "onFailure", Snackbar.LENGTH_SHORT).show();
  60. //showContent();
  61. }
  62. });
  63. }
4zcjmb1e

4zcjmb1e1#

我找到了解决方案,循环迭代就是由此引起的

  1. <ProgressBar
  2. android:id="@+id/loading_spinner"
  3. android:layout_width="150dp"
  4. android:layout_height="150dp"
  5. android:layout_centerVertical="true"
  6. android:layout_centerHorizontal="true"
  7. android:indeterminateTintMode="src_atop"
  8. android:indeterminateTint="@color/ganjify"
  9. android:alpha="0"
  10. android:layout_gravity="center" />

因为我没有设置的可见性去当我不使用它!

  1. loading.setVisibility(View.GONE);
1aaf6o9v

1aaf6o9v2#

Espresso被设计为等到应用程序中没有挂起的UI动画或AsyncTasks时才继续测试。从the docs,强调我的:
Espresso提供了一组复杂的同步功能。然而,框架的这一特性仅适用于在MessageQueue上发布消息的操作,例如在屏幕上绘制其内容的View子类。
android.support.test.espresso.AppNotIdleException最可能的原因是Espresso正在等待完成正在进行的UI动画或AsyncTask。
例如,如果您的布局中有一个ProgressBar元素,则需要设置可见性loading.setVisibility(View.GONE);,因为Espresso将该元素解释为正在进行的UI动画,并且将等待它消失以继续测试。

1cosmwyk

1cosmwyk3#

在我的案例中,此问题的根本原因是MotionLayout具有无限动画。如果你有一些循环的动画,永远你的应用程序将不会达到空闲状态,测试可能会停留在一个随机的ViewInteraction,而一些EspressoView正在等待空闲状态。

相关问题