Ci sono molte ragioni. Eric Lippert ha dichiarato più volte che la ragione per cui feature X
non è in C # è perché non è nel loro budget. I progettisti di linguaggi non hanno una quantità infinita di tempo e denaro per implementare le cose, e ogni nuova funzione ha i costi di manutenzione associati. Mantenere la lingua il più piccola possibile non è solo più semplice per i progettisti di linguaggi, ma è anche più facile per chiunque sia in grado di scrivere implementazioni e strumenti alternativi (es. IDE) Inoltre, quando qualcosa viene implementato in termini di linguaggio piuttosto che in parte, si ottiene portabilità gratuita. Se il testing delle unità viene implementato come una libreria, è sufficiente scriverlo una sola volta e funzionerà in qualsiasi implementazione conforme della lingua.
Vale la pena notare che D ha un supporto a livello di sintassi per i test delle unità . Non so perché hanno deciso di lanciarlo, ma vale la pena notare che D è pensato per essere un "linguaggio di programmazione di sistemi di alto livello". I progettisti volevano che fosse praticabile per il tipo di codice a basso livello non sicuro utilizzato tradizionalmente da C ++, e un errore nel codice non sicuro è incredibilmente costoso - comportamento indefinito. Quindi suppongo che avesse senso per loro fare uno sforzo extra su tutto ciò che ti aiuta a verificare che funzioni un codice non sicuro. Ad esempio, è possibile applicare il fatto che solo determinati moduli affidabili possono eseguire operazioni non sicure come accessi di array non selezionati o aritmetica del puntatore.
Lo sviluppo rapido era anche una priorità per loro, tanto che hanno fatto un obiettivo di progettazione che il codice D compili abbastanza velocemente da renderlo utilizzabile come linguaggio di scripting. L'unità di cottura esegue il test direttamente nella lingua in modo da poter eseguire i test semplicemente passando un flag in più al compilatore. "
Tuttavia, ritengo che una libreria di test delle unità grandi faccia molto di più che trovare solo alcuni metodi ed eseguirli. Prendi ad esempio il QuickCheck di Haskell, che ti permette di testare cose come "per tutti xey, f (x, y) == f (y, x)
". QuickCheck è meglio descritto come unit test generatore e ti permette di testare cose ad un livello più alto di "per questo input, mi aspetto questo output". QuickCheck e Linq non sono poi così diversi: sono entrambi linguaggi specifici del dominio. Quindi, piuttosto che imbullonare il supporto di test unitari in una lingua, perché non aggiungere le funzionalità necessarie per rendere i DSL pratici? Come risultato, non si verificheranno solo test delle unità, ma una lingua migliore.