如何使用PageObject模式改进我的测试?

时间:2017-07-19 08:37:18

标签: java testing automated-tests appium pageobjects

我想我已经掌握了PageObject模式的要点,但是有些部分我没有得到。

所以我正在学习本教程,现在我有了这个Page类:

public class SignUpPage extends AbstractPage {

    AndroidDriver<MobileElement> driver;

    public SignUpPage(AndroidDriver<MobileElement> driver) {
        super(driver);
    }

    public void signUpAllFieldsEmpty() {
        signup_button.click();
    }

    public void signUpOnlyFirstName() {
        first_name_edittext.sendKeys("First name");
        hideKeyboard();
        signup_button.click();
    }


    @AndroidFindBy(id="signup_button")
    private MobileElement signup_button;

    @AndroidFindBy(id="first_name_edittext")
    private MobileElement first_name_edittext;

    @AndroidFindBy(id="last_name_edittext")
    private MobileElement last_name_edittext;

    @AndroidFindBy(id="signup_email_edittext")
    private MobileElement signup_email_edittext;

    @AndroidFindBy(id="signup_password_edittext")
    private MobileElement signup_password_edittext;

    @AndroidFindBy(id="confirm_password_edittext")
    private MobileElement confirm_password_edittext;

}

然后我有这个Test类:

public class Test_001_SignUp extends AbstractTest {

    public Test_001_SignUp() {}

    @Test
    public void signUp_allFieldsEmpty() {

        app.landingPage().goToSignUpPage();        
        app.signUpPage().signUpAllFieldsEmpty();

    }

    @Test
    public void signUp_onlyFirstName() {

        app.signUpPage().signUpOnlyFirstName();

    }

}

我不确定我是否正确行事,因为如果我创建另一个与测试相关的@Test方法,看起来测试类中的方法会变得多余。

我怎么能改善这个?或者我在这次测试中做错了什么?

2 个答案:

答案 0 :(得分:1)

你的Page类应该是愚蠢的 - 它只是控制页面。

public void signup() {
    signup_button.click();
}

public void enterFirstName(String firstName) {
    first_name_edittext.sendKeys(firstName);
}

public String getFirstName() {
   etc...

您的Test类具有为每次测试调用哪种方法的逻辑。

其他几点:

  • 您没有在测试中声明任何内容。您应该在页面中添加getSuccessMessage方法或getPageTitle(或者在注册完成后在您的页面上发生的任何事情 - 您的测试可以检查它是否有效!)。然后,您的测试可以断言文本存在且正确。
  • 有些框架在Test和Pages之间使用StepDef类。

答案 1 :(得分:0)

如果您的所有测试都具有相同的起点,则可以使用@Before注释和带@After注释的干净方法在设置方法中执行此操作。它们将在每个测试方法之前和之后运行,并将执行将测试带到其起点所需的操作

public class Test_001_SignUp extends AbstractTest {

    public Test_001_SignUp() {}

    @Before
    public void setUp() {
        app
            .landingPage()
            .goToSignUpPage();
    }

    @Test
    public void signUp_allFieldsEmpty() {
        app
            .signUpPage()
            .signUpAllFieldsEmpty();
    }

    @Test
    public void signUp_onlyFirstName() {
        app
            .signUpPage()
            .signUpOnlyFirstName();
    }

    @After
    public void cleanUp() {
        // roll back to initial state 
    }
}

作为旁注,我们以signUp_allFieldsEmpty()测试为例。 goToSignUpPage()应返回SignUpPage个实例,以便您可以链接下一步

@Test
public void signUp_allFieldsEmpty() {
    app
        .landingPage()
        .goToSignUpPage()        
        .signUpAllFieldsEmpty();
}