2017-07-19 29 views
0

Je pense que je comprends déjà l'essentiel du pattern PageObject mais il y en a quelques parties que je n'ai pas eues.Comment puis-je améliorer mes tests en utilisant le pattern PageObject?

donc je suivais ce tutoriel et maintenant j'ai cette classe 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; 

} 

Ensuite, je dois cette classe de 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(); 

    } 

} 

Je ne suis pas bien sûr si je le fais bien parce qu'il semble que la méthode dans la classe de test devient redunda nt si je crée une autre méthode @Test qui sera pertinente pour le test.

Comment est-ce que je pourrais améliorer cela? Ou est-ce que je fais quelque chose de mal avec ce test?

Répondre

1

Votre classe Page devrait être stupide - elle contrôle simplement la page.

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

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

public String getFirstName() { 
    etc... 

Votre Test classe a la logique de laquelle de ces méthodes pour appeler pour chaque test.

Quelques autres points:

  • Vous n'êtes pas quoi que ce soit dans vos affirmez essais. Vous devriez ajouter une méthode getSuccessMessage, ou getPageTitle à votre page (ou tout ce qui se passe sur votre page une fois l'inscription terminée - quelque chose pour votre test pour vérifier que cela a fonctionné!). Ensuite, votre test peut affirmer que le texte est présent et correct.
  • Certains cadres utilisent également des classes StepDef entre le test et les pages.
+0

est-il une bonne pratique de faire valoir les champs de texte au lieu des titres? Depuis que je teste une application Android native. – lmpgdn

0

Si tous vos tests ont le même point de départ, vous pouvez le faire dans une méthode mise en place avec l'annotation et la méthode @Before propre avec l'annotation @After. Ils courront avant et après chaque méthode d'essai et exécuteront les mesures nécessaires pour mettre le test à son point de départ

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 
    } 
} 

Comme une note de côté, permet de prendre comme exemple signUp_allFieldsEmpty() test. goToSignUpPage() devrait revenir SignUpPage exemple, vous pouvez enchaîner l'étape suivante

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