<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Francesco Luca Labianca</title>
    <description>The latest articles on DEV Community by Francesco Luca Labianca (@ieeah).</description>
    <link>https://dev.to/ieeah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F880478%2F02fa3392-8ace-4c13-a5f9-a6729147beb0.png</url>
      <title>DEV Community: Francesco Luca Labianca</title>
      <link>https://dev.to/ieeah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ieeah"/>
    <language>en</language>
    <item>
      <title>Eseguire test unitari su VanillaJS</title>
      <dc:creator>Francesco Luca Labianca</dc:creator>
      <pubDate>Tue, 07 Mar 2023 23:00:17 +0000</pubDate>
      <link>https://dev.to/ieeah/eseguire-test-unitari-su-vanillajs-453o</link>
      <guid>https://dev.to/ieeah/eseguire-test-unitari-su-vanillajs-453o</guid>
      <description>&lt;p&gt;Voglio iniziare dicendo che è chiaramente possibile utilizzare librerie specifiche per i test unitari in JavaScript come &lt;a href="https://mochajs.org/"&gt;MochaJs&lt;/a&gt; o &lt;a href="https://jestjs.io/"&gt;Jest&lt;/a&gt;, 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.&lt;/p&gt;

&lt;p&gt;Di fatto un test unitario si basa sul verificare che l’output di una funzione eseguita con parametri noti, corrisponda ad un predeterminato valore.&lt;br&gt;
Questo è facilmente verificabile con un controllo &lt;br&gt;
&lt;code&gt;if…else&lt;/code&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Passo Passo
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Creare un file di test&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;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.&lt;/li&gt;
&lt;li&gt;Per convenzione i file si chiameranno in modo che sia chiaro cosa stiano testando, come ad esempio: &lt;em&gt;index.test.js&lt;/em&gt;, &lt;em&gt;home.test.js&lt;/em&gt;, &lt;em&gt;utils.test.js&lt;/em&gt; ecc ecc&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;br&gt;
&lt;em&gt;la sintassi utilizzata dipenderà da vari fattori come l'ambiente di sviluppo, o la sintassi utilizzata per esportare i singoli moduli&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../sayHello&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// OPPURE&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;sayHello&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../sayHello.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Una volta che si ha accesso ai dati e funzioni da testare, è possibile iniziare a scrivere i test.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I test si baseranno su dei semplici &lt;code&gt;if…else&lt;/code&gt;, operatori ternari o &lt;code&gt;switch&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// supponendo di dover testare una funzione che sommi una serie di numeri ricevuti come argomenti restituendo il risultato&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;addNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Il risultato di addNumbers(10,5,7) non è 22, ma &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;addNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;Una volta scritti i test per tutte le funzioni che ci interessi testare, si dovrà eseguire il file per verificarne il corretto funzionamento.&lt;br&gt;
Lo si può fare in due modi:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;manualmente, lanciando da terminale nella cartella che contiene il file di test, il comando &lt;code&gt;node &amp;lt;nome-file&amp;gt;.js&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Inserendo, nel &lt;em&gt;package.json&lt;/em&gt; del progetto (se presente), nella sezione scripts, un nuovo script e lanciandolo da terminale con
&lt;code&gt;npm run &amp;lt;nome-script&amp;gt;&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node &amp;lt;nome-file-test&amp;gt;.js"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In caso il test fallisse, l’esecuzione verrebbe interrotta, stampando sul terminale lo stackTrace dell’errore ed il messaggio da noi inserito.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sarebbe buona norma inserire dei log prima dell’esecuzione dei test, in modo da tenere traccia del progresso.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;testing addNumbers(10, 5, 7), expected output: 22&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;addNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Exception&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Il risultato di addNumbers(10,5,7) non è 22, ma &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;addNumbers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;!`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;li&gt;

&lt;p&gt;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.&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;package.json&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"node &amp;lt;nome-file-test&amp;gt;.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
     &lt;/span&gt;&lt;span class="nl"&gt;"prepublishOnly"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"npm run test"&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
 &lt;/span&gt;&lt;span class="nl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusioni
&lt;/h2&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pareri
&lt;/h3&gt;

&lt;p&gt;È 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.&lt;br&gt;
Se hai idee, suggerimenti o hai trovato qualche errore fammelo sapere in un commento!&lt;br&gt;
Alla prossima, se ci sarà!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>testing</category>
      <category>beginners</category>
      <category>italian</category>
    </item>
  </channel>
</rss>
