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>
相关文章推荐
- 奇艺酝酿与百度各业务对接 尚未对搜索引擎开放
- 评估企业是否适合开发复合业务服务
- 电子银行业务分析系统—项目总结1. 项目概况
- 设计模式 业务封装 & 紧耦合 vs. 松耦合 & 简单工厂模式
- 华为的业务
- Microsoft Dynamics CRM server 2013 中业务规则,有点像C#的正则表达式
- 通过事件实现简单的进程内业务实体监控
- 互联网电商大数据环境 ——大数飓数据分析实践培训精华笔记(七)——电商核心业务知识之订单商品模块
- 敬爱的 Spring3 , 亲爱的 SpringSide , 是否增加以下功能? --- 业务模块、按钮、URL三者的联系
- 【转】HBase业务实践
- [原创].NET 业务框架开发实战之九 Mapping属性原理和验证规则的实现策略
- Dynamics AX R2 业务系列-采购业务流程
- 给IT人员支招:如何跟业务部门谈需求分析?(上)
- 竞业禁止-股东大会决议解散公司,在形成解散决议但未办理注销手续之前公司董事另设一公司,擅自同公司经营同类业务
- 手机二维码业务行业报告
- 编写一个业务函数,实现字符串(前后各有三个空格,单词前后也均有空格) " i am student, you are teacher " , 各个单词首字符大写
- 思考mysql内核之初级系列3---办理业务的流程
- 管网业务系统建立步骤
- 如何规划面向业务逻辑的MOSS系统
- JSP教程之使用JavaBean完成业务逻辑的方法