Améliorer la stabilité des tests Selenium avec les tentatives et les attentes Pytest / Blogs / Perficient

Introduction
Les tests irréguliers, c’est-à-dire ceux qui échouent par intermittence, constituent un casse-tête courant pour les équipes d’automatisation des tests. Ils peuvent être particulièrement frustrants Sélénium tests en raison de la nature dynamique des applications Web. Le chargement des éléments peut prendre du temps, la navigation dans les pages peut être lente ou les applications lourdes en JavaScript peuvent retarder les interactions. Ces problèmes conduisent à faux négatifs dans les tests, où les tests échouent même si l’application fonctionne correctement.
Dans ce blog, nous explorerons comment utiliser Nouvelles tentatives de test Pytest et attentes explicites/implicites pour améliorer la stabilité de vos tests Selenium et réduire les échecs de tests irréguliers.
Pourquoi les tests de sélénium sont instables
Les tests instables échouent généralement en raison des problèmes suivants :
- Contenu dynamique: éléments qui prennent du temps à charger (comme le contenu AJAX) ou des pages au rendu lent.
- Problèmes de réseau: Retards ou échecs dans le chargement des ressources ou des appels API.
- Problèmes de timing: Essayer d’interagir avec des éléments avant qu’ils ne soient complètement chargés ou prêts.
La clé pour réduire les tests irréguliers réside dans deux techniques : nouvelles tentatives et attend.
Utilisation des tentatives Pytest pour les tests instables avec pytest-rerunfailures
Une solution simple pour atténuer les tests irréguliers consiste à réessayer des tests échoués un certain nombre de fois. Le échecs de réexécution de pytest Le plugin vous permet de réexécuter automatiquement les tests qui échouent, réduisant ainsi l’impact des échecs intermittents.
- Installation: Installez le plugin pytest-rerunfailures :
bash pip install pytest-rerunfailures
- Configuration: Pour activer les nouvelles tentatives, utilisez l’option –reruns lors de l’exécution de vos tests. Par exemple, pour réessayer 3 fois un test ayant échoué, exécutez :
bash pytest --reruns 3
Vous pouvez également définir le nombre de tentatives dans votre pytest.ini fichier de configuration :
ini [pytest] reruns = 3 rerunsDelay = 2 #Delay between retries in seconds
- Exemple de tentatives: Disons que vous avez un test qui clique sur un bouton pour soumettre un formulaire. Parfois, en raison de problèmes de timing, le bouton peut ne pas être cliquable. En ajoutant des tentatives, le test réessayera automatiquement si l’échec est dû à un problème passager.
def test_submit_button(mocker): # Simulate flaky behavior mocker.patch('selenium.webdriver.common.by.By.ID', return_value="submit") # Trigger a click action on the button button = driver.find_element_by_id('submit') button.click() assert button.is_enabled() # Check button state
Utilisation des attentes pour garantir que les éléments sont prêts
En Sélénium, attend sont cruciaux pour garantir que les éléments avec lesquels vous souhaitez interagir sont disponibles et prêts. Il existe deux types d’attentes : implicite et explicite.
- Attentes implicites: Les attentes implicites demandent au WebDriver d’attendre un certain temps pour que les éléments apparaissent avant de lever une exception.
driver.implicitly_wait(10) # Waits for 10 seconds for elements to load
Bien que faciles à utiliser, les attentes implicites peuvent parfois ralentir les tests et rendre le débogage plus difficile car elles s’appliquent globalement à tous les éléments.
- Attentes explicites: Les attentes explicites sont plus puissantes et précises. Ils vous permettent d’attendre des conditions spécifiques avant de procéder aux interactions. WebDriverWait combiné avec les conditions attendues est couramment utilisé. Exemple : Attendez qu’un élément soit cliquable avant de cliquer dessus :
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID, "submit_button"))) element.click()
- Utilisation des attentes pour le contenu AJAX: Souvent, les pages Web utilisent AJAX pour charger le contenu de manière dynamique. Les attentes explicites sont parfaites pour attendre la fin du chargement des appels AJAX.
# Wait until the AJAX content is visible wait.until(EC.visibility_of_element_located((By.ID, "ajax-content")))
Meilleures pratiques pour les attentes et les tentatives
- Utilisez des attentes explicites pour un meilleur contrôle: les attentes explicites vous permettent d’attendre des conditions spécifiques (comme la visibilité ou la cliquabilité), améliorant ainsi la fiabilité des tests.
- Combiner les tentatives avec les attentes: assurez-vous que les nouvelles tentatives ne sont déclenchées qu’après un temps d’attente suffisant pour tenir compte des retards potentiels de chargement de page ou de rendu des éléments.
- Optimiser le timing des tests: Utilisez des attentes pour des éléments spécifiques plutôt que d’utiliser des attentes implicites globales, qui peuvent ralentir les tests.
Conclusion
En utilisant Nouvelles tentatives de test Pytest et attentes explicites/implicitesvous pouvez améliorer considérablement la stabilité de vos tests Selenium. Les nouvelles tentatives aident à gérer les échecs intermittents, tandis que les attentes garantissent que les éléments sont prêts avant d’interagir avec eux. Ensemble, ces stratégies réduisent les résultats de tests irréguliers, rendant votre suite de tests plus fiable et cohérente. Bon test !
Source link