Sradicare Non-Determinism nelle prove

Source: http://martinfowler.com/articles/nonDeterminism.html

Sradicare Non-Determinism nelle prove

Una regressione automatizzata suite possono svolgere un ruolo fondamentale in un progetto software, utile sia per ridurre i difetti di produzione e design essenziale per evolutiva. Parlando con i team di sviluppo ho spesso sentito parlare del problema della non-deterministico prove – prove che a volte, passano, talvolta con esito. Incontrollati e non deterministico prove può distruggere completamente il valore di una regressione automatizzata suite. In questo articolo cercherò di spiegarvi come affrontare prove non deterministico. Inizialmente la quarantena consente di ridurre i danni ad altre prove, ma si devono ancora risolvere presto. Quindi I trattamenti per discutere le cause più comuni per i non-determinismo: mancanza di isolamento, comportamento asincrono, servizi remoti, di tempo e di risorse delle perdite.

14 Aprile 2011.

Martin Fowler

Trovare gli articoli simili a questo guardando queste tags: delivery · testing

Contenuto

Mi è piaciuto guardare ThoughtWorks affrontare molte difficoltà le applicazioni aziendali, portando con successo le consegne di molti clienti che si sono visti raramente successo. La nostra esperienza è stata una grande dimostrazione che metodologia agile, profondamente controversa sopportava quando abbiamo scritto il manifesto una decina di anni fa, può essere usato con successo.

Ci sono molte versioni di sviluppo agile, ma in ciò che facciamo c’è un ruolo centrale per test automatizzati. Test automatico è stato un approccio di Extreme Programming fin dall’inizio, e che la filosofia è stata la più grande ispirazione alla nostra agile lavoro. Abbiamo acquisito una notevole esperienza in usando test automatizzati come una parte fondamentale dello sviluppo del software.

Test automatizzati possono essere presentati in un libro di testo. E in effetti le idee di base sono molto semplici. Ma la pressione-cottura di una consegna progetto, prove che non sono spesso prestato molta attenzione nei testi. Come so fin troppo bene, gli autori hanno l’abitudine di scrematura per molti dettagli al fine di ottenere un punto centrale. Nei miei colloqui con il nostro team, un problema ricorrente che abbiamo è che le prove sono diventate inaffidabili, inaffidabili che le persone non prestano molta attenzione al superamento o meno. UNA delle cause primarie di questa inaffidabilità è che alcuni test non deterministica.

UNA prova è non-deterministico quando si passa a volte e non riesce a volte, senza alcuna modifica del codice, test, o l’ambiente. Tali prove, poi si ri-esecuzione e passano. Errori nei Test di questi test sono apparentemente casuali.

Non-determinismo colpiscono ogni genere di prove, ma è particolarmente inclini a influenzare le prove con un ampio campo di applicazione, quali ad esempio l’accettazione o funzionali.

Perché non deterministico prove sono un problema

Non deterministico prove sono due problemi, in primo luogo, esse sono inutili, in secondo luogo, essi sono una virulenta infezione che può rovinare completamente l’intera suite di test. Di conseguenza devono essere trattate con il più presto possibile, prima di effettuare il vostro intero schieramento pipeline è compromessa.

Comincerò con l’espansione della loro inutilità. Il vantaggio principale di test automatici è che essi forniscono bug meccanismo di rilevamento agendo come test di regressione [ 1]. Quando un test di regressione va in rosso, sai che hai un problema immediato, spesso a causa di bug si è entrati nel sistema senza che voi possiate realizzare.

Avente un bug detector ha enormi vantaggi. La maggior parte ovviamente significa che è possibile trovare e correggere gli errori solo dopo che sono stati introdotti. Non solo non per il caldo sfocatura perché si uccide bug rapidamente, inoltre, è stato più facile per rimuovere questi ultimi, in quanto sapete il bug in con l’ultima serie di modifiche che sono fresche nella tua mente. Di conseguenza sapere dove cercare il bug, che è più della metà della battaglia di schiacciamento.

Il secondo vantaggio è che, come è possibile ottenere la fiducia nel vostro bug detector, è possibile ottenere il coraggio di fare grandi cambiamenti consapevoli che quando è buono, il bug detector si spegne e si può risolvere l’errore. [2] Senza questo team hanno paura di apportare le modifiche richieste dal codice al fine di essere mantenuti puliti, il che porta ad un marciume della base del codice e il brusco calo velocità di sviluppo.

