[Android测试] AS+Appium+Java+Win 自动化测试之九:PO模式的实例与ReportNg测试报告

一、介绍准备

http://blog.csdn.net/niubitianping/article/details/52626235 之前在这篇文章有写过一个例子,但是这个例子只实现了登录功能,封装还是不好的,也不能多个用例执行,现在来用上一篇文章封装之后的方法来写实例。封装和例子代码已打包在底部有链接

测试app: 守护2.2.4
appium: 1.4.16
os: win10
android: 小米note,android6.0

二、重写登录用例

1. 确定流程

打开app,到达欢迎界面,点击登录,输入帐号密码,登录,判断是否登录成功。

逻辑注意点:

  • 第一次打开会弹出引导页面,这个页面是另一个Activity:AboutActivity
  • 已经登录过了,就会直接到首页
  • 第一次到首页,会有一个dialog,这个会挡住首页

2. 编写page

在pages目录下新建LoginPage.java,继承PageAppium,实现登录的界面的控件获取和存放id值

package com.example.pages;

import com.example.base.PageAppium;

import java.util.List;

import io.appium.java_client.android.AndroidDriver;
import io.appium.java_client.android.AndroidElement;

/**
 * ui界面类,界面在这里处理
 * Created by LITP on 2016/9/22.
 */
public class LoginPage extends PageAppium {

    //登录界面的登录按钮
    public final String LOGIN_BUTTON_ID = "login_btn_login";
    //第一屏的登录按钮
    public final String WELCOME_LOGIN_BUTTON_ID = "welcome_login_btn";

    //成功登录到首页标识
    public final String INDEX_TEXT = "首页";

    //是否在关于屏标识
    public final String ABOUT_TEXT = "AboutActivity";

    //关于页面的按钮id
    public final String ABOUT_BUTTON_ID = "about_go_button";


    //帐号密码控件
    public final String NAME_PASS_ELEMENT = "android.widget.EditText";
    //首页控件
    public final String INDEX_ELEMENT = "tl_index";

    //登录完成之后的activity名字
    public final String INDEX_ACTIVITY_NAME = "IndexActivity";

    public LoginPage(AndroidDriver driver){
        super(driver);
    }


    /**
     * 是否在欢迎界面
     */
    public boolean isWelcome(){
        return isIdElementExist(WELCOME_LOGIN_BUTTON_ID,3,true);
    }


    /**
     * 获取关于界面的activity的名字
     * @return
     */
    public String getAboutText(){
        return ABOUT_TEXT;
    }


    /**
     * 获取关于界面的按钮
     * @return
     */
    public AndroidElement getAboutButton(){
        return waitAutoById(ABOUT_BUTTON_ID);
    }


    public AndroidElement getWelcmoeLoginButton(){
        return findById(WELCOME_LOGIN_BUTTON_ID);
    }


    public AndroidElement getLoginButton(){
        return findById(LOGIN_BUTTON_ID);
    }

    /**
     * 获取账号密码框的控件
     * @return
     */
    public List<AndroidElement> getNamePassElement(){
        return getManyElementByClassName(NAME_PASS_ELEMENT,2);
    }


    /**
     * 首页标识,是否成功登录
     * @return
     */
    public boolean getIndexflag(){
        /*AndroidElement element =  waitAutoByXp(LoginPage.INDEX_TEXT);
        return  element != null;*/

        AndroidElement element = findById(INDEX_ELEMENT);
        return element != null;
    }


    /**
     * 获取首页的一个元素,让操作程序等待
     */
    public String getIndexElementId(){
        return INDEX_ELEMENT;
    }

    /**
     * 获取首页的一个元素,让操作程序等待
     */
    public AndroidElement getIndexElement(){
        return findById(INDEX_ELEMENT);
    }


    public String getIndexActivity(){
        return INDEX_ACTIVITY_NAME;
    }

}

3. 编写用例

在cases目录下新建Login.java,继承InitAppium,实现用例的初始化操作

package com.example.cases;

import com.example.base.Assertion;
import com.example.base.InitAppium;
import com.example.operation.LoginOperate;

import org.testng.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

/**
 * 登录测试用例
 * Created by LITP on 2016/9/22.
 */

public class Login extends InitAppium {

    private LoginOperate loginOperate;


    @BeforeClass
    public void initDriver(){
        Assert.assertNotNull(driver);
        loginOperate = new LoginOperate(driver);
    }

    /**
     * 测试帐号对 密码不对情况
     */
    @Test(priority = 0)
    public void loginErrorUser(){
        boolean flag = loginOperate.login("13192624740","iuhihj");
        Assertion.verifyEquals(flag,true,"帐号对密码错误是否登录成功");
        print("帐号密码不对情况登录:"+ flag);
    }

    /**
     * 测试帐号密码规格不对情况
     */
    @Test(priority = 1)
    public void loginErrorNum(){
        boolean flag = loginOperate.login("1319262asdfsddsasdfsdfsdfsdfsdfsdf4740","dfgd#@$1234fgdsfgdsgdffds");
        Assertion.verifyEquals(flag,true,"帐号密码格式不对是否登录成功");
        print("帐号密码格式不对情况登录:"+ flag);
    }


