Volevo chiederti delle persone, in quali casi ha senso testare un codice funzionale tipizzato in modo unitario, come scritto in haskell, scala, ocaml, nemerle, f # o haXe (l'ultimo è quello a cui sono veramente interessato, ma Volevo sfruttare la conoscenza delle comunità più grandi).
Chiedo questo perché dalla mia comprensione:
-
Un aspetto dei test unitari è quello di avere le specifiche in forma eseguibile. Tuttavia quando si utilizza uno stile dichiarativo, che mappa direttamente le specifiche formalizzate alla semantica del linguaggio, è addirittura possibile per esprimere le specifiche in forma eseguibile in un modo separato, che aggiunge valore?
-
L'aspetto più ovvio dei test unitari è quello di rintracciare gli errori che non possono essere rivelati attraverso l'analisi statica. Dato che il tipo di codice funzionale sicuro è un buon strumento per codificare estremamente vicino a ciò che il tuo analizzatore statico comprende, sembrerebbe che tu possa spostare molta sicurezza verso l'analisi statica. Tuttavia un errore semplice come l'utilizzo di
x
invece diy
(essendo entrambe le coordinate) nel tuo codice non può essere coperto. OTOH un tale errore potrebbe sorgere anche durante la scrittura del codice di test, quindi non sono sicuro che valga la pena. -
I test unitari introducono la ridondanza, il che significa che quando i requisiti cambiano, il codice che li implementa ei test che coprono questo codice devono essere entrambi modificati. Questo overhead ovviamente è costante, quindi si potrebbe obiettare che non ha molta importanza. Infatti, in linguaggi come Ruby non è paragonato ai benefici, ma dato che la programmazione funzionale tipizzata in modo statico copre molti dei test per le unità di terra, è come se si trattasse di un overhead costante che si può semplicemente ridurre senza penalità.
Da questo deduco che i test unitari sono in qualche modo obsoleti in questo stile di programmazione. Ovviamente una tale affermazione non può che portare a guerre di religione, quindi lasciatemi riassumere una semplice domanda:
Quando usi un tale stile di programmazione, a quali estensioni usi i test unitari e perché (qual è la qualità che speri di ottenere per il tuo codice)? O viceversa: hai dei criteri in base ai quali puoi qualificare un'unità di codice funzionale tipizzato staticamente come coperto dall'analizzatore statico e quindi senza necessità di copertura del test unitario?