Se faire tester avec du sélénium

Les tests sont souvent négligés dans la programmation et le développement Web n'est pas différent. De nombreux développeurs ne se sont pas encore rendus compte que les tests automatisés peuvent vous rendre plus productif, moins stressé et plus confiant pour le codage de la fonctionnalité suivante. Dans cet article, nous allons nous concentrer sur l'utilisation de Selenium pour automatiser les tests de navigateur..

En tant que développeurs Web, nous avons besoin de tests, car nous ne voulons certainement pas que les utilisateurs de nos applications nous signalent les rapports de bugs. Nous voulons que les tests soient automatique parce que les tests manuels, bien que parfois un mal nécessaire, sont lents, sujets aux erreurs et ennuyeux. Des tests manuels répétés d'une application Web dans plusieurs navigateurs peuvent être, franchement, destructeurs d'âme! Un outil comme Selenium peut vous rendre accro aux tests automatisés.


Être infecté par le test

Peut-être pouvez-vous comprendre cette expérience: vous ouvrez votre projet dans le but de coder une nouvelle fonctionnalité ou de corriger un bogue, et vous vous demandez: "Les modifications que je suis sur le point d’apporter ont-elles des effets secondaires non souhaités? Vais-je rompre mon code?" ? "

Cette peur de faire des changements ne fait que s’aggraver à mesure que le projet avance, et gâche souvent le plaisir de coder..

Mais, si vous avez une bonne série de tests automatisés et que vous les exécutez fréquemment, vous avez une bonne chance de savoir très rapidement si votre code a été cassé. Cela vous donne un sentiment de confiance plutôt que de peur, ce qui vous permet de simplement vous consacrer à ce que vous devez faire, qu'il s'agisse de mettre en œuvre de nouvelles fonctionnalités, de corriger des bogues ou de refactoriser. C'est très rafraîchissant.

C’est plus facile à comprendre quand on a eu du mal à programmer sans de bons tests. Il est tentant de penser: "Je veux juste commencer à coder la prochaine partie de mon application." C'est souvent plus le cas lorsque vous travaillez sur quelque chose de relativement simple. Mais comme tout développeur peut vous le dire, les choses peuvent rapidement devenir plus complexes. Tout à coup, il est effrayant de modifier le code, et c’est alors que vous appréciez vraiment un ensemble complet de tests pour vous aider..

Mais réduire la peur n'est qu'un avantage. Des tests bien rédigés documentent le système en développement, ce qui favorise une meilleure compréhension entre les développeurs et les clients. En regardant un test, vous devriez être capable de dire exactement comment un aspect particulier du système devrait se comporter. C'est un concept mis en avant par Behavior-Driven Development (discuté plus tard).

Une idée importante est qu’il est tout aussi important de tester votre application que de la construire. Cela vaut la peine de le répéter: réfléchir à la façon de tester votre système est aussi important que d'écrire le code de l'application..

C'est un changement de mentalité majeur, mais une fois que vous aurez compris que les tests automatisés sont un élément fondamental de la programmation et que vous en avez tiré les avantages, vous ne regarderez jamais en arrière. Je suis devenu accro au test lors de mon initiation au TDD, mais à mon sens, le fait d'être infecté par le test ne passe pas nécessairement par le TDD ou le test unitaire. Vous devez simplement avoir expérimenté l'énorme valeur des tests automatisés et vous sentir bizarre à propos de la programmation si ce n'est dans la routine de les écrire..

Une fois que vous êtes dans l'état d'esprit et que vous avez récolté les avantages, vous ne regarderez plus jamais en arrière

Une réponse à ces arguments pourrait être: "Tout cela ressemble à quelque chose qui prendrait beaucoup de temps; le temps pourrait coder la prochaine fonctionnalité." Après tout, nous avons normalement peu de temps à consacrer à un projet. Et c’est vrai, mettre en place et composer des tests automatisés prend du temps et des efforts. Cependant, le temps économisé à long terme et l'amélioration de la qualité qu'il permet de coder rendent une routine de tests automatisés rigoureuse qui en vaut la peine..

Nous utiliserons un outil gratuit appelé Selenium. Selenium automatise les navigateurs; il simule un utilisateur interagissant avec votre application Web, effectuant des clics de souris, une saisie de texte et même un glisser-déposer (entre autres). Il peut également être utilisé pour vérifier ce qui est affiché à l'écran.

