一.在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集成