    /**
     * 测试帐号密码为中文情况
     */
    @Test(priority = 2)
    public void loginChinese(){
        boolean flag = loginOperate.login("帐号","密码");
        Assertion.verifyEquals(flag,true,"帐号密码为中文是否登录成功");
        print("帐号密码为中文情况登录:"+ flag);
    }



    /**
     * 测试帐号密码为空情况
     */
    @Test(priority = 3)
    public void loginEmpty(){
        boolean flag = loginOperate.login("","");
        Assertion.verifyEquals(flag,true,"帐号密码为空是否登录成功");
        print("帐号密码为空情况登录:"+ flag);
    }


    /**
     * 测试帐号密码正确情况
     */
    @Test(priority = 4)
    public void loginConfim() {
        boolean flag = loginOperate.login("13192624740","xxxxxx");
        print("帐号密码对的情况登录:"+ flag);
        Assert.assertTrue(flag,"帐号密码对的情况登录");

    }

}

4. 编写逻辑operate

实现用例的登录逻辑,继承OperateAppium

package com.example.operation;

import com.example.base.OperateAppium;
import com.example.pages.LoginPage;

import io.appium.java_client.android.AndroidDriver;

/**
 * 登录逻辑处理
 * Created by LITP on 2016/9/23.
 */

public class LoginOperate extends OperateAppium {

    private LoginPage loginPage;

    AndroidDriver driver;

    public LoginOperate(AndroidDriver driver){
        super(driver);
        loginPage = new LoginPage(driver);
        this.driver = driver;
    }

    /**
     * 传递帐号密码
     * @param name 帐号
     * @param pass 密码
     * @return 是否成功登录到主页
     */
    public boolean login(String name,String pass){

        sleep(1000);
        //是否在欢迎页面
        if(getCurrActivity().equals(loginPage.getAboutText())){
            print("关于界面");
            for(int i=0; i<4; i++){
                swipeToLeft(300);
                sleep(500);
            }
            clickView(loginPage.getAboutButton());
            //点击欢迎页面的登录
            clickView(loginPage.getWelcmoeLoginButton());

            //在欢迎界面
        }else if(loginPage.isWelcome()){
            print("点击登录");
            clickView(loginPage.getWelcmoeLoginButton());
        }else if(loginPage.getLoginButton() == null){//自动登录了就输出成功,返回
            print("自动登录了,返回,执行注销");
            return true;

        }

        //输入内容
        inputManyText(name,pass);

        //点击登录
        clickView(loginPage.getLoginButton());

        //等待到首页
        waitAutoById(loginPage.getIndexElementId());

        //如果在登录完的界面没有第一屏就点击一下中间,关闭引导屏
        if(loginPage.getIndexElement() == null &&
                getCurrActivity().equals(loginPage.getIndexActivity())){
            press();
        }
        //返回是否成功到主页
        return loginPage.getIndexflag();
    }


}

5. 运行的xml

在这个测试module根目录下创建testng_login.xml文件,输入下面的内容右键run运行就是运行用例了,不懂的看之前的文章

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" > <!--parallel="true"  并行-->
    <test name="Test" >
        <classes>
            <class name="com.example.cases.Login" />
        </classes>
    </test>
</suite>

三、修改资料用例

这个我打包了,最重要的一点就是修改用户资料之前得先调用 正确的帐号密码登录

    @Test
    public void Login() {
        //这里先登录,
        boolean flag = loginOperate.login("13192624740", "xxxxxx");

        //断言是否成功登录,登录成功才修改资料
        Assert.assertTrue(flag);
    }

四、测试报告ReportNg

testng自身带有测试报告,但是内容难以观看理解,所以这里利用了ReportNg

1. 导入jar包

这个包是经过修改的,支持中文,放到测试的module的libs文件夹,右键add as library,不懂的看前面的文章。

再在gradle的dependencies里面添加两个包:

    compile 'com.google.inject:guice:4.1.0'
    compile 'org.anarres.gradle:gradle-velocity-plugin:1.0.7'

2. 添加监听器

修改刚刚的testng_login.xml ,添加了listeners,再次运行这个xml,在module目录下就会看到有test-output测试报告的文件夹,有html和xml格式的

<?xml version="1.0" encoding="UTF-8"?>
<suite name="Suite" > <!--parallel="true"  并行-->
    <test name="Test" >
        <classes>
            <class name="com.example.cases.Login" />
        </classes>
        <listeners>
            <listener class-name="org.uncommons.reportng.HTMLReporter" />
            <listener class-name="org.uncommons.reportng.JUnitXMLReporter" />
        </listeners>
    </test><!--Test-->
</suite><!--Suite-->

3. 查看测试报告

在index.html右击选择浏览器打开

这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

封装和demo打包下载: http://download.csdn.net/detail/niubitianping/9647551

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KeepStudya

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值