使用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`
}

  

猜你喜欢

转载自www.cnblogs.com/sunada2005/p/9132970.html
今日推荐