Il problema di non-deterministico test è che quando si rosso, non avete idea se la sua a causa di un bug, o anche solo una parte dei non-comportamento deterministico. Solitamente a queste prove non deterministico non è relativamente comune, e così si finisce ostinarsi sulle spalle quando questi test andare rosso. Una volta si ignora una regressione, quindi che è inutile e potrebbe anche buttarla via.[3]

In effetti lei avrebbe dovuto lanciare una prova non deterministica, poiché se non si ha una qualità infettive. Se si dispone di una suite di 100 prove di 10 non-deterministico prove in loro, di quella suite spesso non. Inizialmente si esaminerà il rapporto di errore e avviso che i guasti sono in prove non deterministico, ma presto perderanno la disciplina. Una volta che la disciplina sia perso, poi un guasto nella sana deterministico prove verrà ignorato. A questo punto hai perso tutta la partita e potrebbe liberarsi di tutte le prove.

Quarantena

Il mio obiettivo principale di questo articolo è quello di delineare comuni casi di non-deterministico prove e come eliminare il non-determinismo. Ma prima di entrare vi offro un pezzo di consigli essenziali: la quarantena non deterministico. Se si hanno prove non deterministico tenerli in una diversa suite di test alla vostra salute. Se vorrai potrai continuare a prestare attenzione a quanto sta succedendo con la sana test e ottenere un buon feedback da loro.

La prova non deterministico in quarantena. (Prove in quarantena ma fissano rapidamente.)

Quindi la questione è cosa fare con la suite di test in quarantena. Sono inutili come i test di regressione, ma hanno un futuro come gli elementi di lavoro per la pulizia. Si consiglia di non abbandonare tali prove, dato che le prove si sono in quarantena sono non vi aiuta con la regressione.

Il pericolo è che le prove non vengono gettati in quarantena e dimenticati, che significa che il sistema di rilevamento dei bug sta erodendo. Di conseguenza vale la pena di avere un meccanismo che assicura che le prove non andate in quarantena troppo a lungo. Ho incontrato vari modi per farlo. Uno è un semplice limite numerico: ad esempio per consentire solo 8 prove in quarantena. Una volta raggiunto il limite che si deve passare un po’ di tempo per cancellare tutte le prove. Questo ha il vantaggio di dosaggio della prova di pulizia se questa è come fare le cose. Un’altra strada è quella di porre un limite massimo di tempo per la prova può essere in quarantena, come non più di una settimana.

L’approccio generale di quarantena è di prendere il test in quarantena di distribuzione principali condotte in modo che potete avere un normale processo di creazione. Tuttavia un buon team può essere più aggressivo. Il nostro team Mingle mette la sua quarantena suite nella distribuzione pipeline uno stadio dopo la sua sana prove. Che modo si può ottenere il feedback del sano prove, ma è anche costretto a garantire che essa ordina la messa in quarantena i test rapidamente. [4]

Mancanza di isolamento

Al fine di ottenere le prove da eseguire in modo affidabile, è necessario avere chiaro controllo sull’ambiente in cui vengono eseguiti, in modo da disporre di una ben nota all’inizio del test. Se un test crea alcuni dati nel database e lascia in giro, si può danneggiare l’esecuzione di un’altra prova che può contare su un database diverso.

Trovo quindi molto importante mantenere prove isolato. Isolata test possono essere eseguiti in qualsiasi sequenza. Come si arriva al più grande campo di azione di prove funzionali, diventa sempre più difficile mantenere prove isolato. Quando si traccia una non-determinismo, la mancanza di isolamento è una causa comune e frustrante.

Mantenere le tue prove isolate le une dalle altre, in modo che l’esecuzione di una prova non influisce sugli altri.

Ci sono un paio di modi per ottenere l’isolamento – sia sempre ricostruire la situazione di partenza da zero, o che ogni prova pulisce correttamente dopo. In generale preferisco i primi, spesso è più facile – e in particolare di trovare più facilmente il problema. Se un test fallisce perché non costruire lo stato iniziale, quindi è facile capire che test contiene il bug. Con clean-up, tuttavia, una prova conterrà il bug, ma un’altra prova – così è difficile trovare il vero problema.

A partire da un bianco è di solito facile con prove di unità, ma possono essere più difficili con prove funzionali [5] , soprattutto se si dispone di una grande quantità di dati in un database che ha bisogno di essere presenti. La ricostruzione del database ogni volta può aggiungere un sacco di tempo per prove, in modo che sostiene di clean-up strategia.[6]

