Testare le applicazioni web con CodeCeption!

Testare le applicazioni web con CodeCeption!

Testare le applicazioni web con CodeCeption! COS'È CodeCeption è un elegante tool per eseguire test automatizzati di applicazioni web. È scritto interamente in PHP, è auto-contenuto e non necessita di essere relazionato in alcun modo con l'applicazione che deve testare. Questo significa che, a condizione di avere un'installazione di PHP sulla propria macchina, sarà possibile testare con CodeCeption applicazioni scritte in qualsiasi linguaggio! Unica condizione è che siano accessibili tramite url. QUICK SETUP L'installazione di CodeCept è velocissima e si può fare tramite composer oppure tramite PHAR. Personalmente prediligo sempre composer come gestore di pacchetti quando si tratta di PHP e quindi ecco come essere pronti al test in soli due passaggi composer require codeception/codeception codecept bootstrap Questi due comandi vi creeranno una directory tests ed un file codeception.yml di configurazione PRIMO TEST Il command line codecept mette a disposizione anche funzioni per la generazione automatica dei test. codecept generate:cept acceptance Homepage Questo comando genererà un file di test nominato HomepageCept.php, catalogandolo nella directory acceptance (vedremo dopo le varie tipologie di test). A questo punto è possibile scrivere il primo test <?php $I = new AcceptanceTester($scenario); $I->wantTo('Check homepage'); $I->amOnPage('/'); $I->see('Welcome'); L'esempio controlla che l'utente sia sulla pagina ”/” e che sia presente la scritta Welcome. Qui si può notare l'approccio centrato sull'utente di CodeCeption: la lettura del codice PHP è di fatto la trascrizione delle specifiche del test in lingua inglese. Per completare l'esecuzione è necessario dichiarare lo strumento di test e il relativo url all'interno del file di configurazione acceptance.suite.yml class_name: AcceptanceTester modules: enabled: - PhpBrowser: url: http://localhost/MyTest/home/ - \Helper\Acceptance ed infine eseguire il test codecept run ACCEPTANCE TEST CodeCept è in grado di effettuare test di tre tipi: Acceptance, Functional e Unit. Gli Acceptance Test sono i più interessanti quando si parla di applicazioni web perchè testano l'interazione dell'utente con la pagina. La più grande problematica, nell'eseguire un test automatico che debba verificare il corretto funzionamento di una pagina di fronte ad un utente, è come replicare la stessa situazione del caso reale. Per fare questo CodeCept si basa su due differenti soluzioni: PHP Browser: È una classe Php contenuta all'interno di CodeCept che è in grado di simulare un browser dietro le quinte. È la soluzione più leggera, veloce e senza dipendenze, ma presenta dei limiti legati principalmente alla non staticità delle pagine web moderne. Selenium WebDriver: Tramite Selenium WebDriver, CodeCept sarà in grado di eseguire i test direttamente all'interno del browser (o PhantomJS) e quindi di replicare a pieno qualsiasi interazione o operazione dell'utente, incluse quelle che coinvolgono il Javascript. PHP Browser Immaginiamo di voler testare la funzionalità di login, includendo quindi il riempimento dei campi username e password, la pressione del bottone login ed il relativo redirect sulla pagina di benvenuto. <?php $I = new AcceptanceTester($scenario); $I->wantTo('Test login'); $I->amOnPage('/login'); $I->fillField('username', 'm.rossi'); $I->fillField('password', 'test'); $I->click('LOGIN'); $I->see('Welcome, Mario Rossi!'); Supponendo di aver configurato il file acceptance.suite.yml come nell'esempio precedente, questo codice creerà un nuovo PhpBrowser che internamente eseguirà la pagina usando come root http://localhost/MyTest/home/. Il metodo amOnPage porterà il browser sulla pagina di login, mentre i metodi fillField riempiranno i campi username e password. Infine il metodo click effettuerà il click sul bottone di login. Il test sarà considerato valido se la pagina risultante conterrà il testo Welcome, Mario Rossi!. PhpBrowser permette di indicare gli elementi tramite il loro name, una query CSS oppure tramite XPath. Inoltre espone una serie di altri metodi per compilare e sottomettere le form, effettuare asserzioni a livello di elemento, condizionali e/o non bloccanti, aggiungere commenti, utilizzare cookie, headers, eccetera. Il suo limite più grande resta però il vincolo alla staticità di una pagina web: non è infatti in grado di seguire le operazioni fatte tramite Javascript, lavorare su finestre di popup oppure gestire elementi e field che non siano correttamente contenuti all'interno di una form. Per risolvere questo problema CodeCept mette a disposizione l'integrazione con Selenium WebDriver. Selenium WebDriver Selenium WebDriver permette di eseguire i test scritti in CodeCeption all'interno di un browser reale (o PhantomJS). Abilitarlo è semplicissimo, bastano un paio di sostituzioni all'interno del file acceptance.suite.yml class_name: AcceptanceTester modules: enabled: - WebDriver: url: http://localhost/MyTest/home/ browser: firefox - \Helper\Acceptance Et voilà! I vostri test ora saranno eseguiti all'interno di Firefox senza dover apportare alcuna modifica! Ovviamente questo crea una dipendenza e sarà necessario avere installato localmente Selenium Server. Ora operazioni ed eventi Javascript saranno intercettabili e metodi ad hoc saranno utilizzabili per i test. Ad esempio $I->waitForElement('#save', 30); $I->click('#save'); Attenderà per un massimo di 30 secondi l'apparizione nella pagina del bottone ”Save” e successivamente lo cliccherà. FUNCTIONAL TEST I test funzionali non sono molto differenti dai test di acceptance, se non per il fatto che non necessitano di un browser per essere eseguiti. Essi infatti preconfezionano una richiesta HTTP, impostando le variabili GET, _POST, ..., e testano il contenuto della risposta, indipendentemente da ciò che ne farà poi il browser. Le metodologie di scrittura dei test restano quindi molto simili, ma la differenza è data da ciò che si vuole mettere alla prova. Questa differenza è molto evidente nelle single page application, dove tra client e server viaggiano solamente dati, solitamente in formato JSON o XML. In questo caso gli acceptance test si occuperanno di verificare che la pagina si comporti correttamente, le popup si aprano e l'utente sia in grado di premere un certo bottone, mentre i functional test di verificare che i dati ricevuti dal server siano quelli attesi. Se l'applicazione che si sta testando è scritta tramite un framework PHP, allora è probabile che CodeCeption abbia un modulo ad esso dedicato, in grado di velocizzare la scrittura dei test per tale ambiente. Ecco un esempio per Symfony e Doctrine class_name: FunctionalTester modules: enabled: - Symfony - Doctrine2: depends: Symfony # connect to Symfony - \Helper\Functional UNIT TEST Mentre i functional test hanno lo scopo di testare il ”backstage” di una possibile operazione fatta da un utente, andando a verificare che una certa chiamata al server sia corretta end-to-end, gli unit test vanno più nel dettaglio, testando la singola classe di codice o funzionalità. Ad esempio potremmo voler testare che creando un utente con indirizzo email mario.rossi/abc.com questo non venga validato. CodeCeption supporta a pieno PhpUnit e permette di importare unit test scritti con esso nel progetto. Di conseguenza uno unit test non sarà altro che un esempio di test in PhpUnit <?php class UserTest extends \Codeception\Test\Unit { public function testValidation() { $user = User::create(); $user->username = null; $this->assertFalse($user->validate(['username'])); $user->username = 'toolooooongnaaaaaaameeee'; $this->assertFalse($user->validate(['username'])); $user->username = 'davert'; $this->assertTrue($user->validate(['username'])); } } Infine CodeCeption introduce il supporto a Specify, un progetto che permette di applicare il concetto di BDD agli unit test. $this->specify(”username is too long, function() { $this->user->username = 'toolooooongnaaaaaaameeee'; $this->assertFalse($this->user->validate(['username'])); }); Questo garantisce uniformità con le altre tipologie di test e soprattutto scalabilità e manutenibilità dei test nel futuro. CODECEPTION IN BREVE Lightweight tool completamente in PHP per la realizzazione di test In grado di testare applicazioni web scritte con qualsiasi tecnologia Tre tipologie di test: Acceptance, Functional, Unit Supporta Selenium WebDriver per testare nei browser reali Supporta l'approccio BDD Offre moduli per tutti i principali framework PHP Offre estensioni per alcuni framework di front-end, come AngularJS Ottimale per testare API REST e SOAP Autocontenuto LINKS http://codeception.com/ http://www.seleniumhq.org/projects/webdriver/ https://github.com/Codeception/Specify https://phpunit.de/

Realizziamo qualcosa di straordinario insieme!

Siamo consulenti prima che partner, scrivici per sapere quale soluzione si adatta meglio alle tue esigenze. Potremo trovare insieme la soluzione migliore per dare vita ai tuoi progetti.