由于之前的种种问题,作者痛下决心,义无反顾,瞬间感觉时代在召唤。。。额~好吧不瞎哔哔了。
作者首先对APPIUM的一些基本函数做了封装,事例代码如下:
import java.util.concurrent.TimeUnit;
import com.mypublic.mywheel.log.Log4jlog;
import io.appium.java_client.android.AndroidDriver;
public class Android_Click {
private AndroidDriver<?> driver;
private Log4jlog ciicLog = new Log4jlog(this.getClass());
public Android_Click(AndroidDriver<?> driver) {
this.driver = driver;
}
// 1常用函数
public void clickElementByAccessibilityId(String byAttribute, int timeout)
throws Exception { //向上抛出异常
driver.manage().timeouts().implicitlyWait(timeout, TimeUnit.SECONDS); //等待元素出现
driver.findElementByAccessibilityId(byAttribute).click(); //查找并点击元素
ciicLog.log4jlogInfo("操作提示:点击AccessibilityId元素【" + byAttribute + "】成功"); //打出日志
}
。。。代码片段
作者为什么想这么干呢,主要目的是为了提供完整的操作日志,从而可以方便排查错误,而且可以当详细的测试报告来用,作者很懒~世界公认。
其次在这里封装后,我们的测试用例的代码量和行数将减少很多,到时候用例看起来比较方便。
作者主要封装了,驱动的启动和结束,以及常用动作的点击、输入、拖动、等待、截图等功能。
在这里作者将其打成JAR包,提供给用例模块使用。至于具体的代码作者就不一个一个的列出了,客观门理解了作者的用意之后,估计都可以自己实现。
接下来是用例,作者分为了
CASE_INIT //用例的初始化操作
CASE_BODY //用例体,也就是用例的执行操作
CASE_END //用例结束操作
BULID_CASE //为用例的组装,也就是把 INTI、BADY、END 组装起来,并且该参数化的参数化,该对象化的对象化,次两点稍后作者再详细说明。
CASE_LIST //用例清单,作者做了一个LIST,将用例排序封装成一个列表提供给作者自己写的GUI使用。
作者在这里给出一个自己写的用例的式样,客观看好了。。。
CASE_INIT========================================================================
public class CaseInit {
public boolean execute_CaseInit_WeiXinInit(String account,String password) {
try {
//获取properties属性值,2016年02月26日,数据参数化和对象化的操作,也就界面元素来自于外部的属性文件或者EXCEL,
在这里作者也水了一把,BUTTON 结果被作者硬生生的写成了BOTTON,而且一错到底,唉唉,见谅见谅。
OperationPropertiesFile oPf=new OperationPropertiesFile("\\conf\\case.properties");
String botton_login_name = oPf.getProperties("botton_login_name").toString();
String botton_otherWayLogin_name = oPf.getProperties("botton_otherWayLogin_name");
String editText_account_name = oPf.getProperties("editText_account_name");
String editText_passWord_xpath = oPf.getProperties("editText_passWord_xpath");
String botton_noSynchronization_id = oPf.getProperties("botton_noSynchronization_id");
String botton_publicNumber_name = oPf.getProperties("botton_publicNumber_name");
String botton_proName_name = oPf.getProperties("botton_proName_name");
String botton_HomeOfEmployees_name = oPf.getProperties("botton_HomeOfEmployees_name");
//由于封装了基本操作,所以只用新建对象就可以重复使用了============================================
//Android_WaitUntil myWaitUntil= new Android_WaitUntil(driver);
Android_Click myClick= new Android_Click(driver);
Android_SendKeys mySendKeys= new Android_SendKeys(driver);
Android_Slide mySlide= new Android_Slide(driver);
//操作步骤,是不是瞬间觉得操作步骤少了很多很多====================================================
//登录界面
myClick.clickElementByName(botton_login_name, 30);
//使用其他登录方式
myClick.clickElementByName(botton_otherWayLogin_name, 15);
//QQ号登录
mySendKeys.sendKeysElementByName(editText_account_name, account, 15);
//输入密码
mySendKeys.sendKeysElementByXPath(editText_passWord_xpath, password, 15);
//点击登录
myClick.clickElementByName(botton_login_name, 15);
。。。操作步骤省略了,作者使坏中,其实作者希望大家可以自己动手少一些复制黏贴,作者还是很伟大的不会吗。
ciicLog.logger.info("【微信公众号入口】初始化成功");
//
return true;
} catch (Exception e) {
ciicLog.logger.error("【微信公众号入口】初始化失败" + e.toString());
e.printStackTrace();
return false;
}
}
}
CASE_INIT========================================================================
CASE_BODY 和 CASE_END 也是如此
接下来是BULID_CASE===============================================================
这个作者自认为很精髓啊~~~~~~
public class E1_MicroWelfare {
public boolean caseBefore() {
// TODO: 准备工作
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName + "】准备开始");
// 初始化Appium驱动
driver = new Android_DriverInit().getMyAndroidDriver();
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName + "】准备结束");
if (driver == null) {
return false;
} else {
return true;
}
}
public boolean caseInit() {
// TODO: 初始化工作
try {
OperationExcel.initReadExcel(oPf.getProperties("parameterTablePath"));
String account=OperationExcel.readExcelByColumnName("init", "用户名", 1);
String pasword=OperationExcel.readExcelByColumnName("init","密码",1);
OperationExcel.endReadExcel();
//===========================================================================
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName
+ "】初始化开始");
// 初始化项目入口,进入公众号
CaseInit myweixinInit = new CaseInit(driver);
boolean tag=myweixinInit.execute_CaseInit_WeiXinInit(account,pasword);
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName
+ "】初始化结束");
if (tag) {
return true;
} else {
return false;
}
} catch (Exception e) {
ciicLog.log4jlogError("【" + caseName + "】用例【准备】异常"+ new Date() + e);
e.printStackTrace();
return false;
}
}
public boolean caseBody() {
// TODO: 用例体
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName + "】准备开始"+new Date());
CaseBody_MicroWelfare caseBody = new CaseBody_MicroWelfare(driver);
boolean tag=caseBody.excuse_CaseBody();
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName + "】准备结束"+new Date());
if (tag) {
return true;
} else {
return false;
}
}
public boolean caseEnd() {
// TODO: 收尾工作
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName + "】收尾开始");
// 退出软件
CaseEnd end = new CaseEnd(driver);
boolean tag=end.execute_CaseEnd_weiXinQuit();
// LOG记录
ciicLog.log4jlogInfo("【"
+ caseName + "】收尾结束");
if (tag) {
return true;
} else {
return false;
}
}
public boolean caseAfter() {
// TODO: 善后工作
return true;
}
}
BULID_CASE===============================================================
作者在这里将一个用例分为了BEFORE、 INIT 、BODY 、END 、AFTER 五个阶段,第一个阶段放入驱动初始化,第二个阶段放入项目初始化、第三个放入用例体、第四个放入用例结束操作、第五个放入收尾操作,这里主要为了实现一种最为复杂的用例就是牵扯到数据库校验和用例数据需要还原的操作,作者相信作为一个高端的测试一定已经遇到过这样的用例过,所以也就不再熬述了。
CASE_LIST=================================================================
public class CaseList extends CaseList_Abstract{
public ArrayList<String> caseList=new ArrayList<String>();
public void initCaseList(){
caseList.add(0,"A1_PersonalCenter_myActiveity");
caseList.add(1,"A2_PersonalCenter_myInformation");
caseList.add(2,"A3_PersonalCenter_myWelfare");
。。。这是作者的用例命名法则,大家可以自己约定,不必深究
}
public boolean relationCaseToRun(int index){
boolean rightOrFalse=false;
try {
switch(index){
case 0:
A1_PersonalCenter_myActiveity A1=new A1_PersonalCenter_myActiveity();
rightOrFalse=A1.runCase();
if (rightOrFalse!=true){
rightOrFalse=false;
}
break;
case 1:
A2_PersonalCenter_myInformation A2=new A2_PersonalCenter_myInformation();
rightOrFalse=A2.runCase();
if (rightOrFalse!=true){
rightOrFalse=false;
}
break;
case 2:
A3_PersonalCenter_myWelfare A3=new A3_PersonalCenter_myWelfare();
rightOrFalse=A3.runCase();
if (rightOrFalse!=true){
rightOrFalse=false;
。。。这里类似一个工厂类,就是将用例对象全部准备好,作者喜欢叫填弹,之后么就是biu~biu~biu~了,哈哈哈
至于如何执行用例,作者是自己写了一个界面,将用例列表刷在一个LIST上,然后一个一个事例化用例执行,如果觉得麻烦的童鞋可以自己写一个MAIN函数,
写法就类似 CaseList XXX= new CaseList();
xxx.relationCaseToRun(1);
xxx.relationCaseToRun(2);
xxx.relationCaseToRun(3);
xxx.relationCaseToRun(4);
...一个一个排下去即可。
好啦这就是作者自己是框架想法,在下一篇,作者将针对参数化和对象化讲讲自己的想法。