Un trucco che è utile quando si utilizzano i database, è di condurre i test all’interno di una transazione, e quindi per eseguire il rollback della transazione al termine della prova. Questo modo il gestore delle transazioni pulisce, riducendo la possibilità di errori [ 7].

Un altro approccio è quello di fare un’unica costruzione di un apparecchio immutabile a partire prima di eseguire un gruppo di prove. Quindi, assicurarsi che le prove non cambiano che lo stato iniziale (o se lo fanno annullare le modifiche a strappo).  Tale tattica è più soggetta a errori di ricostruzione l’apparecchio per ogni prova, ma può essere utile se dura troppo a lungo per costruire l’apparecchio ogni volta.

Sebbene i database sono una causa comune di problemi di isolamento, ci sono un sacco di volte in cui è possibile ottenere questi in memoria . In particolare con i dati statici e singleton. Un buon esempio di questo tipo di problema è contesto, come ad esempio l’utente attualmente connesso.

Se si dispone di una esplicita ripresa in una prova, fai attenzione alle eccezioni che si verificano durante la ripresa. In questo caso la prova si può passare, ma causa l’isolamento degli errori delle prove successive. In modo da garantire che, se hai un problema in una ripresa, fa un rumore forte.

Alcuni preferiscono mettere meno enfasi sull’isolamento e maggiormente sulla definizione chiara delle dipendenze per forza test da eseguire in un determinato ordine. PREFERISCO l’isolamento perché consente una maggiore flessibilità nella gestione sottoinsiemi di prove e di parallelizzazione prove.

Comportamento Asincrono

Asincronia è un vantaggio che consente di mantenere il software che risponde in compiti a lungo termine. Le chiamate Ajax consentono un browser di rispondere mentre tornando al server per ulteriori dati, messaggi asincroni permettono un processo server di comunicare con altri sistemi senza essere legati alle loro tempestivo latenza.

Ma in fase di test, di asincronia può essere maledizione. L’errore comune è di gettare un sonno:

//Pseudo-codice

Makeasynccall;

Sleep(tanto);

Chiamo readResponse;

 

Si possono fare due modi. Prima di tutto è necessario impostare il tempo di spegnimento per abbastanza a lungo che si dà un sacco di tempo per ottenere risposta. Ma ciò significa che potrai spendere un sacco di tempo folle in attesa del responso, rallentando così le tue prove. La seconda possibilità è che, a prescindere dal tempo di andare a dormire, a volte, non è sufficiente. Ci sarà qualche cambiamento nell’ambiente che vi farà superare il sonno – e avrai falso messaggio di errore. Di conseguenza vi consiglio vivamente di non usare mai nuda dorme come questo.

Non utilizzare bare capacita di attendere asynchonous risposte: utilizzare un callback o polling.

Vi sono fondamentalmente due tattiche che si può fare per il collaudo di un risposta asincrona. La prima è che la asincrono di callback che si può chiamare. Questa è la migliore in quanto non sarà più necessario attendere più a lungo di quanto è necessario [8]. Il problema più grande di questo è che l’ambiente deve essere in grado di farlo e quindi il provider di servizi deve essere in grado di farlo. Questo è uno dei vantaggi di avere il team di sviluppo integrato con test – se possono fornire un richiamata quindi.

La seconda opzione è quella di interrogare sulla risposta. Si tratta di qualcosa di più di solo una volta, ma che cercano regolarmente, qualcosa come questo

//Pseudo-codice

Makeasynccall

STARTTIME = Tempo . ora;

Mentre(!  Responsereceived) {

Se (ora.- startTime > waitLimit)

Throw new TestTimeoutException;

Sonno (pollingInterval);

}

Chiamo readResponse

 

Il punto di questo approccio è che è possibile impostare il pollingInterval ad un grazioso piccolo valore, e questa è la massima quantità di tempo morto si perderanno per l’attesa di una risposta. Questo significa che è possibile impostare il waitLimit molto elevata, il che riduce al minimo la possibilità di colpire, a meno che qualcosa non ha funzionato. [9]

Assicuratevi di utilizzare una classe eccezione che indica che questa è una prova che il timeout non. Ciò contribuirà a rendere chiaramente di che cosa è andato storto in tal caso , e forse più sofisticati permettono una prova al fine di tener conto delle informazioni sul display.

