Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. TDD
Code

Test-Driven Development con Laravel e Doctrine

Difficulty:AdvancedLength:MediumLanguages:

Italian (Italiano) translation by Luca Menozzi (you can also view the original English article)

Da sviluppatore PHP, puoi usare la tecnica del Test-Driven Development (TDD) per sviluppare il tuo software scrivendo test. Solitamente, il TDD divide ciascuna attività dello sviluppo in unità individuali. Un test è quindi scritto per assicurare che l'unità si comporti come previsto.

Ogni progetto che utilizza il Test-Driven Development segue ripetutamente tre semplici step:

  • scrivi un test per il prossimo pezzo di funzionalità che vuoi aggiungere.
  • scrivi il codice funzionale fino a quando il test lo supera.
  • fai il refactoring sia del nuovo che del vecchio codice per renderlo ben strutturato.

Continua a ciclare questi tre step, un test alla volta, realizzando la funzionalità del sistema. Testare ti aiuterà nel refactoring, azione che consente di migliorare il progetto col tempo e rende alcuni problemi di progettazione più evidenti.

I test che contengono piccoli componenti individuali sono chiamati unit test (test unitari). Sebbene gli unit test possano essere portati a termine indipendentemente, se testi alcuni componenti quando sono integrati in altri, stai facendo integration testing (test di integrazione). Il terzo tipo di testing è il test stubs. Il test stubs ti permette di testare il codice senza avere chiamate reali al database.

Perché TDD Funziona

Al giorno d'oggi, visto che puoi usare la sintassi dei moderni IDE PHP, il feedback non è un grosso problema. Uno degli aspetti importanti dello sviluppo è essere certi che il codice si comporti come previsto. Dato che il software è complesso (differenti componenti integrati gli uni agli altri), è facile che molte delle nostre aspettative vengano disattese. Specialmente alla fine del progetto, a causa dello sviluppo, il progetto diventa più complicato e quindi più difficile da debuggare e testare.

Il TDD verifica che il codice faccia quello che ci si aspetta. Se qualcosa va male, ci sono solo poche linee di codice da ricontrollare. Gli errori sono facili da trovare e da correggere. Nel TDD, il test si focalizza sul comportamento, non sull'implementazione. Il TDD produce codice che è stato progettato, testato e collaudato.

PHPUnit e Laravel

PHPUnit è lo standard di fatto per lo unit testing in PHP. È essenzialmente un framework per scrivere test e fornisce gli strumenti di cui hai bisogno per eseguire i test e analizzare i risultati. PHPUnit trae la sua struttura e funzionalità dall' SUnit di Kent Beck.

Esistono molte differenti asserzioni che possono aiutarti a testare i risultati di tutte le possibili chiamate nelle applicazioni. A volte occorre essere un po' più creativi per testare parti funzionali più complesse, ma le asserzioni fornite da PHPUnit coprono la maggior parte delle situazioni da testare. Ecco una lista delle più comuni che incontrerai e che userai nei test.

  • AssertTrue: controlla l'input per verificare che sia uguale a true.
  • AssertFalse: controlla l'input per verificare che sia uguale a false.
  • AssertEquals: controlla il risultato con un input per verificare se sono uguali.
  • AssertArrayHasKey: restituisce un errore se nell'array non c'è la chiave ricercata.
  • AssertGreaterThan: controlla il risultato per vedere se è più grande di un valore.
  • AssertContains: controlla che l'input contenga un determinato valore.
  • AssertType: controlla che una variabile sia di un certo tipo.
  • AssertNull: controlla che una variabile sia null.
  • AssertFileExists: verifica che un file esista.
  • AssertRegExp: controlla che l'input soddisfi un'espressione regolare.

Di default, PHPUnit 4.0 è già installato in Laravel e potrebbe essere necessario lanciare il seguente comando per aggiornarlo:

Il file phpunit.xml, nella directory root di Laravel, ti consente di effettuare alcune configurazioni. In questo caso, se vuoi sovrascrivere la configurazione di default, puoi editare il file.

Come puoi vedere dal codice sopra, ho aggiunto la configurazione del database di prova (non usato nell'articolo).

Cos'è l'ORM Doctrine?

Doctrine è un ORM che implementa il pattern data mapper e consente di creare una netta separazione tra la logica dell'applicazione e il persistence layer del database. Per usare Doctrine, esiste un'implementazione da utilizzare con una configurazione esistente di Laravel 5. Per installare Doctrine 2 nel tuo progetto Laravel, esegui il seguente comando:

Come di consueto, il package dovrebbe essere aggiunto alla lista dei service provider in app/config.php.

Devi configurare anche l'alias:

Infine, pubblichiamo la configurazione del package con:

Come Testare i Repository di Doctrine

Prima di qualsiasi altra cosa, dovresti approfondire le fixture. Le fixture sono usate per caricare in un database un limitato set di dati da testare. Fortunatamente, Doctrine 2 fornisce una libreria per aiutarti a scrivere le fixture per l'ORM Doctrine.

Per installare il bundle delle fixture nella tua App Laravel, abbiamo bisogno di eseguire il seguente comando:

Creiamo la nostra fixture in tests/Fixtures.php:

Come puoi osservare, la classe fixture deve implementare la FixtureInterface e deve avere il metodo load(ObjectManager $manager). Le fixture di Doctrine 2 sono classi PHP in cui puoi creare oggetti e renderli persistenti nel database. Per fare l'autoload delle nostre fixture, in Laravel, dobbiamo modificare il file composer.json nella root di Laravel.

Esegui quindi:

Creiamo il nostro file di test DoctrineTest.php nella directory tests.

Nel metodo setUp(), ho instanziato l'ORMExecutor e il Loader. Carichiamo anche la classe Fixtures che abbiamo appena implementato.

Non dimenticare che l'annotazione /** @test */ è molto importante, e senza di essa phpunit restituirebbe l'errore No tests found in class.

Per iniziare il test nella root del progetto, esegui semplicemente il comando:

Il risultato sarà:

Se devi condividere oggetti tra le fixture, puoi farlo aggiungendo semplicemente una referenza a quell'oggetto dandogli un nome e richiamandolo successivamente per formare una relazione. Ecco un esempio:

e la fixture Comment:

Con i due metodi getReference()setReference(), puoi condividere uno o più oggetti tra le fixture.

Se per te è importante ordinare le fixture, puoi farlo semplicemente con il metodo getOrder nelle tue fixture, come mostrato qui di seguito:

Presta attenzione al fatto che l'ordinamento è rilevante per la classe Loader.

Una delle cose più importanti delle fixture è la loro capacità di risolvere problemi di dipendenze. L'unica cosa che devi aggiungere è un metodo nella tua fixture, come ho fatto qui sotto:

Conclusioni

Questa è solo un accenno al Test-Driven Development con Laravel 5 e PHPUnit. Nel test dei repository, è inevitabile che si utilizzi il database. In questo caso, le fixture di Doctrine sono importanti.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.