Le test est un sujet très large, que ce soit des tests unitaires, des tests fonctionnels, des tests d'acceptation, etc. Dans cet article, nous allons voir comment vous pouvez effectuer des tests d'acceptation à l'aide de sélénium. J'utiliserai un exemple pratique pour illustrer un véritable cas d'utilisation. Je suppose que vous savez déjà comment effectuer des tests unitaires à l'aide de phpunit, ou que vous avez au moins la compréhension de ce dont il s'agit. Commençons.
Les tests d'acceptation sont le processus de raconter des histoires d'utilisateurs à travers des tests, et j'adore cette citation pour le décrire:
Un test formel effectué pour déterminer si un système satisfait ou non ses critères d'acceptation et pour permettre au client de déterminer s'il accepte ou non le système.
Selenium est un outil pour automatiser les tests d'interface utilisateur. Il aide à tester votre application contre le navigateur. Le processus pourrait être décrit comme tel:
Vous vous demandez peut-être: «Comment manipule-t-il la page Web en utilisant les tests décrits?»
La réponse est «cela dépend». Si vous utilisez Selenium RC (précédemment nommé Selenium 1), il injectera le code JavaScript généré automatique sur la page pour effectuer les actions souhaitées. Selenium RC est obsolète et n'est pris en charge qu'en mode de maintenance; vous devriez utiliser lediriver de sélénium.
Lorsque vous utilisez Selenium WebDriver (Selenium 2), les tests sont traduits en commandes et transmis au serveur Selenium (plus à ce sujet dans un instant), puis transmis au navigateur à l'aide de l'API native du navigateur Web.
Parce que nous n'avons pas vraiment d'application à tester, je vais utiliser une page d'enregistrement des utilisateurs. L'utilisateur entrera ses informations personnelles et certaines informations de facturation. Si tout est bon, la page doit tout sortir est bonne!. Sinon, la page affichera le formulaire d'abonnement avec une liste des messages d'erreur de validation.
Nous allons commencer à tester notre application à l'aide de phpunit avec l'extension de sélénium. Assurez-vous de les installer à l'aide du compositeur avant de démarrer.
<span>composer require --dev phpunit/phpunit </span><span>composer require --dev phpunit/phpunit-selenium</span>
Nous avons déjà dit que les commandes sont transmises à un serveur Selenium, qui les transmet ensuite au navigateur. Nous devons télécharger le serveur Selenium, qui n'est qu'un exécutable d'archives Java. Le serveur peut être exécuté à l'aide de Java -Jar Selenium-Server-Standalone-
<span>alias sserve="java -jar /usr/local/bin/selenium-server-standalone-<version>.jar"</span>
PHPUnit prend en charge Selenium RC et WebDriver, et il fournit deux classes à cette fin. Le phpunit_extensions_seleniumtestcase est utilisé pour la version RC, et le phpunit_extensions_selenium2testcase est utilisé pour la version WebDriver. Ainsi, votre test doit prolonger l'un d'eux pour commencer. N'oubliez pas que la version RC est obsolète, nous allons donc utiliser le webDriver un dans notre exemple ci-dessous.
<span>// tests/acceptance/UserSubscriptionTest.php </span> <span>class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase </span><span>{ </span> <span>public function setUp() </span> <span>{ </span> <span>$this->setHost('localhost'); </span> <span>$this->setPort(4444); </span> <span>$this->setBrowserUrl('http://vaprobash.dev'); </span> <span>$this->setBrowser('firefox'); </span> <span>} </span><span>}</span>
La méthode de configuration est utilisée pour préparer l'environnement de test. Dans ce cas, nous l'utilisons pour indiquer à Phpunit où notre serveur Selenium s'exécute, quel navigateur nous utiliserons et l'URL de notre application. La méthode SETHOST est par défaut vers LocalHost et la méthode Setport par défaut est à 4444, afin qu'ils puissent être omis ici. Cependant, cela peut être utilisé si votre serveur de test se trouve dans une machine Windows qui prend en charge Internet Explorer pendant que vous exécutez vos tests à partir d'une autre machine différente, etc.
La méthode de démontage est appelée lorsque les tests sont effectués, et il est utilisé pour effacer l'étape. Nous l'utilisons pour fermer le navigateur et terminer la session en cours.
<span>public function tearDown() </span><span>{ </span> <span>$this->stop(); </span><span>}</span>
Les fournisseurs de données PHPUNIT nous permettent de nourrir nos tests avec des données spécifiques sans avoir à les itérer dessus. Vous pouvez en savoir plus dans la documentation.
<span>// tests/acceptance/UserSubscriptionTest.php </span> <span>class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase </span><span>{ </span> <span>public function validInputsProvider() </span> <span>{ </span> <span>$inputs[] = [ </span> <span>[ </span> <span>'username' => 'younesrafie', </span> <span>'password' => 'mypassword', </span> <span>'password_confirmation' => 'mypassword', </span> <span>'email' => 'mymail@gmail.com', </span> <span>'cardHolderName' => 'RAFIE Younes', </span> <span>'cardNumber' => '378282246310005', </span> <span>'billingAddress' => 'Narjiss B Fez Morocco', </span> <span>'cvc' => '850', </span> <span>'expirationMonth' => '01', </span> <span>'expirationYear' => '2016', </span> <span>] </span> <span>]; </span> <span>return $inputs; </span> <span>} </span> <span>public static function invalidInputsProvider() </span> <span>{ </span> <span>$inputs[] = [ </span> <span>[ </span> <span>'username' => '@younesrafie', </span> <span>'password' => 'mypassword', </span> <span>'password_confirmation' => 'mypassword', </span> <span>'email' => 'mymail@gmail.com', </span> <span>'cardHolderName' => 'RAFIE Younes', </span> <span>'cardNumber' => '378282246310005', </span> <span>'billingAddress' => 'Narjiss B Fez Morocco', </span> <span>'cvc' => '850', </span> <span>'expirationMonth' => '01', </span> <span>'expirationYear' => '2016', </span> <span>], </span> <span>"Username must only contain alpha numeric characters and dashes." </span> <span>]; </span> <span>// ... </span> <span>return $inputs; </span> <span>} </span><span>}</span>
L'invalidInputsprovider renvoie une liste des entrées valides à l'exception d'un champ, et nous passons le message d'erreur attendu après l'échec de la validation.
Une tâche courante lorsque vous travaillez avec les pages Web est la sélection des éléments. L'extension sélénium de Phpunit offre une très belle API pour cela. Vous pouvez sélectionner des éléments par nom de classe, balise, nom, id, sélecteur CSS, xpath, etc. Valeur, mise à jour de l'élément CSS et un tas d'autres tâches courantes. Pour notre page, nous pouvons faire quelque chose comme ce qui suit.
<span>composer require --dev phpunit/phpunit </span><span>composer require --dev phpunit/phpunit-selenium</span>
Ce test sélectionnera l'entrée du nom d'utilisateur et définira une valeur, puis soumettra le formulaire d'abonnement. Nous pouvons ajouter une affirmation après cela pour voir si la réponse est comme prévu. Le corps de la page contiendra tout est bon! Si la validation passait.
<span>alias sserve="java -jar /usr/local/bin/selenium-server-standalone-<version>.jar"</span>
Notre fournisseur de données contient le nom d'entrée et la valeur correspondante. Nous créerons une méthode distincte pour gérer le remplissage des entrées de formulaire et la soumission.
<span>// tests/acceptance/UserSubscriptionTest.php </span> <span>class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase </span><span>{ </span> <span>public function setUp() </span> <span>{ </span> <span>$this->setHost('localhost'); </span> <span>$this->setPort(4444); </span> <span>$this->setBrowserUrl('http://vaprobash.dev'); </span> <span>$this->setBrowser('firefox'); </span> <span>} </span><span>}</span>
Pour pointer le navigateur vers une page spécifique, nous utilisons la méthode URL de la classe phpunit_extensions_selenium2testcase. L'URL est relative à celle fournie à la méthode SetBrowserurl. Ainsi, après avoir pointé le navigateur vers la page d'index, nous remplissons et soumettons le formulaire, puis testez le message de réussite attendu.
<span>public function tearDown() </span><span>{ </span> <span>$this->stop(); </span><span>}</span>
En supposant que votre serveur Selenium est opérationnel, allez-y et exécutez vos tests avec PHPUnit Tests / Acceptance / UsersubScriptionTest.php. Cela créera une nouvelle session de navigateur et commencera à remplir le formulaire. Nous nous attendons à ce que tout passe avec une affirmation réussie.
Certains tests échouent et la durée des tests est trop courte pour que nous observons ce qui a mal tourné. PHPUnit a la capacité de capturer des captures d'écran des tests d'échec en utilisant la méthode CurrentScreenshot qui renvoie une image blob que nous pouvons enregistrer.
<span>// tests/acceptance/UserSubscriptionTest.php </span> <span>class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase </span><span>{ </span> <span>public function validInputsProvider() </span> <span>{ </span> <span>$inputs[] = [ </span> <span>[ </span> <span>'username' => 'younesrafie', </span> <span>'password' => 'mypassword', </span> <span>'password_confirmation' => 'mypassword', </span> <span>'email' => 'mymail@gmail.com', </span> <span>'cardHolderName' => 'RAFIE Younes', </span> <span>'cardNumber' => '378282246310005', </span> <span>'billingAddress' => 'Narjiss B Fez Morocco', </span> <span>'cvc' => '850', </span> <span>'expirationMonth' => '01', </span> <span>'expirationYear' => '2016', </span> <span>] </span> <span>]; </span> <span>return $inputs; </span> <span>} </span> <span>public static function invalidInputsProvider() </span> <span>{ </span> <span>$inputs[] = [ </span> <span>[ </span> <span>'username' => '@younesrafie', </span> <span>'password' => 'mypassword', </span> <span>'password_confirmation' => 'mypassword', </span> <span>'email' => 'mymail@gmail.com', </span> <span>'cardHolderName' => 'RAFIE Younes', </span> <span>'cardNumber' => '378282246310005', </span> <span>'billingAddress' => 'Narjiss B Fez Morocco', </span> <span>'cvc' => '850', </span> <span>'expirationMonth' => '01', </span> <span>'expirationYear' => '2016', </span> <span>], </span> <span>"Username must only contain alpha numeric characters and dashes." </span> <span>]; </span> <span>// ... </span> <span>return $inputs; </span> <span>} </span><span>}</span>
La soumission de forme non valide est presque identique à la méthode précédente. Nous remplissons les entrées du formulaire et nous soumettons. Ensuite, nous vérifions que le message d'erreur de validation est comme prévu. Nous utiliserons l'invalidinputsprovider que j'ai mentionné plus tôt.
<span>class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase </span><span>{ </span> <span>public function testFormSubmissionWithUsername() </span> <span>{ </span> <span>$this->byName('username')->value('younesrafie'); </span> <span>$this->byId('subscriptionForm')->submit(); </span> <span>} </span><span>}</span>
La méthode BYCSSSeLector nous permet de récupérer un élément de la page à l'aide de sélecteurs CSS, dans ce cas le paragraphe d'erreur. Nous affirmons si le message d'erreur est comme prévu en utilisant le champ de message d'erreur à partir de la méthode du fournisseur de données.
Notre formulaire ne contient que des interactions de base comme la sélection des éléments, la définition de valeurs, la soumission du formulaire, etc. Cependant, nous pouvons également utiliser la méthode de clic sur un bouton ou un élément de lien pour vérifier que la page cible fonctionne comme prévu.
Nous avons utilisé le navigateur Firefox pour nos tests. Cependant, nous avons également la possibilité d'utiliser tout autre navigateur. Selenium utilise l'approche du pilote, où chaque fournisseur de navigateur travaille à fournir son propre pilote. Vous pouvez vérifier la liste des pilotes pris en charge dans la documentation.
Pour activer le navigateur Chrome, vous devez télécharger le chromedriver et spécifier le chemin d'option en tant que lancement du serveur Selenium.
<span>composer require --dev phpunit/phpunit </span><span>composer require --dev phpunit/phpunit-selenium</span>
<span>alias sserve="java -jar /usr/local/bin/selenium-server-standalone-<version>.jar"</span>
Si le contenu de votre page est chargé via AJAX et que vous ne souhaitez pas déclencher les tests directement sur le chargement de la page, vous voudrez attendre que votre page soit chargée et que vos éléments sont présents.
<span>// tests/acceptance/UserSubscriptionTest.php </span> <span>class UserSubscriptionTest extends PHPUnit_Extensions_Selenium2TestCase </span><span>{ </span> <span>public function setUp() </span> <span>{ </span> <span>$this->setHost('localhost'); </span> <span>$this->setPort(4444); </span> <span>$this->setBrowserUrl('http://vaprobash.dev'); </span> <span>$this->setBrowser('firefox'); </span> <span>} </span><span>}</span>
La fonction de rappel attendra jusqu'à ce que nous renvoyons une valeur non nulle et sera délai après deux secondes avec un message d'erreur. La méthode de recherche continuera à rechercher l'élément, mais si vous souhaitez spécifier un intervalle de recherche, vous pouvez utiliser la méthode implicite.
<span>public function tearDown() </span><span>{ </span> <span>$this->stop(); </span><span>}</span>
Cet article a été une brève introduction à l'utilisation du sélénium avec phpunit pour les tests d'acceptation. En général, vous pouvez utiliser le sélénium pour tout ce qui nécessite une automatisation du navigateur. Si vous avez des commentaires ou des questions, assurez-vous de les publier ci-dessous et je ferai de mon mieux pour y répondre.
Pour installer PHPUnit et Selenium WebDriver dans PHP, vous devez utiliser Composer, un outil de gestion de la dépendance pour PHP. Tout d'abord, installez le compositeur si vous ne l'avez pas déjà fait. Ensuite, exécutez la commande suivante dans votre terminal pour installer PHPUnit: Composer nécessite --Dev phpunit / phpunit ^ 9. Pour Selenium WebDriver, utilisez la commande: Composer nécessite --Dev php-webdriver / webdriver. Cela installera à la fois Phpunit et Selenium WebDriver dans votre projet PHP.
Pour exécuter un test de phpunit avec le sélénium, vous devez écrire un cas de test qui utilise Selenium WebDriver. Dans votre cas de test, vous pouvez utiliser des commandes WebDriver pour interagir avec le navigateur. Une fois que votre cas de test est prêt, vous pouvez l'exécuter à l'aide de l'outil de ligne de commande PhpUnit. Accédez simplement à votre répertoire de projet dans le terminal et exécutez la commande: phpunit mytest.php, où «mytest.php» est le nom de votre fichier de test.
Les affirmations sont utilisées dans le phpunit pour vérifier qu'une certaine condition est vraie. Ils sont essentiels pour déterminer si un test a réussi ou échoué. Dans un test PHPUNIT avec Selenium, vous pouvez utiliser des affirmations pour vérifier l'état des éléments Web. Par exemple, vous pouvez affirmer qu'un certain élément est présent, visible ou contient un texte spécifique. Pour ce faire, vous pouvez utiliser les méthodes d'affirmation fournies par PHPUnit, telles que les asserttequals, AssertTrue ou AssertContains.
PHPUnit avec Selenium se fait à l'aide des méthodes de session du webdriver. Lorsque vous créez une nouvelle instance du WebDriver, une nouvelle session de navigateur est démarrée. Vous pouvez interagir avec cette session en utilisant diverses méthodes, telles que Navigate (), Refresh () ou Close (). Pour mettre fin à la session, vous pouvez utiliser la méthode QUIT (), qui fermera toutes les fenêtres et terminera la session.
Gestion des demandes AJAX En phpunit avec sélénium, peut être délicat car vous devez attendre que l'appel Ajax se termine avant de pouvoir interagir avec les éléments mis à jour. Selenium WebDriver fournit la classe WebDriverWait à cet effet. Vous pouvez l'utiliser pour attendre qu'une certaine condition soit vraie avant de continuer. Par exemple, vous pouvez attendre qu'un élément soit visible ou cliquable.
Selenium WebDriver prend en charge plusieurs navigateurs, y compris Chrome, Firefox, Safari et Internet Explorer. Pour exécuter vos tests PHPUnit sur un navigateur différent, vous devez créer une nouvelle instance du webdriver pour ce navigateur. Par exemple, pour utiliser Firefox, vous créeriez une nouvelle instance Firefoxdriver. Ensuite, vous pouvez utiliser ce pilote pour exécuter vos tests.
Les trames et les iframes peuvent être gérés dans phpunit avec sélénium en utilisant le commutateur ( ) Méthode du webdriver. Cette méthode vous permet de basculer le contexte à un cadre ou à un iframe différent. Une fois que vous avez terminé en interaction avec les éléments à l'intérieur du cadre, vous pouvez revenir au contenu principal à l'aide de la méthode Switchto () -> defaultContent ().
La prise de captures d'écran avec du sélénium dans les tests de phpunit peut être effectuée en utilisant la méthode TakesCreenshot () du webdriver. Cette méthode prend une capture d'écran de la fenêtre actuelle et la renvoie sous forme de chaîne au format PNG. Vous pouvez ensuite enregistrer cette chaîne dans un fichier pour créer la capture d'écran.
Les cookies peuvent être manipulés en phpunit avec du sélénium en utilisant la méthode manage () -> getcookies () du webdriver. Cette méthode renvoie tous les cookies en tant que tableau. Vous pouvez également utiliser le manage () -> addcookie (), manage () -> DeleteCookie () et Manage () -> DeleTeAlLCooKies () pour manipuler des cookies.
Les tests de phpunit exécutés avec du sélénium en parallèle peuvent accélérer considérablement votre suite de tests. Cela peut être réalisé à l'aide d'une grille de sélénium, qui vous permet d'exécuter simultanément des tests sur plusieurs machines et navigateurs. Pour utiliser Selenium Grid, vous devez configurer un hub et des nœuds, puis configurer votre webdriver pour vous connecter au hub.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!