《软件测试技术实战 设计、工具及管理》联载-38

简介: 《软件测试技术实战 设计、工具及管理》联载-38

11.1.5  案例分析


案例11-19:图片切换APP

图片切换APP的功能:打开图片切换APP,名字为Demo5,页面上存在图片A和图片B。图片A是显示的,图片B是隐藏的。点击手机屏幕,图片A变为隐藏的,图片B变为显示的。再点击手机屏幕,图片A变为显示的,图片B变为隐藏的,如此循环。APP代码如下(这里仅给出MainActivety.java):

package com.example.demo5;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
public class MainActivity extends Activity {
private FrameLayout root;
private ImageView ivA,ivB;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        root =(FrameLayout)findViewById(R.id.root);
        ivA =(ImageView)findViewById(R.id.imageView1);
        ivB =(ImageView)findViewById(R.id.imageView2);
        showA();
    }
    public void rootClick(View view){
        if (ivA.getVisibility()==View.VISIBLE){
            showB();
        }else{
            showA();
        }
    }
    private void showA(){
        ivA.setVisibility(View.VISIBLE);
        ivB.setVisibility(View.INVISIBLE);
    }
    private void showB(){
        ivA.setVisibility(View.INVISIBLE);
        ivB.setVisibility(View.VISIBLE);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button,so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}


测试用例的步骤是:

1)显示所有APP

2)找到需要测试的APPDemo5

3)进入Demo5,向左旋转屏幕。

4)点击屏幕,图片A消失,图片B显示。

5)再次点击屏幕,使得图片A显示,图片B消失。

6)测试结束。


测试代码如下:

package com.jerry;
import android.os.RemoteException;
import android.widget.ListView;
import android.widget.Switch;
import com.android.uiautomator.testrunner.UiAutomatorTestCase;
import com.android.uiautomator.core.UiDevice;
import com.android.uiautomator.core.UiObject;
import com.android.uiautomator.core.UiObjectNotFoundException;
import com.android.uiautomator.core.UiScrollable;
import com.android.uiautomator.core.UiSelector;
public void myDemo() throws UiObjectNotFoundException {
        // 模拟HOME键点击事件
        getUiDevice().pressHome();
        // 现在打开了主屏应用,模拟点击所有应用按钮操作,来启动所有应用界面
        // 如果使用了uiautomatorviewer查看主屏,则可以发现“所有应用”按钮的
        // content-description属性为“Apps”。可以使用该属性找到该按钮
        UiObject allAppsButton = new UiObject(new UiSelector().description("Apps"));
        // 模拟点击所有应用按钮,并等待所有应用界面起来
        allAppsButton.clickAndWaitForNewWindow();
        // 在所有应用界面,时钟应用位于Apps tab界面中。下面模拟用户点击Apps tab操作
        // 找到appstab按钮
        UiObject appsTab = new UiObject(new UiSelector().text("Apps"));
        // 模拟点击appstab
        appsTab.click();
        // 然后在appstab界面模拟用户滑动到Demo5应用的操作
        // 由于Apps界面是可以滚动的,所以用UiScrollable对象
        UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
        // 设置滚动模式为水平滚动(默认为垂直滚动)
        appViews.setAsHorizontalList();
        if (allAppsButton.exists() && allAppsButton.isEnabled()) {
            // allAppsButton在当前界面已经不可见了 所以这里不会执行
            allAppsButton.click();
        }
        // 查找应用,并点击
        UiObject settingsApp = appViews.getChildByText(
        new UiSelector().className(android.widget.TextView.class.getName()),"Demo5");
        settingsApp.clickAndWaitForNewWindow();
      //向左转
        try {
            UiDevice.getInstance().setOrientationLeft();
        } catch (RemoteException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 模拟点击Demo5
        UiObject myroot=new UiObject(new UiSelector().className("android.view.View").instance(0));
        myroot.click();
        sleep(3000);
        myroot.click();
        sleep(3000);
        getUiDevice().pressHome();
 }
    public static void main(String[] args){
        String jarName="myTest";
        String testClass="com.jerry.myTest";
        String testName="myDemo";
        String androidID="1";
        new UiAutomatorHelper(jarName,testClass,testName,androidID);
        }
}