Savoir développer de bons tests est une compétence que vous développez avec le temps, mais dans ce didacticiel, nous allons parler de la mise en route des tests de navigateur avec Selenium..


Une vue des tests à partir de 10 000 pieds

Si vous débutez dans le domaine des tests, il est utile d’avoir une idée générale des types de tests couramment utilisés. Différents types de tests sont utilisés à des fins différentes. N'oubliez pas que la terminologie entourant les tests est quelque peu incohérente. Différentes personnes utilisent le même terme pour désigner des choses légèrement différentes..

Tests unitaires sont utilisés pour vérifier l'exactitude des classes, méthodes et fonctions individuelles. Le code en cours d’exercice doit rester isolé des autres parties du système. Pour ce faire, on utilise des substituts aux éléments dont dépend le code soumis au test. De cette façon, il est facile de voir où le problème se produit lorsqu'un test échoue. Les tests unitaires ont tendance à être les tests les plus rapides à exécuter et aucun code impliqué ne devrait faire des choses comme frapper une base de données ou accéder au réseau.

Les tests unitaires ne doivent pas viser à vérifier que des composants individuels du système fonctionnent ensemble correctement; c'est là qu'interviennent les tests d'intégration.

Niveau faible tests d'intégration pourrait traiter de l'interaction entre deux ou trois classes, alors que d'autres pourraient vérifier que le code fonctionne correctement avec des ressources externes, par exemple une base de données ou un serveur HTTP.

Tests du système, Ce tutoriel s’intègre dans le système intégré afin de vérifier si les exigences de l’ensemble du système sont remplies. Les tests système peuvent concerner des aspects tels que les performances et l'évolutivité, mais le type de tests sur lesquels nous allons nous concentrer est de savoir si le système se comporte ou non comme le client l'attend et implémente les fonctionnalités qu'il a spécifiées. Dans les cercles du développement agile, ces tests entrent dans la catégorie des tests d'acceptation.

L'exemple de code présenté ci-dessous effectue ce type de test. Ces tests nous indiquent si notre application se comporte ou non de la manière que nous souhaitons, du point de vue de l'utilisateur. Nous pouvons utiliser Selenium pour automatiser des tests de ce type, car il peut simuler un utilisateur interagissant avec le système (et il peut le faire en utilisant de vrais navigateurs Web, ainsi que des systèmes sans tête, comme HtmlUnit)..

Parce que nous ne serons intéressés que par quoi le système fait, et pas Comment Si nous le faisons, nous allons participer à des tests de la boîte noire. Il convient également de noter que, contrairement à la plupart des autres types de tests, les tests d'acceptation doivent être écrits en collaboration avec les clients..


Pas besoin de choisir

Quel type de tests devriez-vous utiliser?

Nous pouvons utiliser Selenium pour automatiser les tests car il peut simuler un utilisateur interagissant avec le système.

Le gâteau est un type de nourriture mais la plupart des gens (pas moi) déconseillent de le manger exclusivement; il complète plutôt que remplace d'autres aliments. Il est important de noter que les différents types de tests se complètent plutôt que d’être en concurrence. Comme mentionné ci-dessus, ils servent des objectifs différents. Chacune d’entre elles présente des avantages et des inconvénients et elles ne sont certainement pas incompatibles..

Les tests au niveau du système, basés sur une interface utilisateur graphique, tels que les exemples ci-dessous, ont tendance à être relativement lents à exécuter et ne fournissent donc pas de retour d'information rapide. Les tests de ce type ont également tendance à être fragiles et, comme ils touchent une grande partie du code de l'application, il peut être difficile de rechercher l'origine d'un échec sans un ensemble complet de tests unitaires et d'intégration. En fait, il est judicieux d’avoir beaucoup plus de tests au niveau de l’unité que le type de tests basés sur l’interface graphique, au niveau du système, pour lesquels Selenium est utilisé. Cela ne veut pas dire que les tests au sélénium ne sont pas utiles! Le fait est qu'aucun type de test n'est suffisant en soi.


Deux c'est mieux qu'un

