繁体   English   中英

如何使用PageObject模式改善测试?

[英]How can I improve my tests using PageObject pattern?

我想我已经了解了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方法,则看起来测试类中的方法变得多余。

我该如何改善? 还是该测试做错了什么?

您的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类。

如果所有测试都具有相同的起点,则可以在带有@Before注释的设置方法中以及带有@After注释的clean方法中进行操作。 它们将在每种测试方法之前和之后运行,并将执行将测试带入起点所需的操作

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM