====== Testing amb PHP ====== Anem a explorar algunes tècniques de //testing// per a webs implementades en llenguatge [[PHP]]. Requisits: conèixer les bases de programació web i del llenguatge [[PHP]]. Referències: * [[https://getcomposer.org/download/|Composer]] : gestor de paquets PHP. * [[https://phpunit.readthedocs.io/es/latest/|PHPunit]] : utilitat per facilitar tests en PHP. * **Selenium** : suite d'eines per a automatitzar accions amb els navegadors web o //browsers//. * [[https://github.com/mozilla/geckodriver/releases|Geckodriver]] : //driver// de Selenium per a Firefox. * [[https://www.selenium.dev/selenium-ide/|Selenium IDE]] : aplicació per a l'enregistrament d'automatitzacions del //browser//. Disponible com a //plug-in// per a Firefox i Chrome. * [[https://github.com/php-webdriver/php-webdriver|Selenium PHP driver]] : llibreria per emprar Selenium des de PHP. * [[https://jakobbr.eu/2020/10/24/adventures-with-phpunit-geckodriver-and-selenium/|PHPunit+Selenium]] : article on s'explica com combinar les dues tecnologies exitosament (i no morir en l'intent). {{tag> #FpInfor #Daw #DawMp07 #DawMpProj #Ciber #CiberMp03 #Ceti #CetiMp03 test tests testing php }} \\ ===== Introducció ===== El testing és una part imprescindible del desenvolupament. Fins-i-tot hi ha metodologies de desenvolupament com la TDD (Test Driven Developmenet) en què primer es generen els tests que el software ha de passar en base a les especificacions i //user stories// establertes, i després es desenvolupa el software necessari. Sovint, la quantitat de codi generat per la part de //testing// pot arribar a superar a la quantitat de codi funcional. Això és natural, ja que si volem ser exhaustius amb les comprovacions, sovint cal comprovar una gran quantitat de possibles casos per assegurar que el //software// funciona com cal. Hi ha una ampla [[https://en.wikipedia.org/wiki/Software_testing|classificació de tests]] possibles per al //software// segons diversitat de criteris. En destaquem alguns conceptes (no son una classificació per sí, només alguns conceptes importants): * **Unit testing** : tests orientats a provar parts petites del codi, habitualment classes i funcions. * **Regression test** : tests orientats a comprovar que les funcionalitats desenvolupades fins el moment continuen funcionant correctament, sobretot quan s'afegeix noves funcionalitats o bé es corregeixen //bugs//. * **Tests funcionals** : test orientat a comprovar una funcionalitat de l'aplicació, normalment relacionat amb les //user stories// que en defineixen el comportament. * **Tests no-funcionals** : comproven altres variables no relacionades amb les //user stories// com l'arquitectura d'escalabilitat o la resposta a altes càrregues de trànsit. \\ ===== Exemples ===== ==== Botiga ==== Utilitza aquest repo i segueix les seves instruccions per a un primer apropament als tests: https://github.com/emieza/selenium-php Es tracta d'un codi molt senzill d'una botiga. \\ ==== Exercicis MySQL ==== En aquest exemple no hi ha el codi del què s'ha de fer, sinó que és una plantilla per a testejar els exercicis indicats a l'article [[PHP MySQL]] d'aquesta mateixa wiki. Per executar els tests llegiu el README del repo: https://github.com/AWS2/php-mysql-world-test-template Està pensat per ser utilitzat com a plantilla per a [[Github Classroom Autograde]]. \\ ===== XPath ===== Per accedir als elements del DOM HTML és habitual utilitzar [[XPath]]. Per exemple, al [[https://github.com/AWS2/php-mysql-world-test-template/blob/main/.tests/AddCityTest.php|AddCityTest.php]] trobem: $element = self::$driver->findElement(WebDriverBy::xpath( "//option[contains(text(),'$countryName')]")); $element->click(); Per mes info consulta l'article [[XPath]]. \\