I valori di tempo, in particolare il waitLimit, non dovrà mai essere i valori letterali. Assicurarsi che siano sempre i valori che possono essere facilmente impostato in massa, sia utilizzando le costanti o impostato tramite l’ambiente di runtime. Così se avete bisogno di modificare (e) è possibile mettere tutti rapidamente.

Tutti questi consigli sono utili per chiamate asincrone dove si attende una risposta da parte del fornitore, ma come su quelli dove non c’è risposta. Queste sono chiamate in cui invochiamo un comando su qualcosa e ci aspettiamo che ciò avvenga senza alcun riscontro. Questa è la causa, in quanto è possibile eseguire il test per la risposta, ma non c’è niente da fare per rilevare un errore di distribuzione. Se il fornitore non è qualcosa che si sta creando è possibile gestire questo garantendo il provider implementa alcuni modo di indicare che è fatto – essenzialmente una qualche forma di callback. Anche se solo la verifica del codice utilizza, ne vale la pena, anche se spesso è possibile trovare questo tipo di funzionalità è utile per altri scopi troppo[ 10]. Se il provider è qualcun’altro lavoro, è possibile provare la persuasione, ma per il resto può essere bloccato. Sebbene questo sia anche un caso di uso Test Doubles per i servizi remoti è utile (di cui tratterò più nella prossima sezione).

Se si dispone di un problema generale in qualcosa asincrono, in modo tale che non risponde, sempre in attesa di timeout e la suite di test avrà un lungo periodo di tempo. Per combattere questa è una buona idea utilizzare un test del fumo per verificare che il servizio asincrono risponde a tutti e non l’esecuzione della prova subito se non lo è.

Gerard Meszaros , Xunit configurazioni di prova, Contiene un sacco di buoni motivi per costruire prove.

È anche possibile spesso la asincronia completamente. Gerard Meszaros si afferma Humble Object pattern che ogni volta che avete una certa logica che si trova in un duro-a-ambiente di test, è necessario isolare la logica è necessario testare da tale ambiente. In questo caso significa mettere la maggior parte della logica è necessario verificare in un luogo dove è possibile verificare in modo sincrono. Il comportamento asincrono deve essere minimo (umile) come possibile, in modo che non hanno bisogno di prove.

Servizi remoti

A volte mi viene chiesto se ThoughtWorks non qualsiasi lavoro di integrazione, cosa che trovo alquanto divertente dato che non c’è alcun progetto che non comporta un bel po’ di integrazione. Per loro natura, le applicazioni aziendali comportano un notevole di combinare i dati provenienti da sistemi diversi. Questi sistemi sono gestiti da altre squadre per i propri programmi, i team che utilizzano spesso diversi software per la nostra filosofia fortemente basato su test approccio agile.

Test con tali sistemi remoti comporta una serie di problemi, e non determinismo è alto sulla lista. Spesso i sistemi remoti non hanno sistema di prova si può chiamare, il che significa che colpisce un sistema live. Se c’è un sistema di test, potrebbe non essere abbastanza stabile per fornire risposte deterministiche.

In questa situazione, è di fondamentale importanza per garantire determinismo, quindi è il momento di raggiungere per un Test Double – un componente che è simile al servizio remoto, ma è solo una finta versione che imita il comportamento del sistema remoto. Il doppio deve essere impostato in modo che fornisce il giusto tipo di risposta nell’interazione con il nostro sistema, ma in un modo siamo in grado di controllare. In questo modo possiamo garantire determinismo.

Utilizzando un doppio ha un lato negativo, in particolare quando ci sono le prove su di un ampio campo di applicazione. Come possiamo essere sicuri che il doppio si comporta nello stesso modo in cui sistema remoto? Possiamo affrontare questo nuovo test, un modulo di test che mi chiama . Integration Contract TestsQueste vengono eseguite con lo stesso l’interazione con il sistema remoto e il doppio, e controllare che i due match. In questo caso “match” non può significare che con lo stesso risultato (a causa della non-determinisms), ma i risultati che condividono la stessa struttura essenziale. Contratto di integrazione i test devono essere eseguiti frequentemente, ma che non fa parte del nostro sistema di distribuzione pipeline. L’esecuzione periodica sulla base del tasso di cambio del sistema remoto è di solito meglio.

Per scrivere questi tipi di test, sono un grande fan di Self Initializing Fakes – dal momento che questi sono molto semplici da gestire.

