首页 > 技术文章 > app自动化设计

scarlettlie 2021-06-16 22:31 原文

一.在pom.xml引入依赖

testng:测试框架用例管理

appium:需要用到appium

log4j:日志集成

allure:生成报告

二.po分层

分为基础层,page层,用例层,xml文件

1.基础层

(1)可放置前置和后置用例,打开app可放在测试前置里,关闭app可放在测试测试后置里

@BeforeTest    //测试前执行的test,打开app
public void setUp() throws MalformedURLException {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("platformName", "Android");
desiredCapabilities.setCapability("platfomVersion", "8.1.0");
desiredCapabilities.setCapability("deviceName", "OPPO R11s");
desiredCapabilities.setCapability("apppackage", "com.cntaiping.tpl.tptb");
desiredCapabilities.setCapability("appActivity", "com.cntaiping.life.tptb.main.ui.MainActivity");
desiredCapabilities.setCapability("ensureWebviewsHavePages", true);
desiredCapabilities.setCapability("noReset", true);
URL remoteUrl = new URL("http://localhost:4723/wd/hub");
driver = new AndroidDriver(remoteUrl, desiredCapabilities);
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
@AfterTest     //测试后执行的test,关闭app
public void tearDown() throws InterruptedException {
Thread.sleep(5000);
driver.quit();

(2)对需要用到显式等待的操作进行二次封装后可在用例层直接使用

隐式等待只能等待元素存在,条件更高的需要用到硬性等待或显式等待,但是显式等待不是针对全局的,每个元素都需要加显式等待。通过二次封装将封装或的显式等待结合操作再封装一次,再用例中可直接调用,这样在二次封装的操作相当于已经包含了显式等待。

结合显式等待的操作:click,sendkeys,gettext,isdisplayed

案例:

public void inputtext(String locatename,By by,String data){
try {
waitelementvisit(by).sendKeys(data);
logger.info(locatename+"输入:"+data);
} catch (Exception e) {
logger.error("===自动化脚本执行异常===");
logger.error(e);
}
}
public WebElement waitelementvisit(By by){
WebDriverWait webDriverWait=new WebDriverWait(LemonBasicTest.driver,5);
return webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(by));
}

(3)对代码较多的操作进行二次封装后可在用例层直接使用

二次封装的操作:按键操作,滑动操作,随机数操作等

public void keycode(AndroidKey androidKey){
try {
KeyEvent keyEvent=new KeyEvent();
keyEvent.withKey(androidKey);
driver.pressKey(keyEvent);
logger.info("返回上一级");
} catch (Exception e) {
logger.error(e);
}
}

(4)在基础层中的每一个操作加日志,便于得到自动化代码的每一步操作,如上

2.page层

(1)一个测试用例一个page,每个page文件需要先继承基础层里二次封装的方法。

(2)编写页面操作代码

By loclookanswer=MobileBy.id("com.lemon.lemonban:id/switch_button");
public void lookanswer(){
click("查看答案",loclookanswer); //click经过基础层的二次封装,二次封装的方法中包含显式等待
}

3.用例层

(1)一个测试用例一个page,每个page文件需要先继承基础层里二次封装的方法和用例前置和后置的test。

(2)每个用例相互独立,所以需要有用例执行前的前置test,执行完前置操作(比如登录),才能执行用例的操作

@BeforeClass
public void beforeTiku(){
IndexPage indexPage=new IndexPage();
indexPage.myLemon();
LemonLoginPage lemonLoginPage=new LemonLoginPage();
lemonLoginPage.entrelogin();
lemonLoginPage.login("13039012776","012776");
}

(2)@Test注释和@DataProvider数据驱动(数据量较少的可以用)

@Test(dataProvider = "datapro")
public void logintest1(String mobile,String pwd,String toasttext){
LemonLoginPage lemonLoginPage=new LemonLoginPage();
lemonLoginPage.login(mobile,pwd);
String excepttoast=toasttext;
String actualtoast= lemonLoginPage.loginfailtoast(toasttext);
Assert.assertEquals(excepttoast,actualtoast);
}
@DataProvider
public Object[][] datapro(){
Object[][] data={
{"1303901277","012776","手机号码格式不正确"},
{"","012776","手机号码或密码不能为空"},
{"13039012776","","手机号码或密码不能为空"}
};
return data;
}

三.xml文件

1.resources-create testng xml,xml文件CTRL+alt+L

 2.在test下一行加入parameter(如果用例中的一个属性只需要一个属性值,可以把属性值通过xml的parameter进行数据驱动)

<parameter name="platformName" value="Android"/>
<parameter name="platfomVersion" value="10"/>
<parameter name="deviceName" value="HUAWEI P40"/>
<parameter name="appPackage" value="com.lemon.lemonban"/>
<parameter name="appActivity" value="com.lemon.lemonban.activity.WelcomeActivity"/>
<parameter name="remoteUrl" value="http://localhost:4723/wd/hub"/>
@BeforeTest
@Parameters({"platformName","platfomVersion","deviceName","appPackage","appActivity","remoteUrl"})
public AndroidDriver openapp(String platformName,String platformVersion,String deviceName,String appPackage,String appActivity,String remoteUrl) {
DesiredCapabilities desiredCapabilities = new DesiredCapabilities();
desiredCapabilities.setCapability("platformName", platformName);
desiredCapabilities.setCapability("platfomVersion", platformVersion);
desiredCapabilities.setCapability("deviceName", deviceName);
desiredCapabilities.setCapability("appPackage", appPackage);
desiredCapabilities.setCapability("appActivity", appActivity);

3.在classes里加入需要执行的用例

<class name="apptest.lemonapp.testcase.LemonLoginTest">
</class>
<class name="apptest.lemonapp.testcase.TikuEntreTest">
</class>

四.集成

1.日志

https://www.cnblogs.com/scarlettlie/articles/14829009.html

(1)引入log4j依赖

(2)创建log.properties文件

(3)日志使用:在基础层中的每一个操作加日志,可打印出自动化代码的每一步操作

2.生成allure报告

https://www.cnblogs.com/scarlettlie/articles/14829074.html

(1)在pom.xml引入allure依赖

(2)在pom.xml中编码设置避免乱码

(3)在pom.xml中引入生成allure报表的插件

(4)用mvn test构建测试

(5)mvn命令生成allure报表:mvn io.qameta.allure:allure-maven:serve

3.Jenkins集成

推荐阅读