Domanda

Questo post è iniziato come "Quali sono alcuni modelli comuni in Unit Testing codice multi-threaded?", Ma ho trovato un po 'di href="https://stackoverflow.com/questions/352695/best-way-to-run-multi-threaded-nunit-tests"> discussioni , in modo che generalmente riconosciuto che "è difficile (TM)" e "Dipende (TM)". Così ho pensato che la riduzione del campo di applicazione della domanda sarebbe più utile.

Sfondo : Stiamo realizzando un semplice scheduler che ti dà un modo per registrare callback quando avvio e l'arresto di posti di lavoro e, naturalmente, configurare la frequenza di programmazione. Al momento, stiamo facendo un involucro leggero intorno java.util.Timer.

Aspetti :

  • Non ho trovato un modo per testare questa scheduler facendo affidamento solo su interfacce pubbliche (qualcosa di simile addJob(jobSchedule, jobArgs,jobListener), removeJob(jobId)).

  • Come faccio a tempo il fatto che il lavoro è stato chiamato in base alla pianificazione specificata?

È stato utile?

Soluzione

è possibile utilizzare un oggetto registratore che registrano l'ordine, tempi e altre cose utili per ogni unit test del vostro scheduler. Il test è semplice:

  1. creare un oggetto registratore
  2. configurare la pianificazione
  3. eseguire un test di unità
  4. controllare quell'oggetto registratore è "compatibile" con il programma

Altri suggerimenti

Una cosa anche da ricordare è che non c'è bisogno di provare che Timer funziona. È possibile scrivere una versione finta di Timer (estendendo la classe o utilizzando EasyMock ) che semplicemente controlla che si chiedono in modo corretto, forse anche la sostituzione basta che non hai bisogno di discussioni a tutti. In questo caso, che potrebbe essere più lavoro di quanto necessario se il vostro ascoltatore lavoro ha abbastanza callback per monitorare lo scheduler.

L'altra cosa importante da ricordare è che quando si prova lo scheduler, utilizzare posti di lavoro personalizzato che traccia come lo scheduler è in funzione; durante il test i processi pianificati, chiamare i callback direttamente e non attraverso lo scheduler. Si può avere un test di integrazione di livello superiore che controlla entrambi insieme, a seconda del sistema.

Ci sono molti modi di guasto che una tale pianificazione potrebbe esporre, e ciascuno sarebbe molto probabilmente richiederà un proprio banco di prova. Questi casi di test sono suscettibili di essere molto diverso, così "dipende".

per testare il software concorrente in Java in generale, vi consiglio questa presentazione da JavaOne 2007: Testing Concurrent Software .

Per la prova che un programmatore deve eseguire i lavori in accordo preciso per il loro programma, mi piacerebbe creare un'astrazione del tempo stesso. Ho fatto qualcosa di simile in uno dei miei progetti, dove ho un momento o l'interfaccia Clock. L'implementazione predefinita sarà MillisecondTime, ma durante i test ho passerà fuori con un TickTime. Questa implementazione consentirà il mio test di unità per il controllo quando il tempo avanza e di quanto.

In questo modo, si potrebbe scrivere un test in cui un lavoro è pianificato per essere eseguito una volta ogni 10 tick. Poi il test solo avanzare il contatore di graduazione e controlli per assicurarsi che i lavori eseguiti presso le zecche corrette.

Un paio di modi per testare il codice concorrente.

  • esegue lo stesso codice più volte sotto carico, alcuni bug appaiono solo occasionalmente, ma in grado di dimostrare in modo coerente se eseguita più volte.
  • memorizzare i risultati di diversi fili / posti di lavoro in una collezione, come un BlockingQueue. Questo vi permetterà di controllare i risultati nel thread corrente e finire in modo tempestivo (senza comandi di pausa arbitraria brutti)

Se si hanno prove concorrenza difficile prendere in considerazione il refactoring gli oggetti / componenti per renderli più facili da verificare.

Se i delegati di pianificazione per un Executor o ExecutorService per eseguire i compiti, è possibile utilizzare Dependency Injection per rimuovere una dipendenza diretta dal tipo di Executor, e utilizzare un semplice singolo Executor filettato per testare molte delle funzionalità del vostro scheduler senza la complicazione di veramente multi-threaded codice. Una volta che ci si ottenuto questi test di debug, è possibile spostare il più difficile, ma ora sostanzialmente ridotto in grandezza, compito di test thread-safe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top