这段代码的头部可以通用,所以可以封装一个类,建立代码Enter.java

packagecom.jerry;
importcom.android.uiautomator.testrunner.UiAutomatorTestCase;
importcom.android.uiautomator.core.UiObject;
importcom.android.uiautomator.core.UiObjectNotFoundException;
importcom.android.uiautomator.core.UiScrollable;
importcom.android.uiautomator.core.UiSelector;
public class Enter extends UiAutomatorTestCase {
    public static String App=null;
    public Enter(String App){
         this.App=App;
    }
    public void comming() throws UiObjectNotFoundException{
         // 现在打开了主屏应用,模拟点击所有应用按钮操作来启动所有应用界面。
         // 如果你使用了uiautomatorviewer来查看主屏,则可以发现“所有应用”按钮的
         // content-description 属性为“Apps”。可以使用该属性来找到该按钮。
         UiObject allAppsButton = new UiObject(new UiSelector().description("Apps"));
         // 模拟点击所有应用按钮,并等待所有应用界面起来
         allAppsButton.clickAndWaitForNewWindow();
         // 在所有应用界面,App应用位于Apps tab界面中。下面模拟用户点击Apps tab操作。
         //找到 Apps tab 按钮
         UiObject appsTab = new UiObject(new UiSelector().text("Apps"));
         //模拟点击 Apps tab.
         appsTab.click();
         // 然后在 Appstab界面,模拟用户滑动到时钟应用的操作。
         //由于Apps界面是可以滚动的,所有用
         // UiScrollable 对象.
         UiScrollable appViews = new UiScrollable(new UiSelector().scrollable(true));
         // 设置滚动模式为水平滚动(默认为垂直滚动)
         appViews.setAsHorizontalList();
         if (allAppsButton.exists() && allAppsButton.isEnabled()) {
             //allAppsButton在当前界面已经不可见了所以这里不会执行
             allAppsButton.click();
         }
         // 查找this.App应用并点击
         UiObject settingsApp =appViews.getChildByText(
         new UiSelector().className(android.widget.TextView.class.getName()), this.App);
         settingsApp.clickAndWaitForNewWindow();
    }
}


我们如果要测试一个APP,在开始只要建立Enter类的构建,构建参数为显示在Android手机屏幕菜单上的名字。这样我们的代码将变为:

public void myDemo() throwsUiObjectNotFoundException {
       // 模拟 HOME 键点击事件
       getUiDevice().pressHome();
       Enter enter=new Enter("Demo5");
       enter.comming();
       // 左转
       try {
            UiDevice.getInstance().setOrientationLeft();
       } catch (RemoteException e) {
            e.printStackTrace();
       }
       UiObject myroot=new UiObject(newUiSelector().className("android.view.View").instance(0));
       myroot.click();
       sleep(8000);
       myroot.click();
       sleep(8000);
       UiDevice.getInstance().pressHome();
}


在这里屏幕菜单显示的APPDemo5,所以只要在构建的时候使用Enter enter=newEnter("Demo5");即可。


案例11-20:注册登录APP

进入注册登录APP,显示如图11-46所示,如果是注册用户,可以在这里输入用户名和密码,然后点击【登录】按键进行登录。否则点击【进行注册】按钮,进入注册页面,如图11-47所示。登录成功显示登录成功信息,如图11-48所示。为了测试方便,临时在首页加了一个按键【清除】,功能是清除所有注册的用户信息。

测试步骤为:

1)调用案例11-19中的Enter类找到测试程序Demo4

                   

image.png

 

11-46  登录页面  

image.png

11-47  注册页面

image.png

11-48  登录成功页面


2)进入注册页面,输入注册信息。

3)返回登录页面进行登录。

4)通过判断登陆成功页面的元素是否存在来判断登录是否成功

5)退出登录

6)清空数据库


测试代码如下:

