Eseguire test unitari su VanillaJS
Tags: javascript, testing, beginners, italian
Published: 2023-03-07 23:00:17

Voglio iniziare dicendo che è chiaramente possibile utilizzare librerie specifiche per i test unitari in JavaScript come [MochaJs](https://mochajs.org/) o [Jest](https://jestjs.io/), ma per piccoli progetti e test-cases particolarmente basici, può essere una buona idea scrivere i propri test in modo da ridurre il numero di dipendenze e mantenere leggero il proprio progetto.



Di fatto un test unitario si basa sul verificare che l’output di una funzione eseguita con parametri noti, corrisponda ad un predeterminato valore.
Questo è facilmente verificabile con un controllo 
`if…else`.

## Passo Passo

1. Creare un file di test
    - Il file può essere contenuto nella cartella principale del progetto o in una cartella specifica che contenga i file di test nel caso ve ne fossero più di uno.
    - Per convenzione i file si chiameranno in modo che sia chiaro cosa stiano testando, come ad esempio: *index.test.js*, *home.test.js*, *utils.test.js* ecc ecc
    
2. Il file di test dovrà necessariamente avere accesso ai dati e funzioni da testare, per cui sarà necessario che le importi dai file di origine.
    *la sintassi utilizzata dipenderà da vari fattori come l'ambiente di sviluppo, o la sintassi utilizzata per esportare i singoli moduli*
    
    ```jsx
    const sayHello = require("../sayHello");
    	// OPPURE
    import { sayHello } from "../sayHello.js";
    ```
    
3. Una volta che si ha accesso ai dati e funzioni da testare, è possibile iniziare a scrivere i test.
    - I test si baseranno su dei semplici `if…else`, operatori ternari o `switch`
    - Si controllerà che il risultato delle funzioni sia quello che ci aspettiamo, in caso non dovesse essere così si dovrà lanciare una nuova eccezione corredata di un messaggio significativo che ci aiuti a capire in quale funzione sia stata scatenata, e magari perché, in modo da rendere rapido il debugging.
        
        ```jsx
        // supponendo di dover testare una funzione che sommi una serie di numeri ricevuti come argomenti restituendo il risultato
        
        if(addNumbers(10, 5, 7) !== 22) {
        	throw new Exception(`Il risultato di addNumbers(10,5,7) non è 22, ma ${addNumbers(10,5,7}!`)
        }
        ```
        
4. Una volta scritti i test per tutte le funzioni che ci interessi testare, si dovrà eseguire il file per verificarne il corretto funzionamento.
Lo si può fare in due modi:
    - manualmente, lanciando da terminale nella cartella che contiene il file di test, il comando `node <nome-file>.js`
    - Inserendo, nel *package.json* del progetto (se presente), nella sezione scripts, un nuovo script e lanciandolo da terminale con
    `npm run <nome-script>`

    ```json
    // package.json
    "": {...},
    "": {...},
    "scripts": {
    	"test": "node <nome-file-test>.js"
    },
    "": {...},
    ```
    
5. In caso il test fallisse, l’esecuzione verrebbe interrotta, stampando sul terminale lo stackTrace dell’errore ed il messaggio da noi inserito.

6. Sarebbe buona norma inserire dei log prima dell’esecuzione dei test, in modo da tenere traccia del progresso.
    
    ```jsx
    console.info("testing addNumbers(10, 5, 7), expected output: 22");
    if(addNumbers(10, 5, 7) !== 22) {
    	throw new Exception(`Il risultato di addNumbers(10,5,7) non è 22, ma ${addNumbers(10,5,7}!`)
    }
    ```
    
7. In caso si stessero testando delle funzionalità di un pacchetto che dovrà essere pubblicato su NPM, è possibile automatizzare i test perché vengano eseguiti prima della sua pubblicazione.

    ```json
     // package.json
     "": {...},
     "": {...},
     "scripts": {
    	 "test": "node <nome-file-test>.js",
         "prepublishOnly": "npm run test"
     },
     "": {...},
     ```

## Conclusioni

Ecco quindi come poter eseguire dei basici unit-tests in vanillaJS, come detto in apertura, questo modo di eseguire test può avere senso per progetti o librerie molto piccole e semplici, per progetti più complessi il beneficio di utilizzare librerie per test più complessi e meglio strutturati è sicuramente maggiore rispetto al risparmio in termini di spazio e dipendenze installate.

### Pareri

È il primo articolo che pubblico online, ed il principale motivo per cui l'ho pubblicato è per meglio fissare in testa alcuni concetti, in primis per me, e per questo anche è stato scritto in italiano.
Se hai idee, suggerimenti o hai trovato qualche errore fammelo sapere in un commento!
Alla prossima, se ci sarà!