L'esecuzione contemporanea può determinare risultati imprevisti. Ad esempio, ho appena scoperto che mentre la mia suite di test con 200 test passava quando eseguita a uno a uno, fallisce per l'esecuzione simultanea, l'ho scavata e non era un problema di sicurezza del thread, ma un test dipendente da un altro, che è una brutta cosa e potrei risolvere il problema.
Mycila work on JUnit ConcurrentJunitRunner and ConcurrentSuite è molto interessante. L'articolo sembra un po 'obsoleto rispetto all'ultima versione di GA, nei miei esempi mostrerò l'utilizzo aggiornato.
Annotazione una classe di test come la seguente causerà per eseguire metodi di prova contemporaneamente, con un livello di concorrenza di 6:
import com.mycila.junit.concurrent.ConcurrentJunitRunner;
import com.mycila.junit.concurrent.Concurrency;
@RunWith(ConcurrentJunitRunner.class)
@Concurrency(6)
public final class ATest {
...
è anche possibile eseguire tutte le classi di test contemporaneamente:
import com.mycila.junit.concurrent.ConcurrentSuiteRunner;
@RunWith(ConcurrentSuiteRunner.class)
@Suite.SuiteClasses({ATest.class, ATest2.class, ATest3.class})
public class MySuite {
}
il Maven dependency è:
<dependency>
<groupId>com.mycila</groupId>
<artifactId>mycila-junit</artifactId>
<version>1.4.ga</version>
</dependency>
sono attualmente indagando su come eseguire i metodi più volte e contemporaneamente con questo pacchetto. Potrebbe essere già possibile, se qualcuno ha un esempio fammi sapere, sotto la mia soluzione homebrewed.
@Test
public final void runConcurrentMethod() throws InterruptedException {
ExecutorService exec = Executors.newFixedThreadPool(16);
for (int i = 0; i < 10000; i++) {
exec.execute(new Runnable() {
@Override
public void run() {
concurrentMethod();
}
});
}
exec.shutdown();
exec.awaitTermination(50, TimeUnit.SECONDS);
}
private void concurrentMethod() {
//do and assert something
}
Come altri hanno notato, è vero che non si può mai essere sicuri se un bug concorrenza rivelerebbe o no, ma con decine di migliaia o centinaia di migliaia di esecuzioni con la concorrenza di, diciamo 16, le statistiche è dalla tua parte.
+1 Per suggerire l'uso di un analizzatore di codici statici. Una ricerca su Google rivela una serie di possibilità [analisi statica della concorrenza di java]. –
http://channel9.msdn.com/shows/Going+Deep/CHESS-An-Automated-Concurrency-Testing-Tool/ – inf3rno