我今天做了一个简单的测试:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class WhenNavigatingToUsersView {
@Rule
public ActivityTestRule<MainActivity> mActivityRule =
new ActivityTestRule(MainActivity.class);
private MainActivity mainActivity;
@Before
public void setActivity() {
mainActivity = mActivityRule.getActivity();
onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click());
}
@Test
public void thenCorrectViewTitleShouldBeShown() {
onView(withText("This is the Users Activity.")).check(matches(isDisplayed()));
}
@Test
public void thenCorrectUserShouldBeShown() {
onView(withText("Donald Duck (1331)")).check(matches(isDisplayed()));
}
}
但是对于每个测试方法,setActivity
都会运行,如果你有10-15个方法,那么最终将耗费时间(如果你也有很多视图)。
@BeforeClass
似乎不起作用,因为它必须是静态的,因此也迫使ActivityTestRule
变为静态。
还有其他方法吗?而不是在同一个测试方法中有多个断言?
答案 0 :(得分:3)
SaveChanges()
注释应仅在包含初步设置的方法之前。初始化所需对象,获取当前会话或当前活动,您就会明白。
它正在替换ActivityInstrumentationTestCase2中的旧@Before
方法,就像setUp()
替换@After
一样。
这意味着它应该在课堂上的每个测试之前执行,它应该保持这种状态。
此方法中您应该没有tearDown()
,没有ViewInteraction
,没有DataInteraction
或Assertions
操作,因为这不是它的目的。
在您的情况下,只需从View
中移除onView()
来电并将其放入实际测试方法中,如有必要,请将其放入每个测试方法中,如下所示:
setActivity()
答案 1 :(得分:0)
另一个选择是将这些测试分开。
单击用户的图标将在HomeActivity测试类中,而其余测试将在UserActivity测试类中。
UserActivity测试类将使用正确的Intent启动UserActivity(您可以通过将false布尔值传递给Rule构造函数并手动调用launchActivity(intent)
来实现)。
这将消除每次设置活动的必要性。它也将摆脱对主要活动的持续依赖。如果出现问题,您的UserActivity测试将完好无损并产生结果,而问题将由MainActivity中的测试捕获。
实际上,通过这样做,您的测试可能会变成MediumSize,因为运行时间会急剧减少。
答案 2 :(得分:0)
你可以试试这个:
**** Setting ****
public void testStory() throws Exception {
}
public void testStory2() throws Exception {
}
public void testStory3() throws Exception {
}
尝试通过此命令运行测试:
./gradlew cC
答案 3 :(得分:0)
您是否尝试按以下方式执行此操作或根据您的需要进行微小修改:
@Rule
public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule(MainActivity.class);
private MainActivity mainActivity = mActivityRule.getActivity();
@BeforeClass
public static void setActivity() {
onView(allOf(withId(R.id.icon), hasSibling(withText(R.string.users)))).perform(click());
}
这样,你'mainActivity'不必是静态的。此外,setActivity()
方法只会被调用一次。