Sono a favore di test casuali e li scrivo. Tuttavia, se sono appropriati in un particolare ambiente di costruzione e in quali suite di test dovrebbero essere inclusi è una domanda più sfumata.
Esegui localmente (ad es. Durante la notte sulla tua casella di sviluppo) i test randomizzati hanno riscontrato bug sia ovvi che oscuri. Gli oscuri sono abbastanza arcani che penso che i test casuali siano stati davvero i soli realistici per stanarli. Come test, ho preso un bug difficile da trovare scoperto tramite test randomizzati e ho avuto una mezza dozzina di sviluppatori di crack che hanno esaminato la funzione (circa una dozzina di righe di codice) in cui si è verificato. Nessuno è stato in grado di rilevarlo.
Molti dei tuoi argomenti contro i dati randomizzati sono esempi di "il test non è riproducibile". Tuttavia, un test randomizzato ben scritto catturerà il seme utilizzato per avviare il seme randomizzato e lo produrrà in caso di fallimento. Oltre a consentire di ripetere il test manualmente, ciò consente di creare banalmente un nuovo test che verifica il problema specifico codificando il seme per quel test. Ovviamente, probabilmente è meglio scrivere a mano un test esplicito che copre quel caso, ma la pigrizia ha le sue virtù, e questo ti consente persino di generare automaticamente nuovi casi di test da un seme fallito.
L'unico punto da sottolineare che non posso discutere, tuttavia, è che rompe i sistemi di compilazione. La maggior parte dei test di integrazione continua e build si aspettano che i test facciano sempre la stessa cosa. Quindi un test che fallisce casualmente creerà caos, fallendo casualmente e puntando le dita su cambiamenti che erano innocui.
Una soluzione quindi, è ancora eseguire i test randomizzati come parte dei test build e CI, ma eseguirlo con un seed fisso, per un numero fisso di iterazioni . Quindi il test fa sempre la stessa cosa, ma esplora ancora un sacco di spazio di input (se lo esegui per più iterazioni).
A livello locale, ad esempio, quando si cambia la classe interessata, si è liberi di eseguirla per più iterazioni o con altri semi. Se i test randomizzati diventeranno sempre più popolari, potresti persino immaginare una specifica suite di test che sono noti per essere casuali, che potrebbero essere eseguiti con semi diversi (quindi con una copertura crescente nel tempo) e dove i fallimenti non significherebbero la stessa cosa come sistemi di CI deterministici (ovvero, le esecuzioni non sono associate 1: 1 alle modifiche del codice e quindi non si punta un dito su una particolare modifica quando le cose falliscono).
C'è molto da dire per i test randomizzati, specialmente quelli ben scritti, quindi non essere troppo veloce per scartarli!