我们在做自动化的时候,偶尔会遇到测试用例莫名其妙的失败,再次运行又OK的情况。针对这种情况我们有必要在测试用例操作失败时自动重跑 来避免不必要的核查。
那么针对robotium框架该如何实现自动重跑测试用例呢?
导致测试用例中止可能会有以下几种情况:
1、我们自己的断言 junit.framework.AssertionFailedError(有bug的情况)这个类的根类是Error
2、测试用例抛出exception
3、被测应用进程crash
对于第一种情况,是我们不需要重跑的,第三种情况crash我们今天的方法还无法重跑(个人观点robotium针对crash的重跑是没有意义的),那么第二种情况才是我们应该重跑的情况
接下来我们就来实际操作如何重跑用例,在继承ActivityInstrumentationTestCase2的类中复写runTest直接看到代码(都有注释就不多说了)
@Override
protected void tearDown() throws Exception {
solo.finishOpenedActivities();
}
@Override
protected void runTest() throws Throwable {
int times = 2;//重试次数
while (true) {
try {
super.runTest();
Log.e("123",this.getClass().getSimpleName() + "/"+getName()+":测试成功");
break;
} catch (Exception e) {//测试过程发生Exception后的处理
if (times > 0) {
times--;
tearDown();//释放资源
Runtime run = Runtime.getRuntime();
try {
//启动被测app
run.exec("am start --user 0 -n 被测app包名/被测app launchactivity");
} catch (Exception e1) {
throw new RunTestException(e1);
}
setUp();//初始化重新开始
continue;
} else {
solo.takeScreenshot(this.getClass().getSimpleName() + "/"+getName());
Log.e("123",this.getClass().getSimpleName() + "/"+ getName() + ":测试执行过程中出现异常");
throw new RunTestException(e);
}
} catch (AssertionFailedError e2) {
Log.e("123", this.getClass().getSimpleName() + "/"+getName() + ":测试失败");
solo.takeScreenshot(this.getClass().getSimpleName() + "/"+getName());
throw new OperationErrorException(e2);
}
}
}
接下来我们试一试,直接在测试用例中跑出一个异常,重跑2次
public void testCase_001() {
solo.sleep(5000);
Log.e("123", "启动测试123");
throw new RuntimeException("运行时异常");
}
我们的logcat中打印信息为:
02-10 15:19:17.263 26812-26849/? E/123: 启动测试123
02-10 15:19:23.923 26812-26849/? E/123: 启动测试123
02-10 15:19:30.273 26812-26849/? E/123: 启动测试123
02-10 15:19:30.403 26812-26849/? E/123: TestDemo/testCase_001:测试执行过程中出现异常
先跑的一次+重跑的2次正好打印了3次,看来我们的重跑是成功的(也可以在设备上观察是否重跑了)
那我们再来看看断言错误是如何处理的,同样重启次数定义为2,在测试用用例直接面断言错误,
public void testCase_001() {
solo.sleep(5000);
Log.e("123", "启动测试123");
assertTrue(false);
}
运行后logcat的结果为:
02-10 15:31:14.657 32393-32428/? E/123: 启动测试123
02-10 15:31:14.657 32393-32428/? E/123: TestDemo/testCase_001:测试失败
正常断言失败后并未重跑达到了我们的目的。
如果有其它问题或不清楚的地方还请留言