Espresso /如何在Espresso测试中的活动之间移动按钮状态?

时间:2017-12-05 10:01:13

标签: android testing android-espresso

我经历过下一个场景:

  • 我的测试项目中的每项测试都使用单独活动
  • test1 (主屏幕)属于活动#1 ,此屏幕上有按钮,可以从更改状态状态#1(关闭)到状态#2(开启)
  • 点击按钮状态#1 (来自test1)导致属于活动#2 的另一个屏幕加注(有 test2 开始),然后是行动。#2用户执行一些应该改变按钮状态 状态#2
  • 的动作
  • 但在我的测试按钮中状态#2 无法刷新并传递给之前的活动#1

我是否需要以特定方式同步测试数据?如果按钮状态(在活动#1 上)可以从其他测试活动更改(活动#2

这是我正在做的事情的例子:

首先测试应该更改按钮状态

TEST2 - 应该更改button1状态的测试

@RunWith(AndroidJUnit4.class)
 public class ChangeBtnState extends MyIdle
    {
       @Rule
        public ActivityTestRule<Activity#2> EspressoTestRule#2 = new ActivityTestRule<>(Activity#2.class, false, true);
        private MyIdle IdlingRecourseActivity#2;

       @Before
        public void SetUpTest2()
        {
         EspressoTestRule#2.getActivity().getSupportFragmentManager().beginTransaction();

         IdlingRecourseActivity#2 = (ESP_idling) EspressoTestRule#2.getActivity().getIdlingResource();
         Espresso.registerIdlingResources(IdlingRecourseActivity#2);
        }
       @Test
        public void StartTestRule2()
        {
         // Just some actions on activity#2 after which button1 state should be from STATE#1 to STATE#2
         ViewInteraction ButtonSendtoOFF = Espresso.onView(allOf(ViewMatchers.withId(android.R.id.SomebuttonONact#2))
         .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
         ButtonSendtoOFF.preform(click()); // here click 
        }

        }

       @After
        public void unregistereSetUpTest2()
        {
            if (IdlingRecourseActivity#2 != null)
            {
                Espresso.unregisterIdlingResources(IdlingRecourseActivity#2);
            }
        }

    }

现在检查活动#1上的按钮状态是否已更改

@RunWith(AndroidJUnit4.class)
 public class CheckBtnState extends MyIdle
    {
       @Rule
        public ActivityTestRule<Activity#1> EspressoTestRule#1 = new ActivityTestRule<>(Activity#1.class, false, true);
        private MyIdle IdlingRecourseActivity#1;

       @Before
        public void SetUpTest1()
        {
         EspressoTestRule#1.getActivity().getSupportFragmentManager().beginTransaction();

         IdlingRecourseActivity#1 = (ESP_idling) EspressoTestRule#1.getActivity().getIdlingResource();
         Espresso.registerIdlingResources(IdlingRecourseActivity#1);
        }
       @Test
        public void StartTestRule1()
        {
        // Check some actions FROM activity#2 to change **button1** from STATE#1 to STATE#2
         ViewInteraction ButtonSTATE = Espresso.onView(allOf(ViewMatchers.withId(android.R.id.Button1), withText("OFF"))
         .check(ViewAssertions.matches(ViewMatchers.isDisplayed()));
         //ButtonSTATE.preform(click()); // here click 
        }

       @After
        public void unregistereSetUpTest1()
        {
            if (IdlingRecourseActivity#1 != null)
            {
                Espresso.unregisterIdlingResources(IdlingRecourseActivity#1);
            }
        }

    }
顺便说一下,我已经看了很多主题,甚至找到了意图的例子,但它对我没有用,也许应该有特定的结构。 如果您需要额外信息,请在评论中添加您的问题。

1 个答案:

答案 0 :(得分:0)

问题是您正在编写两个测试,以便第二个测试依赖于第一个测试的状态。这是不正确的测试设计。每个测试都应该能够完全独立于任何其他测试运行。您需要重新考虑每个测试的测试内容。在影响第一个活动状态的第二个活动中会发生什么?你在使用let t = Object.create(this.prototype); this.call(t); 吗?如果是这样,您对第二个活动的测试应验证是否从第二个活动设置了预期结果。此测试不应依赖第一项活动中的任何内容。