首页 > 代码库 > Robotium简要学习
Robotium简要学习
Robotium是一款国外的Android自动化测试框架,主要针对Android平台的应用进行黑盒自动化测试,它提供了模拟各种手势操作(点击、长按、滑动等)、查找和断言机制的API,能够对各种控件进行操作。Robotium结合Android官方提供的测试框架达到对应用程序进行自动化的测试。另外,Robotium 4.0版本已经支持对WebView的操作。Robotium 对Activity,Dialog,Toast,Menu 都是支持的。
更多的Robotium文档可查询Robotium中文网站或者Robotium英文网站
Android代码:
package com.testshipping;import android.test.ActivityInstrumentationTestCase2;import android.text.format.Time;import android.util.Log;import android.view.View;import android.widget.TextView;import com.robotium.solo.Solo;//import android.widget.RelativeLayout;@SuppressWarnings("rawtypes")public class TestShipping extends ActivityInstrumentationTestCase2 { private static final String LAUNCHER_ACTIVITY_FULL_CLASSNAME = "com.ziipin.ship.ui.LauncherActivity"; private static final String Tag = "ShippingLog"; private static Class launcherActivityClass; private static String phone_no = ""; private static String phone_sc = ""; private static final int ticket_pay_way = 3; //默认使用现金账户支付,2为支付宝快捷支付,3为微信支付 private static int now_day; private boolean is_login = true; //// public TestShipping(Class activityClass) {// super(activityClass);// // TODO Auto-generated constructor stub// } static{ try{ launcherActivityClass = Class.forName(LAUNCHER_ACTIVITY_FULL_CLASSNAME); }catch(ClassNotFoundException e){ throw new RuntimeException(e); } } @SuppressWarnings("unchecked") public TestShipping() throws ClassNotFoundException{ super(launcherActivityClass); } private Solo solo; @Override protected void setUp() throws Exception{ solo = new Solo(getInstrumentation(),getActivity());// getUserInfo(); Log.v(Tag,"get activity。。。"); } @Override public void tearDown() throws Exception{ try{ solo.finalize(); }catch (Throwable e){ e.printStackTrace(); } solo.finishOpenedActivities(); super.tearDown(); } public void testLogin() throws Exception{ Log.v(Tag, "testLogin is starting");// final String CurrentActivity; solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 5000); //点击进入买船票的页面 View textView = solo.getCurrentActivity().findViewById(4);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(textView); if (solo.searchText("忘记密码")){ Log.v(Tag,"未登录,进入登录界面"); Log.v(Tag,"starting ooooo"); solo.clearEditText(0); solo.enterText(0, phone_no); solo.clearEditText(1); solo.enterText(1, phone_sc); solo.clickOnButton("登录"); } if (solo.searchText("充值")){ Log.v(Tag, "已登录,登录成功..."); Log.v(Tag, "get_user_info is success."); //TODO 截图操作 solo.clickOnText("消费明细"); solo.scrollDown(); solo.goBack(); } solo.clickOnText("退出登录"); solo.waitForDialogToOpen(1000); solo.clickOnButton("确认"); } public boolean IsLogout(){ try{ solo.clickOnText("退出登录"); solo.waitForDialogToOpen(1000); solo.clickOnButton("确认"); return true; }catch(Exception e){ e.printStackTrace(); return false; } } public void testLogout() throws Exception{ solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 5000); View textView = solo.getCurrentActivity().findViewById(4); solo.clickOnView(textView); if(solo.searchText("充值")){ if(IsLogout()){ solo.sleep(1000); if(solo.searchText("忘记密码")){ Log.v(Tag,"登出成功"); }else{ Log.v(Tag,"登出失败"); } }else{ Log.v(Tag,"登出失败"); } } if(solo.searchText("忘记密码")){ } } public void testMyOrderAndPay() throws Exception{ Log.v(Tag,"我的订单"); String clickorder = "本地订单"; is_login = IsLogin(); solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 1000); //点击进入买船票的页面 View textView = solo.getCurrentActivity().findViewById(5);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(textView); if(is_login){ //TODO clickorder = "我的订单"; }else{ //TODO clickorder = "本地订单"; } solo.clickOnButton(clickorder); solo.clickOnButton("查询订单"); solo.clickOnButton(clickorder); solo.clickOnButton(3);//本地订单,查询订单,船票订单;分别对应button index未1,2,3 if(solo.searchText("未使用")){ solo.clickOnText("未使用"); solo.sleep(1000); if(solo.searchText("订单一")){ if(solo.searchButton("立即付款")){ solo.clickOnButton("立即付款"); SelectPayWay(is_login); }// // if(solo.searchText("发送朋友")){// solo.clickOnText("发送朋友",1);// solo.waitForDialogToOpen();// solo.enterText(0, phone_no);// solo.clickOnButton("发送");// } }// solo.clickOnText("历史");// solo.sleep(1000);// solo.goBack(); } // solo.sleep(1000);// solo.clickOnText("查询订单");// solo.enterText(0, phone_no);//// solo.clickOnButton("获取验证码");// solo.goBack(); } @SuppressWarnings("unused") public void testMyOrderAndCancelPay() throws Exception{ Log.v(Tag,"我的订单"); final String clickorder ; is_login = IsLogin(); solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 1000); //点击进入买船票的页面 View textView = solo.getCurrentActivity().findViewById(5);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(textView); if(is_login){ //TODO clickorder = "我的订单"; }else{ //TODO clickorder = "本地订单"; } solo.clickOnButton(3); if(solo.searchText("订单一")){ if(solo.searchButton("取消订单")){ solo.clickOnButton("取消订单"); solo.waitForDialogToOpen(1000); solo.clickOnButton("放弃取消"); } solo.waitForDialogToClose(1000); if(solo.searchButton("取消订单")){ solo.clickOnButton("取消订单"); solo.waitForDialogToOpen(1000); solo.clickOnButton("确认取消"); } } } public void testOrderSingleTicket() throws Exception{ Log.v(Tag,"买单程船票"); Log.v(Tag,"testOrderSingleTicket。。。。"); solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 5000); is_login=IsLogin(); //点击进入买船票的页面 View BuyTicket = solo.getCurrentActivity().findViewById(3);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(BuyTicket); solo.clickOnRadioButton(0);//页面使用RadioButton(单程)为0,往返为1 //选择出发地点 Log.v(Tag, "选择出发地点"); solo.clickOnText("出发地点"); solo.clickOnText("广州-番禺莲花山"); solo.sleep(1000); //选择到达地点 Log.v(Tag, "选择到达地点"); solo.clickOnText("到达地点"); solo.clickOnText("香港-中港码头"); solo.sleep(1000); //选择出发日期 Log.v(Tag, "选择出发日期"); solo.clickOnText("出发日期"); //获取需要点击的时间日 int day = GetCurrentDay(); if(day<=10){ //day为index day = day + 30; }else{ day = day + 39; } View time_day = null; time_day = solo.getView(TextView.class, day); solo.clickOnView(time_day); solo.clickOnButton("选择航班"); //获取航班列表,固定选取当前能选取的最后的航班// ArrayList<TextView> list = solo.clickInList(0);// if (list.isEmpty()){// solo.clickOnText("前一天");// } solo.sleep(500); solo.clickInList(3, 0); solo.clickOnText("普通舱"); solo.clickOnText("头等舱"); solo.clickOnButton(3); solo.clickOnButton(5); solo.clickOnText("立即购票"); if(solo.waitForDialogToOpen(1000)){ Log.v(Tag,"成人票和儿童票不一致"); if(solo.searchText("提示")){ solo.clickOnButton("继续"); } } SelectPayWay(is_login); Log.v(Tag,"完成买船票"); } public void testOrderDoubleTicket() throws Exception{ Log.v(Tag,"testOrderDoubleTicket starting..."); solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 5000); is_login=IsLogin(); //点击进入买船票的页面 View BuyTicket = solo.getCurrentActivity().findViewById(3);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(BuyTicket); solo.clickOnRadioButton(1);//页面使用RadioButton(单程)为0,往返为1 solo.clickOnText("出发地点"); solo.clickOnText("广州-番禺莲花山"); solo.sleep(1000); solo.clickOnText("到达地点"); solo.clickOnText("香港-中港码头"); solo.sleep(1000); solo.clickOnText("出发日期"); int day = GetCurrentDay(); if(day<=10){ //day为index day = day + 29; }else{ day = day + 38; } View time_day = null; time_day = solo.getView(TextView.class, day); solo.clickOnView(time_day); solo.clickOnText("出发航班"); solo.sleep(1000); solo.clickInList(3, 0); //返程日期使用默认输入的日期 solo.clickOnText("返程航班"); solo.clickInList(3, 0); solo.clickOnButton("下订单");// solo.clickOnButton(5); solo.clickOnButton("立即购票"); SelectPayWay(is_login); Log.v(Tag,"购票完成"); } //该方法需要在一个test最初进行调用 private boolean IsLogin(){ Log.v(Tag,"IsLogin。。。"); solo.waitForActivity(LAUNCHER_ACTIVITY_FULL_CLASSNAME, 5000); //点击进入买船票的页面 View BuyTicket = solo.getCurrentActivity().findViewById(4);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(BuyTicket); if(solo.searchText("个人账户")){ solo.goBack(); return true; } solo.goBack(); return false; } @SuppressWarnings("unused") private void Logout(){ if(IsLogin()){ View BuyTicket = solo.getCurrentActivity().findViewById(4);//3、4、5分别代表主要当中的可点击的三个,按顺序进行 solo.clickOnView(BuyTicket); solo.clickOnButton("退出登录"); } solo.goBack(); } //可能重复使用到的函数 private int GetCurrentDay(){ Time now_t = new Time(); now_t.setToNow(); now_day = now_t.monthDay; return now_day; } private void SelectPayWay(final boolean is_login){ Log.v(Tag,"Select Pay way"); if(solo.searchText("选择支付方式")){ if(!is_login){ Log.v(Tag,"未登录"); if(solo.searchText("登录/注册")){ solo.clickOnText("登录/注册"); solo.sleep(1000); if(solo.searchText("会员中心")){ //注册新用户 solo.clickOnButton("注册"); if(solo.searchText("请输入电话号码")){ solo.enterText(0, phone_no); solo.sleep(5000); if(solo.searchText("号码已存在,请重新输入")){ Log.v(Tag,"注册页面OK。。。"); solo.goBack(); } } //进入登录页面登录 solo.clearEditText(0); solo.clearEditText(1); solo.enterText(0, phone_no); solo.enterText(1, phone_sc); solo.clickOnButton("登录"); } } }else{ Log.v(Tag,"已经登录"); solo.clickOnText("充值"); solo.goBack(); } switch(ticket_pay_way){ case 2: solo.clickOnText("支付宝快捷支付"); break; case 3: solo.clickOnText("微信支付"); break; default: solo.clickOnText("现金账户支付"); break; } } solo.clickOnButton("立即支付"); solo.sleep(5000); solo.goBack(); }}
通过以上代码可知,在编写测试类的时候,需要注意的是:
- 测试类需要继承自ActivityInstrumentationTestCase2
- 需要在测试包中导入robotium-solo-x.x.x.jar,以便能够在代码中import com.robotium.solo.Solo;
- 测试类中需要有一个launcherActivityClass(启动activity),以便启动对应的测试APP,否则无法进行测试;
当然,如果要此测试类能够正常执行,还需要在androidmanifest.xml中配置。
<instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.your.packagename" />
Robotium简要学习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。