码迷,mamicode.com
首页 > 其他好文 > 详细

Robotium简要学习

时间:2015-01-15 19:47:19      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

 

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();
    }
}
View Code

通过以上代码可知,在编写测试类的时候,需要注意的是:

  • 测试类需要继承自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简要学习

标签:

原文地址:http://www.cnblogs.com/lan4/p/4226921.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!