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

时间:2021-04-20 06:00:03

一、介绍准备

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右击选择浏览器打开

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

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

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

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

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