【问题标题】:How can I improve my tests using PageObject pattern?如何使用 PageObject 模式改进我的测试?
【发布时间】:2017-12-24 09:48:22
【问题描述】:

我想我已经掌握了 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;

}

然后我有这个测试类:

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 方法,测试类中的方法似乎变得多余。

我该如何改进呢?还是我在这个测试中做错了什么?

【问题讨论】:

    标签: java testing automated-tests appium pageobjects


    【解决方案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(或注册完成后页面上发生的任何事情 - 让您的测试检查它是否有效!)。然后您的测试可以断言文本存在且正确。
    • 一些框架也在测试和页面之间使用StepDef 类。

    【讨论】:

    • 断言文本字段而不是标题是一种好习惯吗?因为我正在测试一个原生 Android 应用。
    【解决方案2】:

    如果您的所有测试都具有相同的起点,您可以在带有@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();
    }
    

    【讨论】:

      猜你喜欢
      • 2019-02-07
      • 2013-10-17
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 2011-08-18
      • 2023-03-06
      相关资源
      最近更新 更多