Alcune persone sono fermamente contro l’uso Test Doubles di prove funzionali, ritenere che si deve sottoporre a test di connessione reale al fine di garantire una comportamento. Mentre capisco la loro tesi, i test automatici sono inutili se non sono deterministiche. In tal modo, ogni vantaggio il vantaggio di parlare con il sistema reale è sopraffatto dalla necessità di eliminare il non-determinismo[ 11].

Tempo

Poche cose sono più non-deterministico di una chiamata per l’orologio di sistema. Ogni volta che si chiama, è possibile ottenere un risultato nuovo, e le prove che da essa dipendono così può cambiare. Chiediamo per tutti il todos a causa dell’ora successiva, ed è regolarmente una risposta diversa [ 12].

La cosa più importante è quella di garantire che sia sempre avvolgere l’orologio di sistema di routine che possono essere sostituiti con un valore seminate per il test. UN orologio fuso può essere impostata in particolare tempo e congelate a quel tempo, in modo da rendere il test per avere il controllo completo sopra i suoi movimenti. Questo modo è possibile sincronizzare i dati di prova che i valori nel seminate orologio.[13][14]

Sempre avvolgere il clock di sistema, in modo che possa essere facilmente sostituito per il test.

Una cosa a cui prestare attenzione a questo , che alla fine i dati del test potrebbe iniziare ad avere problemi perché è troppo vecchio, e conflitti con altri fattori nella vostra applicazione. In questo caso, è possibile spostare i dati , e il vostro orologio semi di nuovi valori. Quando si esegue questa operazione, assicurarsi che questa è l’unica cosa da fare. Questo modo potete essere sicuri che i test che non sono dovute al tempo-movimento in dati di test.

Un’altra area dove il tempo può essere un problema è quando si basano su altri comportamenti dall’orologio. Una volta ho visto un sistema che genera chiavi random in base a valori di clock. Questo sistema è iniziato quando è stato spostato in una macchina più rapidi di allocare più id all’interno di un singolo ciclo di clock.[15]

Ho sentito tanti problemi dovuti alle chiamate dirette al clock di sistema che mi piacerebbe discutere per trovare un modo per utilizzare l’analisi del codice per rilevare eventuali chiamate dirette all’orologio di sistema e non il proprio. Anche una semplice espressione regolare controllo potrebbe farvi risparmiare un frustrante sessione di debug dopo una chiamata ad una tarda ora.

Perdite di risorse

Se l’applicazione ha un qualche tipo di perdita risorse, il che si tradurrà in test a caso, poiché è solo che test provoca la perdita risorse per andare oltre il limite che prende il fallimento. Questo caso è scomoda perché qualsiasi test può non riuscire a intermittenza a causa di questo problema. Se non è un caso di una prova non-deterministico quindi perdite di risorse sono un buon candidato per indagare.

Da perdita risorse, intendo tutte le risorse che la domanda è la gestione di acquisizione e al rilascio. In non-memoria-ambienti gestiti, l’ovvio esempio è la memoria. Gestione della memoria ha fatto molto per eliminare il problema, ma altre risorse ancora devono essere gestiti, come le connessioni al database.

Solitamente il modo migliore per gestire questo tipo  di risorse è un Resource Pool. Se lo si fa quindi una buona tattica è quella di configurare il pool di una dimensione di 1 e genera un’eccezione se dovesse arrivare una richiesta per una risorsa quando non ne ha nessuna sinistra. Che il primo test per richiedere una risorsa dopo la perdita non sarà – che rende molto più facile trovare il problema.

Questa idea di limitazione delle dimensioni del pool delle risorse , sia per l’aumento dei limiti di compiere gli errori più probabile per i test. Questo è un bene perché si desidera che gli errori di prove in modo da poterli correggere prima che si manifestano in produzione. Questo principio può essere utilizzato anche in altri modi. Una storia che ho sentito era di un sistema che ha generato casualmente denominato file temporanei, non li pulite correttamente, e si è schiantato in un incidente. Questo tipo di bug è molto difficile da trovare, ma un modo di manifestare è a stub il regolatore per il test, in modo che restituisce sempre lo stesso valore. Che modo si può raggiungere la superficie il problema più rapidamente.

Condividere:

Se avete trovato questo articolo utile, vi invitiamo a condividere. Apprezzo i commenti e incoraggiamenti

Per gli articoli su simili argomenti…

…Prendiamo in esame il seguente tag:

delivery testing

Note a piè pagina

1: Sì , so che molti sostenitori del TDD ritengono che la principale virtù di test è il modo in cui aziona i requisiti e il progetto. Concordo sul fatto che questo è un grande vantaggio, ma ritengo che la regressione suite per essere il più grande vantaggio che i test automatici. Anche senza TDD test valgono il costo.

