使用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配置文件中指定要运行的分组。例子中,testng.xml文件中指定运行三个分组。
<?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`
}

浙公网安备 33010602011771号