Nous utiliserons Selenium 2. Plus précisément, nous utiliserons WebDriver, un composant de Selenium 2. WebDriver remplace l'API Remote Control (RC) de Selenium 1. Il offre de nombreux avantages par rapport à la RC. Par exemple, il est préférable de tester AJAX et il dispose d'une API plus propre, plus orientée objet. Cela fonctionne aussi d'une manière complètement différente de la RC. Plutôt que d'utiliser JavaScript pour interagir avec une page, WebDriver utilise l'interface d'automatisation de navigateur spécifique à chaque navigateur. Le résultat est que cela simule mieux un utilisateur réel interagissant avec le site Web testé.

Un autre composant de Selenium est IDE, un outil d’enregistrement et de lecture et un plugin Firefox. Il ne nécessite pas de connaissances en programmation et est utile pour les tests exploratoires.

Ses tests ont tendance à être plus fragiles que les scripts RC et WebDriver et un gros inconvénient évident est qu’il ne peut être utilisé que dans Firefox. IDE est conçu comme un outil de prototypage et n'est pas recommandé pour des tests sérieux..

WebDriver prend en charge une grande variété de navigateurs, notamment Chrome, IE, iOS et Android. Nous examinerons ensuite l'utilisation des services de test sur le cloud afin de pouvoir exécuter des tests sur des combinaisons navigateur-système d'exploitation auxquelles vous n'auriez peut-être pas accès autrement..

Ici, WebDriver sera utilisé avec Python, mais un certain nombre de liaisons de langage sont disponibles, y compris celles pour Java, C # et PHP. Si vous n'êtes pas familier avec Python, n'ayez crainte, vous devriez quand même pouvoir suivre les exemples, car cela se lit à peu près comme du pseudo-code..

Python… se lit à peu près comme du pseudo-code

Un certain nombre d’autres interfaces sont disponibles, mais les deux éléments clés de l’API WebDriver dont nous avons besoin sont: WebDriver et WebElement. Chaque exemple ci-dessous fonctionnera avec un WebDriver objet, qui correspond au navigateur, et un ou plusieurs objets de type WebElement, qui représentent des éléments sur une page.

Les méthodes de localisation des éléments sur une page (voir plus loin) sont communes à ces deux interfaces. D'autre part, des méthodes telles que tag_name ne sont disponibles que sur WebElement. De même, il est logique pour des méthodes telles que get_cookies et rafraîchir être disponible sur WebDriver mais pas sur WebElement, et c'est bien le cas.

Il est intéressant de noter que certains efforts ont été déployés pour faire de WebDriver une norme W3C..


Saisissez ce dont vous avez besoin

Actuellement, Selenium 2 prend en charge Python 2.6 et Python 2.7, donc installez-en un si vous en avez besoin. Pour savoir quelle version vous avez, dans le type de ligne de commande python -V. Les utilisateurs de Linux et Mac ont généralement déjà Python, mais ils doivent faire attention lors de la mise à niveau de leur version de Python car le système d'exploitation peut dépendre de la version fournie avec le système d'exploitation..

Une fois que vous avez Python 2.6 ou 2.7, le meilleur moyen d’installer des paquetages est avec pip. Une fois que vous avez pipé, pour installer le type Selenium 2: pip installer -U sélénium. (-U mettra à niveau toute version précédente que vous pourriez avoir. Les utilisateurs de Linux et Mac pourraient avoir besoin sudo).

Pour obtenir pip sur Windows, consultez cette question relative au débordement de pile..

Nous allons également utiliser Firefox, car c'est le navigateur qui fonctionne avec WebDriver dès la sortie de la boîte..


Tu ne devineras jamais

Nous avons besoin d’une application Web à tester et nous utiliserons un simple jeu de devinette. C'est un programme délibérément simple. Une application Web est souvent testée sur la machine d'un développeur à l'aide d'un serveur Web de développement exécuté localement, ce qui est pratique pour les tests avant le déploiement. Cependant, dans ce cas, nous exécuterons des tests sur une application Web déployée: http://whats-my-number.appspot.com. Ce sera l'application sous test (AUT). (Si ce site est en panne, essayez http://whats-my-number-backup.appspot.com/).

La réponse (désolé de gâcher le plaisir) est 42.