2: A volte , naturalmente, un fallimento del test è dovuto ad un cambiamento di ciò che il codice è richiesto di fare, ma il test non è stato aggiornato per riflettere il nuovo comportamento. Si tratta essenzialmente di un bug nelle prove, ma è altrettanto facile da risolvere se catturati.

3: C’ è un ruolo utile per prove non deterministico. Prove seminate da un regolatore può aiutare cacciare fuori bordo. Test delle prestazioni sarà sempre tornare con valori diversi. Ma questi tipi di prove sono abbastanza diversi da automated test di regressione, che sono la mia attenzione.

4: Questo funziona bene per il team che si intrecciano sono abili abbastanza per trovare e correggere le prove non deterministico e disciplinato abbastanza rapidamente per evitare che al più presto. Se la build rotta rimane a lungo a causa della quarantena prove non si perderà il valore dell’integrazione continua. Per la maggior parte dei team vorrei consigliare il test in quarantena fuori del gasdotto principale.

5: Non c’è hard-e-definizioni qui, ma sto usando la terminologia Extreme Programming precoce dell’utilizzo di “test” per indicare qualcosa a grana molto fine e “funzionale” come una prova più end-to-end e funzionalità.

6: Un trucco è quello di creare il database iniziale e copiare il file usando i comandi di sistema prima di aprirlo per ogni prova. Copie di File system sono spesso più veloce di caricamento dei dati utilizzando i comandi del database.

7: Naturalmente questo trucco funziona solo quando è possibile eseguire la prova senza commettere operazioni.

8: Anche se è comunque necessario un timeout in caso non avrai una risposta – e che il tempo è soggetto a questo pericolo quando si muove in un ambiente diverso. Per fortuna è possibile impostare tale timeout per essere piuttosto elevata, che riduce al minimo le possibilità di che mordendo.

9: In questo caso, tuttavia, le prove saranno eseguite molto lentamente. Se lo si desidera è possibile interrompere l’intera suite di test se si raggiunge il limite di attesa .

10: Se il vostro comportamento asincrono viene generato dall’INTERFACCIA UTENTE, spesso è una buona scelta DELL’INTERFACCIA UTENTE di avere un indicatore è in corso un’operazione asincrona. Di questa parte dell’INTERFACCIA UTENTE aiuta anche i ganci prova necessaria ad arrestare questo indicatore può essere lo stesso ganci come rilevare quando il test logic.

11: Ci sono altri vantaggi derivanti dall’uso di una doppia prova in queste circostanze, anche se il sistema remoto è deterministica. Tempo di risposta è spesso troppo lento per l’utilizzo di un sistema remoto. Se si può solo parlare di un sistema live, quindi i test possono generare rilevanti, e sottovalutato, carico sul sistema.

12: Reseed l’archivio dati  per ogni test in base al tempo attuale. Ma che un sacco di lavoro, e foriera di potenziali errori di temporizzazione.

13: In questo caso l’orologio stub è un modo comune per rompere l’isolamento, ogni prova che utilizza deve assicurarsi che sia  correttamente inizializzato nuovamente.

14: Uno dei miei colleghi ama per forza una prova appena prima e dopo la mezzanotte al fine di raccogliere prove che utilizzano l’ora corrente e supponendo che lo stesso giorno una o due ore più tardi. Ciò è particolarmente buona a volte come l’ultimo giorno del mese.

15: Anche se, naturalmente, non è sempre un non-determinismo bug, ma è quello che a causa di un cambiamento nell’ambiente. A seconda di come chiudere il tuo orologio per l’id assegnazione, potrebbe comportare la non-comportamento deterministico.

Riconoscimenti

Come al solito, ho bisogno di ringraziare i molti ThoughtWorks colleghi per condividere le loro esperienze e quindi fornire il materiale per mettere insieme questo articolo.

Michael Dietz, Danilo Sato, Lupo Janakiraman, Matt Savage, Krystan Vingrys e Brandon Byers leggi l’articolo e mi ha dato alcuni ulteriori commenti.

De Sykes mi ha ricordato l’approccio di utilizzare un file-system copy di un file di database per creare database iniziale per ogni prova.

Revisioni significative

14 Aprile 2011: pubblicato per la prima volta

24 Marzo 2011: progetto di revisione entro ThoughtWorks

16 Febbraio 2011: iniziato l’articolo