public void CheckDemo4() throwsUiObjectNotFoundException {
       Stringusername = "Guxiang";
       Stringpassword = "123456";
       // 模拟 HOME 键点击事件
       getUiDevice().pressHome();
       Enterenter=new Enter("Demo4");
       enter.comming();
       //注册
       UiSelectorbuton=new UiSelector().resourceId("com.example.demo4:id/button2");
       UiObjectobj = new UiObject(buton);
       obj.click();
       // 输入注册信息
       UiSelector enusername=newUiSelector().resourceId("com.example.demo4:id/username1");
       obj =new UiObject(enusername);
       obj.clearTextField();
       obj.setText(username);
       UiSelector enpassword=newUiSelector().resourceId("com.example.demo4:id/password1");
       obj =new UiObject(enpassword);
       obj.clearTextField();
       obj.setText(password);
       UiSelectorbutton=new UiSelector().resourceId("com.example.demo4:id/button11");
       obj =new UiObject(button);
       obj.click();
       //输入登录信息
       enusername=newUiSelector().resourceId("com.example.demo4:id/username");
       obj =new UiObject(enusername);
       obj.clearTextField();
       obj.setText(username);
       enpassword=newUiSelector().resourceId("com.example.demo4:id/password");
       obj =new UiObject(enpassword);
       obj.clearTextField();
       obj.setText(password);
       button=newUiSelector().resourceId("com.example.demo4:id/button1");
       UiObjectobj4 = new UiObject(button);
       obj4.click();
       UiSelector welcomeinfo=newUiSelector().resourceId("com.example.demo4:id/welcomeinfo");
       UiObjectobj1 = new UiObject(welcomeinfo);
       //通过判断登陆成功页面的元素是否存在来判断登录是否成功
       if(obj1.exists ())
       {
          System.out.println("Objectexists!");
       }else{
          System.out.println("Objectis not exist!");
       }
       //退出
       button=newUiSelector().resourceId("com.example.demo4:id/logout");
       obj =new UiObject(button);
       obj.click();
       //清空数据库
       button=newUiSelector().resourceId("com.example.demo4:id/exit");
       obj =new UiObject(button);
       obj.click();
       UiDevice.getInstance().pressHome();
}


更多关于UiAutomator的知识,见参考文献【11】。


顾翔凡言:

不是好的工作会给你带来好的心情,而是好的心情会给你带来好的工作。

目录
相关文章
|
缓存 网络协议 关系型数据库
《软件测试技术实战 设计、工具及管理》联载-22
《软件测试技术实战 设计、工具及管理》联载-22
103 0
《软件测试技术实战 设计、工具及管理》联载-22
|
测试技术
《软件测试技术实战 设计、工具及管理》联载-8
《软件测试技术实战 设计、工具及管理》联载-8
89 0
《软件测试技术实战 设计、工具及管理》联载-8
|
前端开发 Oracle 关系型数据库
软件测试技术实战 设计、工具及管理》联载-21
软件测试技术实战 设计、工具及管理》联载-21
114 0
软件测试技术实战 设计、工具及管理》联载-21
|
监控 Oracle 关系型数据库
软件测试技术实战 设计、工具及管理》联载-34
软件测试技术实战 设计、工具及管理》联载-34
78 0
软件测试技术实战 设计、工具及管理》联载-34
|
测试技术
《软件测试技术实战 设计、工具及管理》联载-47
《软件测试技术实战 设计、工具及管理》联载-47
95 0
《软件测试技术实战 设计、工具及管理》联载-47
|
测试技术
《软件测试技术实战 设计、工具及管理》联载-7
《软件测试技术实战 设计、工具及管理》联载-7
132 0
《软件测试技术实战 设计、工具及管理》联载-7
|
存储 分布式计算 网络协议
软件测试技术实战 设计、工具及管理》联载-28
软件测试技术实战 设计、工具及管理》联载-28
138 0
软件测试技术实战 设计、工具及管理》联载-28
|
搜索推荐 Java 测试技术
软件测试技术实战 设计、工具及管理》联载-35
软件测试技术实战 设计、工具及管理》联载-35
84 0
软件测试技术实战 设计、工具及管理》联载-35
|
监控 网络协议 测试技术
《软件测试技术实战 设计、工具及管理》联载-23
《软件测试技术实战 设计、工具及管理》联载-23
75 0
《软件测试技术实战 设计、工具及管理》联载-23
|
SQL 前端开发 关系型数据库
《软件测试技术实战 设计、工具及管理》联载-4
《软件测试技术实战 设计、工具及管理》联载-4
61 0
《软件测试技术实战 设计、工具及管理》联载-4
下一篇
无影云桌面