完善测试框架-手机测试Robotium实战教程(4)

发表于:2015-12-15 10:39

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:杨志伟    来源:51Testing软件测试网原创

  (51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。)
  同样在这个包下再新建一个类用来编写网络操作相关的方法,类名为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"/>
本文选自《手机测试Robotium实战教程》第六章,本站经人民邮电出版社和作者的授权。
版权声明:51Testing软件测试网获人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。
ADT插件的安装-手机测试Robotium实战教程(3)
22/2<12
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号