目录:
- 前言
- 项目介绍
- 项目结构
- 如何编写一个Case
- Android Example
- IOS Example
- 总结
一. 前言
自动化测试趋势近几年也越来越火了,在APP泛滥的时代,对APP进行自动化测试也备受测试人员追捧,我也不例外。
二. 项目介绍
项目名称:YYAPPAutomation
名称介绍:有鱼股票APP自动化
项目功能:对有鱼股票APP Android版本和IOS版本进行自动化测试
项目依赖:APPIUM(http://appium.io/)
项目框架:Java + Maven + Testng + Python脚本
三. 项目结构
文件目录介绍:
- apps文件夹:安放Android apk和IOS ipa
- python文件夹: 安放Python文件,用shell调用python进行安装apk或ipa文件、注册脚本、检查是否注册脚本等
- resources-android文件夹:安放Android testng xml
- resources-ios文件夹:安放IOS testng xml
- screenshot文件夹: 安放失败截图.jpg
- src文件夹: 测试代码
- target文件夹:
- test-output文件夹:安放测试报告
测试代码:
文件目录介绍:
- debug文件夹:编写调试代码
- flow文件夹:编写测试场景
- listener文件夹:编写监听器,如:重写测试报告、单个Case执行失败后会进行retry,进行重试的次数可配置
- page文件夹:编写单个页面所有元素,即获取元素
- service文件夹:编写单个页面所有元素的相关事件,如:点击、获取元素显示文字
- testcase文件夹:编写测试用例
- util文件夹:公共文件夹,编写静态方法,如:获取appium连接、shell脚本执行、正则匹配APP显示数据的正确性等
EX. Page文件夹:
获取Appium连接:
/**
* 连接APPIUM SERVER
*
* @param url
* @param port
* @param propertyFileName
* @return
* @throws MalformedURLException
*/
@SuppressWarnings("rawtypes")
public static AppiumDriver getDriver(String url, String port, String device, String udid, String env) throws MalformedURLException {
File classpathRoot = new File(System.getProperty("user.dir"));
DesiredCapabilities capabilities = null;
if (device.equals("ios")) {
File propertyFile = new File(classpathRoot.getAbsolutePath() + "//resources-ios/based.properties");
capabilities = getBasedCapabilities(propertyFile);
if(env.equalsIgnoreCase("beta")) {
capabilities.setCapability("app", classpathRoot.getAbsolutePath() + "//apps//RuiFuTech_Beta.ipa");
}
if(env.equalsIgnoreCase("live")) {
capabilities.setCapability("app", classpathRoot.getAbsolutePath() + "//apps//RuiFuTech_Live.ipa");
}
return new IOSDriver(new URL("http://" + url + ":" + port + "/wd/hub"), capabilities);
}else if (device.equals("android")) {
capabilities = getBasedCapabilities(new File(classpathRoot, "//resources-android//based.properties"));
if(env.equalsIgnoreCase("beta")) {
packageName = capabilities.getCapability("appPackage").toString() + ".debug";
capabilities.setCapability("appPackage", packageName);
capabilities.setCapability("app", classpathRoot.getAbsolutePath() + "//apps//RuiFuTech_Beta.apk");
}
if(env.equalsIgnoreCase("live")) {
packageName = capabilities.getCapability("appPackage").toString();
capabilities.setCapability("app", classpathRoot.getAbsolutePath() + "//apps//RuiFuTech_Live.apk");
}
capabilities.setCapability("udid", udid);
return new AndroidDriver(new URL("http://" + url + ":" + port + "/wd/hub"), capabilities);
}else {
return null;
}
}
查看一下Android的based.properties
platformName=Android
platformVersion=4.4.2
deviceName=5LM0216111012735
appPackage=com.ruifusoft.finance.app
appActivity=com.ruifusoft.ui.SplashActivity
unicodeKeyboard=true
resetKeyboard=true
查看一下IOS的based.properties
appium-version=1.0
platformName=iOS
platformVersion=9.3
deviceName=iPhone 5s
四. 如何编写一个Case
第一步:开启Appium Android服务
第二步:Android开启android-sdk tool下的uiautomatorviewer进行抓取元素(resourceId形式)/IOS开启Appium inspector进行抓取元素(Xpath形式)
第三步:将抓取的元素写入Page文件夹相应地方
第四步:在Service文件夹相应创建对应Page的service文件,对元素进行点击事件编写和获取文字编写,输入框数据文字方法编写等
第五步:在Flow文件夹创建测试场景,如:注册测试场景 registerFlow,将注册相关联的页面进行调用Service层的方法进行测试场景构建
第六步:在TestCase文件夹创建相应的测试用例,调用写好的registerFlow
五. Android Example
备注:待续…
六. IOS Example
备注:待续…
七. 总结
“路漫漫其修远兮 吾将上下而求索”自动化APP测试尚未技术成熟,在写APP自动化的过程中也发现了很多难处(如:测试场景无法全部覆盖,一些case需要和外部提供数据进行联调测试、自动化测试场景写多了执行的时间会越来越长、Android机型过多,对于自动化代码需要编写适配、IOS是每对一个元素进行操作就获取一次整个页面数据,导致某个页面数据过多的页面,下面的页面无法很多的获取到,甚至有时候获取不到导致case失败)需要一个一个的测试人员去探索发现解决方案,分享出来,从而提高自动化测试技术的发展。
整个项目文档:百度网盘
欢迎加QQ群 -> 阳台测试 -> 239547991(群号)