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

业务层

该层主要是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>
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值