博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UI层自动化测试框架(五):业务层和用例层
阅读量:4226 次
发布时间:2019-05-26

本文共 5434 字,大约阅读时间需要 18 分钟。

业务层

该层主要是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文件:

你可能感兴趣的文章
西安思源学院电子信息工程学院院长张卫钢一行到访
查看>>
邀请函|欢迎参加2019云创大数据实验平台金融类/电子商务类/数学统计类院校各省总代理招募大会!...
查看>>
云创大数据的2018年!
查看>>
QNX简介
查看>>
MQTT协议基本介绍
查看>>
进程和线程是操作系统基本概念,了解一下
查看>>
SSL与TLS的区别以及介绍
查看>>
对象切割 - 常量引用传递
查看>>
北邮同学面经
查看>>
Effective C++条款16:成对使用new和delete时要采取相同形式
查看>>
sizeof与strlen
查看>>
一个递归+二分法的洗牌程序
查看>>
YUV格式注释
查看>>
一维、二维数组传参
查看>>
判断当前时间的下一秒是多少
查看>>
从文本文件中读取数据排序并输出到文本
查看>>
求一个整数数组中第二大的数
查看>>
删除一个链表中的节点
查看>>
计算机网络面试整理【转】
查看>>
cookie和session区别详解
查看>>