自己动手修改Robotium代码

来源:互联网 发布:农村淘宝经营计划书 编辑:程序博客网 时间:2024/06/05 02:58
本博在《通过Maven编译Robotium》一文中已经介绍了如何导入和编译Robotium项目源码。Robotium作为Android自动化测试框架,还有许多不完善的地方,也不能满足测试人员的所有要求。那么,本文以四个实际中碰到的问题为例,介绍改动Robotium源码的过程。

1.solo.waitForActivity(String name, int timeout)传入参数改进
waitForActivity函数,是用来判断在timeout时间段内,是否出现了以name为名的Activity。但是从Robotium的源代码中,我们可以清楚地看到,这个name,并不是某个Activity的全名,而是某个Activity的SimpleName。

例如某个Activity全名为com.renren.mobile.android.WelcomeScreen,那么它的SimpleName可能是WelcomeScreen,也有可能是android.WelcomeScreen,这得根据这个app在编译的时候是如何打包的而定。对于Android自动化测试人员来说(特别是未参与被测试APP的开发的测试人员),更希望往waitForActivity函数中传入Activity的全名而非SimpleName。

对solo.waitForActivity函数抽丝剥茧,层层深入,发现Waiter.java中的这段函数揭示了一切:

public boolean waitForActivity(String name, int timeout){
   Activity currentActivity = activityUtils.getCurrentActivity(false);
   final long endTime = SystemClock.uptimeMillis() + timeout;

   while(SystemClock.uptimeMillis() < endTime){
       if(currentActivity != null && currentActivity.getClass().getSimpleName().equals(name)) {
           return true;
       }
       
       sleeper.sleep(MINISLEEP);
       currentActivity = activityUtils.getCurrentActivity(false);
   }
   return false;
}

函数中判断当前的Activity和传入的name是否一致,使用了currentActivity.getClass().getSimpleName().equals(name)。于是,我把getSimpleName()改为getName(),这样以后使用solo.waitForActivity函数时,传入Activity的全名就好。


2.添加solo.assertViewShown(String message, View view, int timeout)函数
每一个UI元素都可以称之为View。有一个实际的需求:一个滚动条View,在触发A按钮前不显示,在触发A按钮后才显示。我需要在触发A按钮后10秒内判断该View是否显示。于是我就自己添加solo.assertViewShown(String message, View view, int timeout)函数,来满足这个需求。

Solo.java中添加:

public void assertViewShown(String message, View view, int timeout)
{
   asserter.assertViewShown(message, view, timeout);
}    

Asserter.java中添加:

public void assertViewShown(String message, View view, int timeout)
{
   Assert.assertTrue(message, waiter.isViewShown(view, timeout));
}

Waiter.java中添加:

public boolean isViewShown(View view, int timeout){
   if(view == null)
       return false;
   long endTime = SystemClock.uptimeMillis() + timeout;

   while (SystemClock.uptimeMillis() < endTime{
       if(view.isShown())
           return true;
       sleeper.sleep(MINISLEEP);
   }
   return false;
}

由于篇幅有限,还有几处改进请见另一篇博文:自己动手修改Robotium代码(下)。

引自:http://maider.i.sohu.com/blog/view/259585513.htm
原创粉丝点击