Quelle que soit la saisie de l'utilisateur, un indice devrait être affiché. Le programme s'attend à des nombres entiers compris entre 0 et 100 (inclus). Si l'utilisateur doit entrer une valeur qui ne correspond pas à cette règle, le conseil doit le lui signaler. Lorsque l'utilisateur essaie de deviner un nombre entier incorrect compris entre 0 et 100, l'indice indiqué doit être "trop ​​bas" ou "trop ​​élevé". Quand 42 est entré, "Félicitations" devrait être l'indice affiché.

Nous avons déjà évoqué l'idée qu'un bon moyen de préciser le comportement d'un système consiste à écrire des tests. Les exemples suivants impliqueront un ensemble assez complet de tests permettant de communiquer le comportement souhaité du système. Nous aurons une forme de documentation exécutable.

Nous aurons une forme de documentation exécutable

L'un des avantages d'un langage tel que Python est que vous pouvez utiliser un interpréteur interactif. Pour exécuter l'interpréteur Python interactif, tapez simplement python en ligne de commande, et vous devriez voir son invite (>>>). Sinon, pour exécuter un fichier de script, utilisez python nom_script.py

Ce n’est pas la façon dont le code de test est généralement exécuté, mais lorsque vous commencez à utiliser l’automatisation du navigateur, il peut être utile d’utiliser l’interpréteur interactif et de taper une ligne de Python à la fois. De cette façon, il est plus facile de comprendre comment WebDriver contrôle le navigateur et simule un utilisateur réel. Bien que vous puissiez à la place exécuter un fichier de script et observer les événements pendant que Selenium agit, les choses fonctionnent à un rythme beaucoup plus rapide qu’avec un utilisateur humain. Par conséquent, l’exécution de commandes une ligne à la fois permet d’apprécier plus facilement ce les commandes que vous donnez sont en train de faire. C'est un excellent moyen d'apprendre et d'expérimenter.


Pouvons-nous réellement faire des tests maintenant?

Tapez les lignes de code suivantes à l'invite de l'interprète, en appuyant sur Entrée après chaque. La première étape consiste à effectuer une importation:

depuis le webdriver d'importation de sélénium

Ensuite, nous ouvrons une fenêtre de navigateur et visitons le AUT:

browser = webdriver.Firefox () browser.get ('http://whats-my-number.appspot.com/')

Maintenant, nous allons faire quelque chose qui en fasse un test. Python intégré affirmer statement peut être utilisé pour vérifier que quelque chose est vrai, et dans ce cas, nous l'utilisons pour vérifier que le titre de la page est "What's My Number". Ceci peut être appelé test de contenu:

affirmer "Quel est mon numéro?" == browser.title

Comme le titre de la page est correct, Python nous donne simplement une autre invite. Le titre étant incorrect aurait signifié affirmer jeter un AssertionError. Un AssertionError lors de l'exécution d'un fichier de script provoque le blocage du programme (ce qui est utile).

La partie suivante de notre test est ce que la documentation Selenium appelle un test de fonction. Nous voulons vérifier que lorsque 1 est entré comme hypothèse, le programme répond avec un contenu incluant un indice indiquant que l'hypothèse est trop basse. Des exemples ultérieurs traiteront de plusieurs entrées d'utilisateur.

Pour ce faire, nous devons remplir le formulaire. Si vous regardez le code HTML de la page du jeu de devinettes, vous verrez que le champ de saisie de texte a une prénom attribuer avec la valeur de 'deviner'. Ceci peut être utilisé pour obtenir un WebElement objet pour représenter le champ de saisie:

guess_field = browser.find_element_by_name ('suppose')

Nous pouvons maintenant taper la conjecture. WebElement a un send_keys méthode:

guess_field.send_keys ('1')

Nous pourrions trouver le bouton de soumission et cliquer dessus, ou utiliser le soumettre méthode, mais au lieu de cela, appuyez sur la touche Retour:

à partir de selenium.webdriver.common.keys import Keys guess_field.send_keys (Keys.RETURN)

