本文共 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文件: