Android Espresso:如何创建可以针对不同活动启动单独测试 类 的测试套件?
Android Espresso: How to create test-suite which may launch separate test classes with different activities?
我刚开始研究 Espresso 测试,但我搜索了 Whosebug 主题,但找不到满足我需要的解决方案。
史前我的问题:
我的 android 申请有很多活动。通常会为应用程序的不同流程创建单独的 UI 测试(每个流程都需要单独的 activity,因此我在不同的 classes 中实施了测试)。
在我的案例背景和 UI usync 发生时,这就是为什么我不能从第一个 activity 开始并继续进行下一个和下一个。
我找到的唯一解决方案,它真正适用于当前的应用程序 - 为应用程序活动使用闲置资源。
问题:
所以现在我试图了解如何将所有这些单独的 classes(每个 class 使用自己的规则和这些规则的活动)放入功能套件?
我的经验:
1) 正面 - 使用闲置资源需要更改开发者的源代码,但套件中仍然只有一个activity:
@RunWith(AndroidJUnit4.class)
public class forSeveralActs {
@Rule
public final ActivityTestRule<TargetedActivity> mTargetedActivityRule = new ActivityTestRule<>(TargetedActivity.class, true, true);`
final String username = "test@mail.com";
final String password = "12345678";
private IdlingResource mIdlingRecourse;
@Before
public void setIdleResource() {
mIdlingRecourse = mTargetedActivityRule.getActivity().getIdlingResource();
Espresso.registerIdlingResources(mIdlingRecourse);
}
@Test
public void PassPermission_and_goto_MainActivity() {
// First activity - LoginActivity
Espresso.onView(withId(R.id.activity_login_et_login))
.perform(ViewActions.typeText(username));
Espresso.onView(withId(R.id.activity_login_et_password))
.perform(ViewActions.typeText(password))
.perform(closeSoftKeyboard());
Espresso.onView(withId(R.id.activity_login_btn_login))
.check(matches(isDisplayed()))
.check(matches(isClickable()))
.perform(ViewActions.click());
// Here is elements of second activity - MainActivity, without idling methods I can't reach this element
Espresso.onView(withId(R.id.helpMeCard_title))
.check(matches(withText("help_me")));
}
@After
public void unregisteredIdlingResource() {
if (mIdlingRecourse != null) {
Espresso.unregisterIdlingResources(mIdlingRecourse);
}
}
}
所以在这个例子中我有几个测试,最后一个将在下一个 activity 上执行。
2) 否定 - 我已经尝试通过 JUnit 测试套件启动我所有的测试(classes),所以我只是把我所有的 classes(其中还包括测试和活动的规则)到 Junit 套件(这个场景根本不起作用):
@RunWith(Suite.class)
@Suite.SuiteClasses(
{
ESP_test1.class,
ESP_test2.class,
ESP_test3.class
})
public class ESP_start {}
这是我在上面发布的同一个问题:
我如何从使用不同活动和规则的单独测试创建套件,它应该是什么样子?
以防万一,也许答案对其他人有用,这个套件是正确的,以前我在我的测试中使用过参数-类。
在这种情况下,app test-类 应该是无效的,没有任何参数:
@RunWith(Suite.class)
@Suite.SuiteClasses(
{
ESP_test1.class,
ESP_test2.class,
ESP_test3.class
})
public class ESP_start {}
此外,您可以像这样在 kotlin 中使用,请参考下面的代码。
@RunWith(Suite::class)
@Suite.SuiteClasses(
ESP_test1::class,
ESP_test2::class,
ESP_test3::class,
ESP_test4::class
)
class TestSuite
我刚开始研究 Espresso 测试,但我搜索了 Whosebug 主题,但找不到满足我需要的解决方案。
史前我的问题:
我的 android 申请有很多活动。通常会为应用程序的不同流程创建单独的 UI 测试(每个流程都需要单独的 activity,因此我在不同的 classes 中实施了测试)。 在我的案例背景和 UI usync 发生时,这就是为什么我不能从第一个 activity 开始并继续进行下一个和下一个。 我找到的唯一解决方案,它真正适用于当前的应用程序 - 为应用程序活动使用闲置资源。
问题: 所以现在我试图了解如何将所有这些单独的 classes(每个 class 使用自己的规则和这些规则的活动)放入功能套件?
我的经验:
1) 正面 - 使用闲置资源需要更改开发者的源代码,但套件中仍然只有一个activity:
@RunWith(AndroidJUnit4.class)
public class forSeveralActs {
@Rule
public final ActivityTestRule<TargetedActivity> mTargetedActivityRule = new ActivityTestRule<>(TargetedActivity.class, true, true);`
final String username = "test@mail.com";
final String password = "12345678";
private IdlingResource mIdlingRecourse;
@Before
public void setIdleResource() {
mIdlingRecourse = mTargetedActivityRule.getActivity().getIdlingResource();
Espresso.registerIdlingResources(mIdlingRecourse);
}
@Test
public void PassPermission_and_goto_MainActivity() {
// First activity - LoginActivity
Espresso.onView(withId(R.id.activity_login_et_login))
.perform(ViewActions.typeText(username));
Espresso.onView(withId(R.id.activity_login_et_password))
.perform(ViewActions.typeText(password))
.perform(closeSoftKeyboard());
Espresso.onView(withId(R.id.activity_login_btn_login))
.check(matches(isDisplayed()))
.check(matches(isClickable()))
.perform(ViewActions.click());
// Here is elements of second activity - MainActivity, without idling methods I can't reach this element
Espresso.onView(withId(R.id.helpMeCard_title))
.check(matches(withText("help_me")));
}
@After
public void unregisteredIdlingResource() {
if (mIdlingRecourse != null) {
Espresso.unregisterIdlingResources(mIdlingRecourse);
}
}
}
所以在这个例子中我有几个测试,最后一个将在下一个 activity 上执行。
2) 否定 - 我已经尝试通过 JUnit 测试套件启动我所有的测试(classes),所以我只是把我所有的 classes(其中还包括测试和活动的规则)到 Junit 套件(这个场景根本不起作用):
@RunWith(Suite.class)
@Suite.SuiteClasses(
{
ESP_test1.class,
ESP_test2.class,
ESP_test3.class
})
public class ESP_start {}
这是我在上面发布的同一个问题: 我如何从使用不同活动和规则的单独测试创建套件,它应该是什么样子?
以防万一,也许答案对其他人有用,这个套件是正确的,以前我在我的测试中使用过参数-类。 在这种情况下,app test-类 应该是无效的,没有任何参数:
@RunWith(Suite.class)
@Suite.SuiteClasses(
{
ESP_test1.class,
ESP_test2.class,
ESP_test3.class
})
public class ESP_start {}
此外,您可以像这样在 kotlin 中使用,请参考下面的代码。
@RunWith(Suite::class)
@Suite.SuiteClasses(
ESP_test1::class,
ESP_test2::class,
ESP_test3::class,
ESP_test4::class
)
class TestSuite