Le formulaire est soumis et la page est rechargée (AJAX n'est pas utilisé). Etant donné que l'estimation est trop basse, "Votre estimation est trop faible" devrait être affiché quelque part dans le corps du document. Pour vérifier cela, nous avons besoin d'un WebElement objet qui représente le HTML corps:

body = browser.find_element_by_tag_name ('body')

le texte propriété de WebElement Dans ce cas, révélera le texte de la page. Utilisons cela dans un affirmer déclaration:

affirmez 'Votre estimation est trop basse' dans body.text

Encore une fois, le succès, Python nous donne simplement une autre invite. Comme il s’agit d’une hypothèse incorrecte, "Félicitations" n’est visible nulle part:

affirmer 'Félicitations' pas dans body.text

Enfin, nous fermons l'instance de Firefox que nous utilisons:

browser.quit ()

Acquisition cible

Si vous connaissez la programmation utilisant JavaScript et le DOM, vous saurez qu'il est nécessaire d'obtenir des références aux éléments DOM d'une page Web et, comme nous l'avons vu, nous devons faire quelque chose de similaire ici. Cependant, les deux situations ne sont pas exactement les mêmes, car plutôt que d’obtenir une référence à un élément DOM, nous obtenons un WebElement objet qui correspond à un élément DOM.

Ci-dessus nous avons utilisé find_element_by_name, qui est utile pour les éléments de formulaire, ainsi que find_element_by_tag_name. D'autres méthodes de localisation incluent find_element_by_id et find_element_by_css_selector. Voir la documentation de Selenium pour la liste complète.

En termes de performances, l’utilisation d’un identificateur d’élément ou d’un localisateur de nom (comme nous l’avons fait plus haut) est le meilleur moyen de sélectionner un élément. Bien sûr, une fois que nous avons un WebElement objet qui correspond à l'élément DOM souhaité, il est courant de vouloir interagir avec lui d'une manière ou d'une autre, c'est là que des méthodes comme send_keys et Cliquez sur sont utiles.


Fragile peut être dangereux

Les tests fragiles sont dangereux car, si les tests échouent parfois alors qu’ils doivent réussir, vous en venez à ignorer les résultats des tests, et tout le processus de test devient dévalorisé..

Dans le fichier zip téléchargeable accompagnant ce tutoriel, ftests1.py répertorie l'exemple de code de test ci-dessus sous la forme d'un fichier de script. Cependant, il y a une omission: vous remarquerez peut-être que l'appel à implicitement_wait, inclus dans ftests1.py, n'a pas été répertorié ou discuté.

Si vous exécutez un test contre un système dix fois, il devrait vous donner le même résultat à chacune de ces dix fois. Cependant, les tests fragiles et peu fiables du type que nous réalisons sont assez courants, et vous pourriez rencontrer ce problème lorsque vous testez des tests au sélénium. Les tests fragiles sont dangereux car, si les tests échouent parfois alors qu’ils doivent réussir, vous en venez à ignorer les résultats des tests et le processus de test dans son ensemble devient dévalué. implicitement_wait est un outil très utile pour combattre les tests fragiles, et à partir de ce moment un appel à implicitement_wait sera utilisé dans tout le code d'exemple.


Je pensais que vous disiez que nous ne sommes pas des tests unitaires

En tant que développeur infecté par un test, vous aurez envie de connaître les outils xUnit. Ils sont disponibles pour de nombreux langages de programmation. unittest est un outil xUnit fourni en standard avec Python. Cela peut sembler déroutant mais, bien que nous n'écrivions pas de tests unitaires, unittest est utile. Par exemple, unittest aide à structurer et à exécuter des tests, et les échecs de test génèrent des messages plus utiles..

La version de Unittest dans Python 2.7 possède des fonctionnalités supplémentaires par rapport aux versions antérieures (nous en utiliserons certaines), donc si vous utilisez Python 2.6, vous devez installer le backport: pip installer unittest2

Le code ci-dessous est une version unittest du code de test présenté précédemment..

Comme auparavant, le titre de la fenêtre du navigateur est vérifié, 1 est essayé comme une estimation et la réponse du programme est vérifiée:

try: import unittest2 sous unittest # pour Python 2.6 sauf ImportError: import unittest depuis sélenium import webdriver depuis selenium.webdriver.common.keys import Keys class GuessTest (unittest.TestCase): def setUp (self): self.browser = webdriver.Firefox () self.browser.implicitly_wait (3) def tearDown (self): self.browser.quit () def test_should_see_page_title (self): # Brian visite le site Web du jeu de devinettes self.browser.get ('http: // whats-my -number.appspot.com/ ') # Il voit que "Quel est mon numéro?" est le titre de la page self.assertEqual ('Quel est mon numéro?', self.browser.title) def test_should_get_correct_hint_from_guess_too_low (self): # Brian visite le site Web du jeu de devinettes self.browser.get ('http: // whats-my-number.appspot.com/ ') # Il saisit sa conjecture dans le champ de formulaire et appuie sur la touche de retour guess_field = self.browser.find_element_by_name (' guess ') guess_field.send_keys (' 1 ') guess_field.send_keys ( Keys.RETURN) # La page est rechargée et étant donné que l'estimation est trop basse, # 'Votre estimation est trop basse' est affiché body = self.browser.find_element_by_tag_name ('body') self.assertIn ('Votre estimation est trop basse' , body.text) # Comme il s’agit d’une hypothèse incorrecte, "Félicitations" n’est nulle part. self.assertNotIn ("Félicitations", body.text) si __name__ == "__main__": unittest.main ()

Cerveau est le nom de notre "utilisateur de robot". Voir également ftests2.py dans le fichier zip accompagnant ce tutoriel.

Les tests individuels sont des méthodes de la classe GuessTest, qui hérite de unittest.TestCase. Pour plus d'une idée sur le soi mot-clé et autres aspects de Python relatifs aux objets, voir Session Nettuts sur Python. Les noms des méthodes de test doivent commencer par les lettres tester. Il est essentiel de faire des noms de méthodes descriptifs.

Bien sur un affirmer est essentiel à tout test, mais en fait plutôt que d'utiliser le affirmer comme auparavant, nous avons accès aux méthodes d'affirmation de unittest. Dans ce cas AssertEqual, affirmer et assertNotIn sont utilisés.

le installer et abattre les méthodes sont exécutées avant et après chacune des méthodes de test, et nous les utilisons ici pour démarrer et arrêter une instance de navigateur WebDriver.

Le dernier bloc, si __name__ == '__main__': unittest.main (), permet à ce script unittest d'être exécuté à partir de la ligne de commande. Pour exécuter le script, accédez au répertoire contenant ftests2.py et type: python ftests2.py. Faire devrait produire un résultat comme ceci:

Idéalement, les tests doivent échouer "bruyamment" mais réussir "tranquillement", et comme vous pouvez le voir, c’est exactement ce que fait unittest: seule une période est imprimée pour chaque méthode de test réussie. Enfin nous voyons un accueil "OK" (ne devrait-il pas être "Bien joué"?).

Comme vous pouvez le constater, le principe "Ne vous répétez pas" est violé, en ce sens que l'URL de l'AUT est deux fois dans le code. Des tests approfondis permettent de refactoriser le code de l'application, mais n'oubliez pas de modifier également le code de test.


Devine encore

Jusqu'à présent, nos tests ne comportaient qu'une seule hypothèse: 1 et, de toute évidence, ce n'est pas très complet. Le prochain script fera quelque chose à ce sujet, voir ftests3.py dans le fichier zip.

le importation déclarations, déclaration de classe, installer et abattre méthodes, et le si __name__ == '__main__': bloc, sont exactement les mêmes que dans le dernier exemple. Alors concentrons-nous sur les choses qui sont différentes.

Comme c'est quelque chose que nous ferons à plusieurs reprises, remplir le formulaire a été mis dans sa propre méthode d'assistance, nommée _enter_guess_hit_return:

def _enter_guess_hit_return (self, suppose): guess_field = self.browser.find_element_by_name ('suppose') suppose_field.send_keys (suppose) suppose_field.send_keys (Keys.RETURN)

Une autre méthode d'assistance, _unsuccessful_guess, traite avec visiter l'AUT, en appelant _enter_guess_hit_return, et en appelant les méthodes d'assertion. Encore une fois, notre utilisateur de robot pourrait faire avec un nom, cette fois, appelons-le Bertie.

def _unsuccessful_guess (self, berties_guesses, attendus_msg): self.browser.get ('http://whats-my-number.appspot.com/') pour berties_guess dans berties_guesses: self._enter_guess_hit_return (berties_guess) body = self.browser. find_element_by_tag_name ('body') self.assertIn (attendu_msg, body.text) self.assertNotIn ('Félicitations', body.text)

Vous remarquerez peut-être cet appel _enter_guess_hit_return et effectuer les assertions se passe dans une boucle. C'est parce que nous sommes en boucle sur berties_guesses, qui est une liste. berties_guesses sera passé à cette méthode par les méthodes de test appelantes, qui passeront également dans un message attendu, attendu_msg.

Maintenant, pour utiliser nos aides dans les méthodes de test:

def test_should_get_correct_hint_from_guess_too_low (self): berties_guesses = ['0', '01', '17', '17', '17', '171'] expect_msg = 'Votre supposition est trop basse ): berties_guesses = ['43', '80', '100'] attendu_msg = 'Votre estimation est trop élevée' self._unsuccessful_guess (berties_guesses, expect_msg) def test_should_correct_hint_from_invalid_input (self): berties_guesses = ['a', ' , 'c7', '1.2', '9.9778', '-1', '-10', '101', 'hkfjdhkacoe'] expect_msg = 'Veuillez fournir un nombre entier de 0 à 100' self._unsuccessful_guess (berties_guesses, attendu_msg)

