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

原创 2016年10月08日 15:14:42

一、介绍准备

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

版权声明:本文为博主原创文章,转载请带上出处,谢谢。

相关文章推荐

使用ReportNg生成测试报告(Maven+Appium+TestNg+ReportNg)

参考文章:http://blog.csdn.net/wx19900503/article/details/51272971 源起:Maven+Appium+TestNg本就可以实现一个项目的完整测...

什么是牛人?

牛人就是当我得知了他们的经历之后除了叹为观止,心生羡慕之后,除了祝他们好运却再也不敢轻易下决心追上的这么一群人。虽然不甘心,但是,达到那种程度的难度已经越来越大了……

TestNG - 添加图片或者链接到测试报告

TestNG - 添加图片或者链接到测试报告 TestNG - 添加图片或者链接到测试报告 作者: Max.Bai 时间: 2015/01 为了测试报告添加更多的内容,有时候我们需要添...

[Android测试] AS+Appium+Java+Win 自动化测试之七: 写脚本测试自己的app

一、准备测试对象: 守护2.2.3 测试功能: 登录二、逻辑与控件1. 测试的流程: 打开app,到达欢迎界面,点击登录,输入帐号密码,登录,判断是否登录成功。 逻辑注意点: 第一次打开会弹出...

ReportNg测试报告的定制修改

参考文章: Custom reporting engine with ReportNG 利用ReportNG生成美观易读的测试报告 前言前段时间在Testerhome上面看到了测试报告生成...

ReportNG测试报告的定制修改

本文系转载 !!!http://blog.csdn.net/qq744746842/article/details/49744647 前段时间在Testerhome上面看到了测试报告生成系列之——-...

使用Python删除文本文件中的部分内容

为了学习英语,我把从网上下载下来的电影转换成纯MP3文件,放到iTouch里去了,这样就可以直接练习听力了,另外把下载下来的字幕也放进去,听不懂的时候可以看,但有一个问题,网上载下来的字幕格式都如下所...
  • fly_qj
  • fly_qj
  • 2011-05-29 02:42
  • 14465

一句“听他说”就能否定我的所有?

他说的“听他说”“要不是听他说”,什么听他说,什么要不是听他说,我根本不明白 ,他就这样,不明不白的让我的心死了,我好气愤…原以为我们那份淡淡的爱,会天长地久,我那么在乎他,为了他,我什么都舍得,可...

服务端测试相关知识储备

虽然有几年测试经验,但是都不是做服务端的,话说现在姐姐要转去做服务端测试,就开始吭哧吭哧的学习啦! 搜罗到做测试的相关知识储备: •熟悉java( jvm); •熟悉Linux平台...

Android gradle 手动下载(注意不是Android Gradle Plugin)

在使用Android Studio 自动下载Gradle的时候会特别特别的慢,我今天试了试,需要1个小时,还没有完成。。。然后就试着去手动下载了 0: 参考官方网站,选择合适的https://deve...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)