Espresso / 如何在 Espresso 测试的活动之间移动按钮状态?
Espresso / How can I move button state between activities in Espresso tests?
我经历过下一个场景:
- 我的测试项目中的每个测试都使用单独的activity
- test1(主界面)属于activity#1,有一个按钮此屏幕 可以将状态从 STATE#1 (OFF) 更改为 STATE#2 (ON)
- 点击按钮 STATE#1(来自 test1)导致属于 activity#2 的另一个屏幕升起(有 test2 开始),然后开始。#2 用户执行一些应该改变按钮状态的操作 to STATE# 2
- 但在我的测试按钮中 STATE#2 不会被刷新并传递给之前的 activity#1
我需要以特定方式同步测试数据吗? 如果按钮的状态(打开 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.
中的任何内容
我经历过下一个场景:
- 我的测试项目中的每个测试都使用单独的activity
- test1(主界面)属于activity#1,有一个按钮此屏幕 可以将状态从 STATE#1 (OFF) 更改为 STATE#2 (ON)
- 点击按钮 STATE#1(来自 test1)导致属于 activity#2 的另一个屏幕升起(有 test2 开始),然后开始。#2 用户执行一些应该改变按钮状态的操作 to STATE# 2
- 但在我的测试按钮中 STATE#2 不会被刷新并传递给之前的 activity#1
我需要以特定方式同步测试数据吗? 如果按钮的状态(打开 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.