Par souci de brièveté, la vérification du titre de la page a été supprimée. Bien sûr, il devrait exister une méthode pour vérifier que, lorsque la proposition correcte est fournie, le message "Félicitations" est bien affiché et vous êtes invité à écrire cette méthode (ce sera amusant, je vous le promets!).


Oups, j'ai appuyé sur le bouton rouge

Le dernier exemple de script nous donne un bon degré de confiance dans le fait que le programme AUT fonctionne comme il se doit. Mais supposons que le code de l'application doive maintenant changer. Par exemple, le client veut une nouvelle fonctionnalité, ou nous voulons refactoriser, ou peut-être que les tests unitaires ou d'intégration ont découvert une erreur que les tests au niveau du système n'ont pas révélée (et nous souhaitons maintenant corriger cette erreur). Au cours du processus de modification du code, les tests existants doivent être exécutés fréquemment afin que les problèmes apparaissent le plus tôt possible..

Simulons une modification du code de l'application. Une version modifiée du jeu est à http://whats-my-number-broken.appspot.com et si vous exécutez ftests3.py contre cette version, vous verrez un échec de test:

test_should_get_correct_hint_from_guess_too_high est en train d'échouer. Le test montre que lors de la modification du code de l'application, une régression a été introduite. Nous effectuons les tests régulièrement et il suffit de prendre en compte les modifications apportées depuis la dernière exécution des tests pour réduire le problème. De cette manière, l’écriture de tests nous a valu une confiance en soi plutôt qu’un sentiment de peur..


