同样在这个包下再新建一个类用来编写网络操作相关的方法,类名为NetworkUtil,这个方法代码行数比较多,就不贴出来了,读者可以到网盘里第6章中选择下载。上面的Util和NetworkUtil属于工具类,代码网上搜索就有很多,开发基础比较薄弱的同学看不大明白,也不用担心,可以先拿过来用,等有时间再慢慢看,暂时理解不了也不会影响后面章节的阅读。
这里需要注意的是,唤醒手机、解锁、网络操作都需要在源码的AndroidManifest.xml文件中添加权限声明,否则运行时会报错。注意是在todolist项目中的AndroidManifest文件添加声明,而不是在todolisttest中。添加的声明如下。
<uses-permissionandroid:name="android.permission.WAKE_LOCK"/>
<uses-permissionandroid:name="android.permission.DISABLE_KEYGUARD"/>
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/>
编写工具类后,就可以在抽象父类中调用这些工具类了,先编写抽象父类BasicTestCase如下。
package com.example.todolist.test; import android.os.PowerManager; import android.test.ActivityInstrumentationTestCase2; import com.example.todolist.LoginActivity; import com.example.todolist.test.utils.NetworkUtil; import com.example.todolist.test.utils.Util; import com.Robotium.solo.Solo; abstractpublicclass BasicTestCase extends ActivityInstrumentationTestCase2<LoginActivity> { private Solo solo; private PowerManager.WakeLock wakeScreenObject = null; public BasicTestCase() { super(LoginActivity.class); } /** * 复写setUp,进行异常捕获,截图处理 * * @throws Exception */ @Override protectedvoid setUp() throws Exception { // TODO Auto-generated method stub try { super.setUp(); init(); } catch (Throwable tr) { thrownew SetUpException(tr); } } /** * 复写runTest,进行捕获异常,截图处理 * * @throws Throwable */ @Override protectedvoid runTest() throws Throwable { // TODO Auto-generated method stub try { super.runTest(); } catch (junit.framework.AssertionFailedError afe) { solo.takeScreenshot(this.getClass().getSimpleName()); throwafe; } catch (Throwable th) { solo.takeScreenshot(this.getClass().getSimpleName()); thrownew RunTestException(th); } } /** * 复写tearDown,进行异常捕获,截图处理 * * @throws Exception */ @Override protectedvoid tearDown() throws Exception { // TODO Auto-generated method stub try { if (wakeScreenObject != null) { wakeScreenObject.release(); wakeScreenObject = null; } super.tearDown(); } catch (Throwable th) { solo.takeScreenshot(this.getClass().getSimpleName()); thrownew TearDownException(th); }finally{ solo.finishOpenedActivities(); } } privatevoid init() { solo = new Solo(getInstrumentation(), getActivity()); // 唤醒设备 if (wakeScreenObject == null) { wakeScreenObject = Util.wakeScreen(this); } // 解锁 Util.unlock(getInstrumentation()); // 连接网络 NetworkUtil.setAirplaneModeOffAndNetworkOn(getInstrumentation() .getTargetContext()); } /** * 只有setUp没有被包含在异常处理中,重写runBare,把异常处理加进去 * * @throws Throwable */ @Override publicvoid runBare() throws Throwable { try { super.runBare(); } catch (SetUpException smte) { solo.takeScreenshot(this.getClass().getSimpleName()); this.tearDown(); throwsmte; } } /** * 3个自定义的异常类,分别对应setUp时发生的异常、runTest发生时的异常和tearDown发生时的异常 * * @authorhiworld * */ class SetUpException extends Exception { privatestaticfinallongserialVersionUID = 1L; SetUpException(Throwable e) { super("Error in BasicTestCase.setUp()!", e); } } class RunTestException extends Exception { privatestaticfinallongserialVersionUID = 2L; RunTestException(Throwable e) { super("Error in BasicTestCase.runTest()", e); } } class TearDownException extends Exception { privatestaticfinallongserialVersionUID = 3L; TearDownException(Throwable e) { super("Error in MultiTestCase.tearDown()", e); } } } |
代码说明:
这个抽象父类中,重写了setUp、runTest、tearDown方法,只要是为了把异常处理逻辑添加进去,发生异常时都会添加截屏处理,为后续分析用例运行失败提供线索。
重写runBare的目的是,因为查看JUnit的源码可以得知setUp并未被包含在异常处理块中:
public void runBare() throws Throwable { Throwable exception = null; setUp(); try { runTest(); } catch (Throwable running) { exception = running; } finally { try { tearDown(); } catch (Throwable tearingDown) { if (exception == null) exception = tearingDown; } } if (exception != null) throw exception; } |
所以重写了runBare,在这个代码块中,添加了捕获setUp发出的异常,测试程序如果在setUp发送异常了,就会在这里被捕获,进行截图处理,然后进入tearDown程序块,进而使测试程序正常退出。
这里还需要注意的是,因为是通过solo.takeScreenshot方法来截屏的,调用这个方法需要在被测工程,也就是todolist的AndroidManifest.xml添加如下权限声明,才可以成功截屏。
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。