# Test Driven Development
- Data articolo: 31/01/2020
Per contribuire alla diffusione di una pratica essenziale e fondamentale come è quella del Test Driven Development (TDD), prendo ad esempio il codice del pacchetto Marketing (luca-pezzino/marketing-admin), del mio ultimo progetto Luca Pezzino E-commerce. Il TDD, traduce l'esigenza del business in codice e guida passo a passo alla codifica della stessa, in maniera certificata e garantita per sempre (nei deploys, tutti i tests possono essere continuamente fatti girare automaticamente).
Come si deduce dal titolo stesso della classe, si tratta dei tests che hanno reso possibile l'implementazione dei saldi: qui limito l'analisi del codice al primo test, la creazione di un saldo (il codice è una porzione dell'originale, non riporto ad esempio i tests per la validazione dei dati passati all'endPoint).
class CRUDSaleTest extends TestCase
{
/**
* it can create a sale
*
* @test
*/
public function it_can_create_a_sale()
{
//Given
$sale = factory(Sale::class)->make()->toArray();
$this->setUrl('/sales')
->setHttpMethod('POST')
->setPayload($this->getSalesRelationshipsData() + $sale);
$this->assertDatabaseMissing('sales', $sale);
$this->callEndPoint()->assertUnauthenticated();
$authorizedUser = $this->createAuthorizedUser('I cannot create sales');
$this->callEndPoint()->assertUnauthorized();
$this->setPermissionTo('create sales', $authorizedUser);
//When
$this->callEndPoint();
//Then
$this->response->assertCreated();
$this->assertDatabaseHas('sales', $sale);
}
/**
* it can lists all the sales
*
* @test
*/
public function it_can_lists_all_the_sales()
{
}
/**
* it can show a sale
*
* @test
*/
public function it_can_show_a_sale()
{
}
/**
* it can update a sale
*
* @test
*/
public function it_can_update_a_sale()
{
}
/**
* it can delete a sale
*
* @test
*/
public function it_can_delete_a_sale()
{
}
}
Il nome della Classe e dei suoi metodi, fungono anche da documentazione per il progetto, utilissima per eventuali nuovi programmatori che subentrano in aggiunta/sostituzione al team. Probabilmente persino chi non è programmatore, comprende le funzionalità che si intendono implementare in questo package.
TIP
Per il progetto, ho sfruttato gli HTTP Tests per l'implementazione dell'API e i Console Tests per l'implementazione dei comandi da far girare nella shell.
I più attenti avranno notato che nel mio codice sono stati aggiunti metodi: nessuno ci impedisce di ridisegnare l'API di Testing di Laravel, per adattarla meglio alle nostre esigenze. Per il progetto Luca Pezzino E-commerce ho sviluppato un package per i tests (luca-pezzino/admin-test) che una volta importato, mi agevola nella stesura degli stessi.
Nelle poche righe del codice, oltre ad assicurarmi che si possa creare un saldo, proteggo l'endPoint da chi non è autenticato e da chi è autenticato ma non ha sufficenti autorizzationi. Il codice è un esempio di Feature Test (o Integration Test) e testa varie parti dell'applicazione: qui sono stati coinvolti Routers, Controllers, Models e database.
La struttura del test Given/When/Then (preparazione e pre-condizioni/lancio del comando/verifica del risultato) è anche nota come Arrange/Act/Assert.
# Conclusione
In questo breve blog, auspico di essere riuscito a rendere più evidente la necessità di non poter sviluppare senza TDD. I vantaggi sono troppo importanti per essere trascurati:
- documentazione per nuovi sviluppatori
- certificazione che il codice sia eseguito correttamente e quindi
- permettere refactoring in sicurezza
- permettere upgrade del framework
- garantire che aggiunte o modifiche al progetto, non vadano ad invalidare features anche non strettamente connesse
I vantaggi sono innegabili: chi si ostina a non usare il TDD, si assicura prima o poi, problemi più o meno gravi con i propri clienti.