"Ca marche sur ma machine"

Les applications Web sont généralement censées fonctionner correctement sur une grande variété de navigateurs. Par conséquent, il est généralement préférable de tester avec autant de navigateurs sur autant de plateformes que vous le pouvez. Quand un problème avec un système est découvert, il n’est pas rare d’entendre un développeur dire: "Cela fonctionne sur ma machine". Cela revient souvent à: "Nous ne l’avons pas testé correctement". Dans le cas du jeu de devinettes numériques, vous pouvez vous demander si des tests sur plusieurs navigateurs sont nécessaires, mais il s’agit bien entendu d’un système simple et délibéré..

Des services en nuage tels que Sauce Labs peuvent vous aider. Sauce Labs propose une variété de combinaisons navigateur / système d'exploitation. Testingbot est un autre service qui propose des tests sur des plateformes mobiles..

Comme vous l'avez vu, nous effectuons des tests sur un site accessible au public, mais pour les sites en développement et les sites intranet, Sauce Labs propose les offres Sauce Connect et Testingbot Tunnel.

Les exemples de code jusqu'ici ont été codés en dur pour utiliser Firefox. ftests3_remote.py, disponible dans le fichier zip, est une version améliorée de ftests3.py qui peut être facilement configuré pour fonctionner avec une combinaison navigateur-système d’exploitation donnée (dans la limite des possibilités offertes par le service de test sur le cloud que nous utilisons). La plate-forme, le navigateur et la version du navigateur sont spécifiés sur la ligne de commande lors de l'exécution du script..

Les exemples de code jusqu'ici ont été codés en dur pour utiliser Firefox

Vous devez vous inscrire à un service tel que Sauce Labs ou TestingBot pour obtenir une clé API et modifier le installer méthode (comme indi