Est-ce que le modèle de lien D'objet de Page est compatible avec le cornichon de concombre?

avec le modèle D'objet Page de Test Automation nous lions des pages ensemble comme ceci:

WebDriver driver = new WebDriver()
HomePage homePage = new HomePage(driver);
LoginPage loginPage = homePage.GoToLoginPage();
WelcomePage welcomePage = loginPage.Login();
etc
etc

Le grand avantage de cela est si le Devs changer la page d'accueil de sorte qu'il n'y a plus de liens vers la page d'accueil, je peux mettre à jour ma classe de page d'accueil et voir tous les tests que je dois mettre à jour (avec des erreurs) avant même d'exécuter un test.

avec Gherkin cependant, chaque ligne au-dessus formerait une "étape" séparée et donc une méthode séparée. Par conséquent, comment ce lien peut-il être fait?

est la seule façon de placer les instances des classes d'objets de la page (par exemple homePage, loginPage, etc) dans un stock de déclarations persistant cross gherkin (par exemple comme un poco specflow ou 'World')?

23
demandé sur orde 2014-10-15 13:19:47

3 réponses

Ok donc après avoir demandé à de nombreux experts en Dev et test automation, il semble que la solution soit de continuer à lier [e.g. WelcomePage welcomePage = loginPage.loginWithValidUser(validUser)] est le chemin à parcourir.

to persist instance of page objects across steps (e.g. welcomePage dans l'exemple ci-dessus) vous pouvez utiliser l'outil d'injection de dépendances (création de fonctionnalités similaires aux extensions mondiales dans L'implémentation de cucumber de Ruby).

voici plus d'info: https://cukes.info/docs/reference/java-di

cependant, la plupart des projets bénéficieront d'un module D'Injection de dépendances pour mieux organiser votre code et partager l'état entre Step Définition.

Plus d'info de SpecFlow (l' .net officiel de concombre mise en œuvre):

http://specflow.org/getting-started/beyond-the-basics/

et enfin, j'ai créé un blog entier autour de cette zone qui pourrait aider les gens, depuis gherkin/page interaction objet est un sujet de grand intérêt pour moi:

http://www.seligmanventures.com/dev-blog/test-automation-page-object-model-with-gherkin

4
répondu Charlie Seligman 2017-12-18 09:41:47

Quand il s'agit de la plupart des sites web (url peut être utilisé), à mon avis, il est préférable de se contenter d'utiliser l'url au lieu d'une action pour obtenir la même url.

Par exemple:

# Suggested by OP:
driver = Selenium::Webdriver.for :chrome, prefs: prefs
homepage = Homepage.new(driver)
login = homepage.go_to_login
welcome = login.log_in_as('dave4429')

# My Suggestion:
homepage = Url.new('/')
login = Url.new('/login')
welcome = Url.new('/welcome')

Cela signifie que vous commencez à partir d'une url au lieu d'avoir à commencer à la page d'accueil pour chaque test. Vous auriez toujours les méthodes que vous avez suggérées, mais elles seraient utilisées dans d'autres domaines, afin de s'assurer que l'utilisateur peut accéder à la page par des moyens autres que URL.

cependant, il ne s'agit pas d'une solution à guichet unique. Avec les applications mobiles et de bureau, votre seule option peut être de passer par l'écran d'accueil, auquel cas, la méthode que vous avez suggéré est certainement celle pour aller.

"la Page des objets eux-mêmes ne devriez jamais faire des vérifications ou des affirmations. Cela fait partie de votre test et devrait toujours être dans le code du test, jamais dans un objet de page."- Sélénium HQ

L'exemple que j'ai donné était très basique, et je les emballerais très probablement dans des modules et des classes, pour permettre un codage comme celui-ci:

google = Project::Pages::Google.new

google.search_for('Hello, World!')
expect(google.found_result?).to_equal(true)

Modifier

en plus de cela, vous semblez avoir une idée fausse de la façon dont le concombre fonctionne avec le cornichon.

Vous pouvez avoir plusieurs lignes de code par étape, l'étape elle-même est une description des actions à l'intérieur de l'étape.

Pour exemple:

Given I am logged in as "dave4429"
When I have submitted the "Contact Us" form with the following data:
   | dave4429@example.com | David McBlaine | I want to find out more about your Data Protection services, can I talk to a staff member or get a PDF? |
Then an email should be sent to "support@example.com" with the details specified

La définition du "Quand" peut ressembler à ceci:

When(/^I have submitted the "Contact Us" form with the following data:$/) do |table|
  rows = table.raw
  row = rows[0]

  contact_us.fill_form({email: row[0], username: row[1], message: row[2]})
  contact_us.submit_message
  expect(browser.title).to_equal("Message Sent!")
end

tout dépend de combien vous briser les étapes dans la définition.

Edit #2

il est également clair pour moi que vous voulez faire méthode chaînage, quelque chose dans le chemin de contact_us.fill_form({email: row[0], username: row[1], message: row[2]}).submit_message, ce qui, encore une fois, n'est pas hors de question en utilisant les techniques que je suggère, mais la question de savoir si ce chaînage devrait être pour chaque la page individuelle, ou si tout doit être inclus dans une classe ou un module, ne peut être répondu que par vos besoins.

C'est juste mon avis que cela mettrait trop en une seule classe, et que l'élimination de cette classe permettra plus de contrôle à la testeurs, et moins redondant code sera écrit.

0
répondu Kyle Fairns 2017-10-09 16:20:44

après de longues discussions sur ce sujet, une alternative tout aussi plausible est de ne pas renvoyer d'occurrences de nouvelles pages en utilisant le motif d'objet de la page avec gherkin. Vous perdrez l'avantage de lier ce que vous obtenez normalement avec POM, mais le code sera sans doute mieux lu et moins complexe. En postant cette réponse alternative, afin de tester la communauté, nous pouvons voter quelle méthode est la préférence des peuples.

-2
répondu Charlie Seligman 2017-10-04 15:29:48