基于Appium框架的自动化开发环境搭建
万事开头难,自动化开发环境的搭建会比较麻烦。以下详细讲解如何在mac os操作系统下,搭建基于Appium的自动化开发环境。
1、Android开发环境搭建(JDK/SDK/AndroidStudio)请自行百度,所需安装包可在如下网页中下载:
http://tools.android-studio.org
Appium for mac安装可参考以下连接:
http://www.cnblogs.com/oscarxie/p/3894559.html
其中appium 的安装,建议使用dmg安装,点击下载安装包。“npm install -g appium”命令行安装亲测一直报错,FQ了也报错。
2、AndroidStudio中新建android工程AppDemo。
3、创建java module(appium):new—>new module—>java library,此java工程用来开发自动化case。
4、安装Appium Client:创建java module (selenium),libs目录中导入相关selenium包,点击下载selenium压缩包
5、appium module添加selenium依赖:file—>project structure—>modelues选中appium—>dependencies添加selenium module。
6、appium module中,新建java class,开始开发自动化case。至此AppDemo工程目录结构如下所示:
7、启动appium server(命令行或者图形界面启动),注意,启动时Android Settings中请勾选No Reset选项,可防止每次执行case时,都重新安装app,如下所示。
8、case执行,可通过IDE和脚本两种方式执行case
IDE方式:case名右击—>run
脚本方式:auto_run.sh,见下方
-
#!/bin/bash
-
#auto_run.sh
-
source ~/.bash_profile
-
cd ./AppDemo
-
gradle clean
-
gradle build
-
export CLASSPATH=$APPIUM_HOME/java-client-3.3.0.jar:$APPIUM_HOME/selenium-java-2.48.2-srcs.jar:$APPIUM_HOME/selenium-java-2.48.2.jar:$APPIUM_HOME/junit-4.12.jar:$APPIUM_HOME/hamcrest-core-1.3.jar:$APPIUM_HOME/libs/*
-
cd ./appium
-
java -classpath $CLASSPATH:./build/libs/appium.jar org.junit.runner.JUnitCore com.incito.appiumdemo.cases.PersonalCente
其中CLASSPATH需要设置为Appium Client所在路径,
com.incito.appiumdemo.cases.PersonalCenter为case所在类,脚本的执行方式有利于自动化接入持续集成和平台化。
至此基于Appium的自动化开发环境搭建完成,下一节介绍如何开发自动化case及case的分层结构设计。
-
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
-
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
-
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
-
分享他们的经验,还会分享很多直播讲座和技术沙龙
-
可以免费学习!划重点!开源的!!!
-
qq群号:680748947【暗号:csdn11】
作者:软件策士小鱼
链接:https://www.zhihu.com/question/483958872/answer/2759816346
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
基于Appium的自动化case开发及case分层结构设计
首先为每条case创建一个公共的基类AppiumTestBase,内含setup和teardown两个方法,以后每条case继承该基类即可。代码如下:
-
public class AppiumTestBase {
-
public WebDriverWait webwait;
-
private AndroidDriver driver;
-
@Before
-
public void setUp() throws Exception {
-
File classpathRoot = new File(System.getProperty("user.dir"));
-
File appDir = new File(classpathRoot, "apps");
-
File app = new File(appDir, Config.CURRENT_BANK);
-
DesiredCapabilities capabilities = new DesiredCapabilities(); capabilities.setCapability("deviceName",Config.DEVICE_NAME); capabilities.setCapability(CapabilityType.BROWSER_NAME, ""); capabilities.setCapability(CapabilityType.VERSION, "5.0.1"); capabilities.setCapability("platformName", "android");
-
capabilities.setCapability("app", app.getAbsolutePath());
-
capabilities.setCapability("udid", Config.DEVICE_NAME);//adb devices获得的值
-
driver = new AndroidDriver(new URL("http://127.0.0.1:"+Config.APPIUM_PORT+"/wd/hub"), capabilities);
-
webwait = new WebDriverWait(driver,10);
-
DriverManager.init(driver);
-
DriverManager.initWebWait(webwait);
-
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
-
}
-
@After
-
public void tearDown() throws Exception {
-
driver.quit();
-
}
setup操作包含导入待测应用apk包,设置与Appium Server连接所需参数,并初始化AndroidDriver对象。以标版登录case为例,其需要继承AppiumTestBase,代码如下:
-
package com.incito.appiumdemo;
-
import org.junit.After;
-
import org.junit.Before;
-
import org.openqa.selenium.remote.CapabilityType;
-
import org.openqa.selenium.remote.DesiredCapabilities;
-
import org.openqa.selenium.support.ui.WebDriverWait;
-
import java.io.File;
-
import java.net.URL;
-
import java.util.concurrent.TimeUnit;
-
import io.appium.java_client.android.AndroidDriver;
-
public class AccountLogin extends AppiumTestBase{
-
/**
-
* case 编号 AccountLogin_001
-
* ****@throws ****Exception
-
*/
-
@Test
-
public void testAccountLogin() throws Exception {
-
Account.*getInstance*().gotoLoginPage();
-
Account.*getInstance*().doLogin();
-
}
-
/**
-
* case 编号 AccountLogin_002
-
* ****@throws ****Exception
-
*/
-
@Test
-
public void testLoginout() throws Exception {
-
Account.*getInstance*().gotoGestureLoginPage();
-
Account.*getInstance*().doGestureLogin(Config.*CURRENT_USERNAME*);
-
Personal.*getInstance*().doLogout();
-
}
testAccountLogin Case中,执行了两步操作:进入登录页面;执行登录操作。这两步操作都封装在Account类里面。由此引入自动化case的分层设计框架,如下图:
Paste_Image.png
自动化开发过程中,经常遇到的一个问题是,随着产品的不断更新迭代,APP的UI会不断发生变化,自动化如何去应对这样的变化,如何降低其维护代价。case分层设计主要是基于自动化可维护性的考虑,可维护性是功能自动化最重要的评价指标之一,其直接决定了自动化是否能开展下去。试想case数量达到一定程度时,若没有采用封装、分层的设计思路,极有可能出现“牵一发而动全身”的问题。下图是标版自动化case的分层目录图。
下面以登录case为例,详细了解其分层调用关系。登录case在cases层的AccountLogin类中,其代码上面已经展示,回到testAccountLogin Case的操作,第二步操作为Account.getInstance().doLogin();即在登录页面执行登录操作,其封装在business层的Account类中,代码片段如下:
-
public void doLogin(){
-
LoginUiAction.*getInstance*().enterUsername(Config.*CURRENT_USERNAME*); LoginUiAction.*getInstance*().enterPassword(Config.*CURRENT_PASSWORD*); LoginUiAction.*getInstance*().clickLogin();
-
HomeUiAction.*getInstance*().clickOnCancelGesture();
-
Assert.*assertTrue*(LoginUiAction.*getInstance*().isLogin());
-
}
doLogin()方法中执行了“输入用户名;输入密码;点击登录按钮;判断登录是否成功”操作,显然这几步操作都在UI层LoginUiAction类中。我们再查LoginUiAction.getInstance().
enterUsername()方法中做了什么,代码片段如下:
-
//输入用户名
-
public void enterUsername(String username){
-
WebElement wl = DriverManager.*getInstance*().findElementById(packagename +
-
":id/login_input_account");
-
wl.clear();
-
wl.sendKeys(username);
-
}
enterUsername()方法中,先根据id定位用户名输入框,然后清空输入框,再输入用户名,这些操作都是Appium Client中提供的API。至此演示了登录case的分层调用过程:cases—>business—>ui—>api。按照分层结构,只要业务逻辑不变,case维护任务主要放在ui层,上层无需改动,如此可极大减少case的维护代价。
在doLogin()方法中有一个“判断登录是否成功”的操作,断言操作是自动化测试用例中必不可少的一部分,下面就开始介绍自动化测试用例的书写规范。
总结:
感谢每一个认真阅读我文章的人!!!
作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。