使用appium同时支持iOS和android的case结构及jenkins job配置
Posted 我的小花园
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用appium同时支持iOS和android的case结构及jenkins job配置相关的知识,希望对你有一定的参考价值。
之前我们大多数的case branch,仅能支持ios,或者android。若想两端都做自动化,只能写两份代码。了解了appium及testng后,我们在自动化中开始尝试使用同一套代码,即支持iOS,又支持Android。希望此种方式能提高我们的自动化开发效率。
1.case代码支持
1.1 业务case部分
如果iOS和android对同一功能的操作交互类似,我们就可以使用同一套业务case代码。appium对iOS和Android系统的操作接口基本是一致的。若不一致,可使用driver instanceof IOSDriver 或 driver instanceof AndroidDriver 来进行分支判断。
举例:
public void login() throws Exception{ //此处iOS与Android app上的交互不同,所以做了不同处理。 if(driver instanceof IOSDriver) { loginPage.getOtherWayToLogin().click(); loginPage.getBtnUsePassword().click(); } Assert.assertTrue(loginPage.setPhone(TestData.account),"无法输入正确电话"); if(driver instanceof AndroidDriver){ loginPage.getBtnNext().click(); loginPage.getBtnUsePassword().click(); } getAutomationUtil().setValue(loginPage.getEdtxtPassword(), TestData.password); loginPage.getBtnLogin().click(); Assert.assertTrue(loginPage.getMenuButton() != null,"疑似登录未成功"); }
1.2 page类
业务case里使用的元素,都依赖page类来识别。使用appium提供的注释方式,写起代码来较为简洁。举例:
public class LoginPage extends BasePage{ @AndroidFindBy(uiAutomator = "new UiSelector().resourceId(\"xxx:id/xxxx\")") @iOSXCUITFindBy(accessibility = "同意") private MobileElement btnPrivacyRuleAgree; @iOSXCUITFindBy(accessibility = "使用其它方式登录") private MobileElement otherWayToLogin; public MobileElement getOtherWayToLogin() { return otherWayToLogin; } public MobileElement getBtnPrivacyRuleAgree() { return btnPrivacyRuleAgree; } ... } public class BasePage { public BasePage(AppiumDriver<WebElement> driver) { //appium通过此代码支持注释方式定位元素 PageFactory.initElements(new AppiumFieldDecorator(driver, new TimeOutDuration(30, TimeUnit.SECONDS)), this); } ... }
2. testng支持
2.1 testng case相关配置
-
testng可将case分成不同的组,每次根据suit的配置来运行指定的case group。
-
可通过dependsOnGroups表示依赖关系,如必须先运行ios_login分组的case后,才能运行ios_case组的case。
-
可通过priority来决定同一分组里的case的优先级。数值越大,越先运行;不指定,则默认值为0;值相同的case的运行先后顺序,由testng决定。
@Test(groups = {"ios_login","adr_login"}) public void login() throws Exception{...} @Test(groups = "adr_login",priority = 1) public void getUuidTest() {...} @Test(enabled = true,groups = "ios_case",dependsOnGroups = "ios_login") public void testXXXX(){...}
2.2 testng suit配置
testng可在suit配置文件中指定要运行的分组。例子中,指定运行三个分组。
<?xml version="1.0" encoding="UTF-8"?> <suite name="Android-All"> <test name="android"> <groups> <run> <include name="android_login"/> <include name="android_cases"/> <include name="android_logout"/> </run> </groups> <packages> <package name="com.HHHH.autotest.cases"/> </packages> </test> </suite>
3. jenkins job支持
单个branch若只支持ios或android,使用的app.properties和testng suit配置可使用case里相应的文件内容。但通过jenkins 在公司的自动化平台上运行自动化,app.properties文件已被公司的自动化平台改写仅需传入部分配置。为支持同一branch可测两端,testng suit配置也需要我们在运行自动化改写。我们可以在jenkins上重写这两个文件。
3.1 重写app.properties 和 testng.xml
在command里, YYYY 为job的名字。iOS只用传platformName和automationName;android只用传platformName和appActivity。
create_app_properties(){ if [ $platform == ‘iOS‘ ];then `echo -e "platformName = iOS\nautomationName = XCUITest" > app.properties` `mv app.properties YYYY` `echo -e "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<suite name=\"iOS-All\">\n<test name=\"ios\">\n<groups>\n<run>\n<include name=\"ios_login\"/>\n<include name=\"ios_cases\"/>\n<include name=\"ios_logout\"/>" > testng.xml` `echo -e "</run>\n</groups>\n<packages>\n<package name=\"com.HHHH.autotest.cases\"/>\n</packages>\n</test>\n</suite>" >> testng.xml` `mv testng.xml YYYY` else `echo -e "platformName = Android\nappActivity=com.HHHH.main.activity.MainSplashActivity" > app.properties` `mv app.properties YYYY` `echo -e "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<suite name=\"Android-All\">\n<test name=\"android\">\n<groups>\n<run>\n<include name=\"android_login\"/>\n<include name=\"android_cases\"/>\n<include name=\"android_logout\"/>" > testng.xml` `echo -e "</run>\n</groups>\n<packages>\n<package name=\"com.HHHH.autotest.cases\"/>\n</packages>\n</test>\n</suite>" >> testng.xml` `mv testng.xml YYYY` }
以上是关于使用appium同时支持iOS和android的case结构及jenkins job配置的主要内容,如果未能解决你的问题,请参考以下文章