我有一个Android检测测试,用于测试我的ServerApi和多个其他测试工具,例如我的活动。
ServerApi测试失败的原因之一是(遗憾的是)wifi损坏。在这种情况下,我的整个测试套件需要很长时间才能完成,因为处理网络访问的所有活动都必须在失败之前遇到超时。
如何定义ServerApiTest在开始时运行,如果失败,取消所有其他以下测试?
public class ServerApiTest extends ApplicationTestCase<Application> {
//...
public ServerApiTest() {
super(Application.class);
}
@Override
public void setUp() throws Exception {
Log.i(TAG, SERVER_KEYWORD + ": prepare");
super.setUp();
_context = getContext();
}
@Override
public void tearDown() throws Exception {
Log.i(TAG, SERVER_KEYWORD + ": cleanUp");
super.tearDown();
}
public void testPing() throws InterruptedException, ExecutionException,
URISyntaxException {
//...
}
作为一个活动测试之一的摘录:
@RunWith(AndroidJUnit4.class)
@MediumTest
public class RecordingActivityTest {
private static final String TAG = RecordingActivityTest.class.getSimpleName();
@Rule
public ActivityTestRule<RecordingActivity> _activityRule
= new ActivityTestRule<>(RecordingActivity.class);
@Test
public void testOnCreate() {
onView(withId(R.id.lytRecordingButtons)).check(
matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE)));
}
//...
有趣的是,我在测试报告中观察到,如果某些测试失败,在某些(罕见且尚未解释)的情况下,测试套件确实似乎中止了。
请参阅屏幕截图:RecordingActivityTest失败,测试次数报告为25.但是测试中没有任何变化(仅修复导致RecordingActivityTest失败的错误),下一次构建再次正确地显示了所有43次测试 - 巧合现在,由于WiFi损坏,测试失败了。
无论是什么导致测试都没有被执行,我可以将这种机制用于我想要实现的目标吗?
答案 0 :(得分:1)
如果运行测试需要稳定的Wifi,并且您希望跳过它们,则可以实现自定义TestRule,您可以在该规则中的自定义语句中执行Wifi检查。在该语句的evaluate方法中,然后调用Assume.assumeTrue("Skip test due to poor Wifi connection", methodThatReturnsTrueIfWifiIsUp())
。然后,您可以将此规则添加到需要Wifi的每个测试类中,如果网络查找需要很长时间才能完成,并且您不想为每个测试类执行此操作,则可能存储静态连接状态。