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

Espresso / How can I move button state between activities in Espresso tests?

我经历过下一个场景:

我需要以特定方式同步测试数据吗? 如果按钮的状态(打开 activity#1 ) 可以从另一个测试更改 activity (activity#2)


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

首先测试应该改变哪个按钮状态

TEST2 - 应更改按钮 1 状态的测试

@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);
            }
        }

    }

现在检查 activity#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);
            }
        }

    }

顺便说一句,我浏览了很多主题,甚至找到了有意图的例子,但它对我不起作用,也许应该有特定的结构。 如果您需要更多信息,请在评论中添加您的问题。

问题是您正在编写两个测试,使得第二个测试依赖于第一个测试的状态。这是不正确的测试设计。每个测试都应该能够 运行 完全独立于任何其他测试。您需要重新考虑您的每个测试都在测试什么。在影响第一个状态的第二个 activity 中发生了什么?你在使用 startActivityForResult() 吗?如果是这样,您对第二个 activity 的测试应该验证预期结果是从第二个 activity 设置的。此测试不应依赖第一个 activity.

中的任何内容