您的位置:首页 > 产品设计 > UI/UE

UI层自动化测试框架(五):业务层和用例层

2016-09-11 18:01 399 查看

业务层

该层主要是App的各种业务操作,比如登录,遍历tab,下单等,也就是说把app中各项业务的操作都封装在业务层。比如说登录操作,我们把它封装一个类,登录的大致的流程是:首先是不是要找到登录入口(可能一个app有很多的入口),然后进入登录界面,输入用户名和密码,再点击登录按钮,这样一个完整的登录业务就算完成了。

可能你问我为什么要这么做呢?在测试脚本中直接写不就可以了,为什么要把它们分离出来?其实这样做的目的是为了最大程度让测试用例维护性降低。如果以后需求发生变化,比如登陆的逻辑中增加了验证码等,这时只用改业务层中的登录类就可以了,而用例层中的测试脚本并不用改。



以下为登录业务的代码:

package com.dji.action;

import java.util.concurrent.TimeUnit;
import com.dji.object.BasePage;
import io.appium.java_client.AppiumDriver;

/**
* 登录action
* @author charlie.chen
*
*/

public class Login  {

private AppiumDriver<?> driver;

private BasePage loginPage=null;

public Login(AppiumDriver<?> driver) {
this.driver = driver;
}

//通过登录按钮登录
public void loginByButton(String userName,String pwd) throws Exception{
new BasePage(driver,"menuPage").click("我");
isLogined();
new BasePage(driver,"minePageNo").click("登录");
login(userName,pwd);
}

//通过DJI Store登录
public void loginByStore(String email,String pwd) throws Exception{
isLogined();
new BasePage(driver,"minePageNo").click("DJI商城");
login(email,pwd);
}

// 通过DJI Academy登录
public void loginByAcademy(String email,String pwd) throws Exception{
isLogined();
new BasePage(driver,"minePageNo").click("DJI论坛");
login(email,pwd);
}

//判断是否已登录,如果已登录就先退出登录
public void isLogined() throws Exception{
BasePage minePage=new BasePage(driver,"minePage");
boolean flag=minePage.isElementDisplayed("用户图像");
if(flag){
minePage.swipeToUp();
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
minePage.click("设置");
loginOut();
}
}

//登录操作
public  void login(String userName,String pwd) throws Exception {
loginPage=new BasePage(driver,"loginPage");
loginPage.type("登录输入账号框", userName);
loginPage.type("登录输入密码框", pwd);
loginPage.click("登录");
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
}

//退出登录
public void loginOut() throws Exception{
BasePage settingPage=new BasePage(driver,"settingPage");
settingPage.click("退出DJI账号");
settingPage.click("确定");
}
}


用例层

该层是实际的测试脚本,也就是调用业务层中的各项业务操作,然后增加验证,判定结果是否正确。

以下为登录用例:

package com.dji.cases;

import java.util.concurrent.TimeUnit;

import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Listeners;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import static org.assertj.core.api.Java6Assertions.*;

import com.dji.action.Login;
import com.dji.object.BasePage;
import com.dji.utils.DriverFactory;
import com.dji.utils.TestNGListener;

import io.appium.java_client.android.AndroidDriver;

@Listeners({ TestNGListener.class })
public class LoginTest {

private AndroidDriver<?> ad = null;
private Login login = null;

@Parameters({ "userName", "pwd" })
@Test(description = "通过登录按钮登录")
public void loginByButton(String userName, String pwd) throws Exception {

login.loginByButton(userName, pwd);
ad.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
// 断言验证用户名是否正确
//Assert.assertEquals(new BasePage(ad, "minePage").findElement("用户名").getText(), "charlie.chen");   //testNG自带的断言机制
//采用AssertJ断言机制
assertThat(new BasePage(ad, "minePage").findElement("用户名").getText()).isEqualTo("charlie.chen");
}

@Parameters({ "userName", "pwd" })
@Test(description = "通过DJI Store登录")
public void loginByStore(String userName, String pwd) throws Exception {

login.loginByStore(userName, pwd);
ad.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

@Parameters({ "userName", "pwd" })
@Test(description = "通过DJI论坛登录")
public void loginByAcademy(String userName, String pwd) throws Exception {

login.loginByAcademy(userName, pwd);
ad.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

@Parameters({ "userName", "pwd" })
@Test(description = "通过飞行记录登录")
public void loginByFly(String userName, String pwd) throws Exception {

}

// /*
// * 通过Skypixel关注登录
// */
// @Test
// public void loginByAttention() throws Exception {
// }
//
// /*
// * 通过Skypixel点赞登录
// */
// @Test
// public void loginByPraise() throws Exception {
// }
//
// /*
// * 通过Skypixel收藏登录
// */
// @Test
// public void loginByCollect() throws Exception {
// }
//
// /*
// * 通过Skypixel评论登录
// */
// @Test
// public void loginByComment() throws Exception {
// }

@BeforeMethod
public void beforeMethod() throws Exception {
login = new Login(ad);
TestNGListener.setDriver(ad);
}

@AfterMethod
public void afterMethod() throws Exception {

}

@BeforeClass
public void beforeClass() {

ad = DriverFactory.createAndroidDriver("PBV0216615001449", "4723", "dji.pilot", "dji.pilot.main.activity.DJIAoaActivity");
ad.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
}

@AfterClass
public void afterClass() {
// ad.closeApp();

}

@BeforeTest()
public void beforeTest() throws Exception {
}

@AfterTest
public void afterTest() {
}
}


testng.xml文件:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="appiumPRO" parallel="false" preserve-order="true">

<parameter name="port" value="4723" />
<parameter name="udid" value="PBV0216615001449" />
<parameter name="appPackage" value="dji.pilot" />
<parameter name="appActivity" value="dji.pilot.main.activity.DJIAoaActivity" />

<parameter name="userName" value="charlie.chen@dji.com" />
<parameter name="pwd" value="1weefdsew" />

<test name="LoginTest" preserve-order="true">
<classes>
<class name="com.dji.cases.LoginTest" >
<methods>
<include name="loginByButton" />
<include name="loginByStore" />
<exclude name="loginByAcademy" />
<exclude name="loginByFly" />

<exclude name="loginByAttention" />
<exclude name="loginByPraise" />
<exclude name="loginByCollect" />
<exclude name="loginByComment" />
</methods>
</class>
</classes>
</test>

</suite>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息