2017-02-02 1 views
1

Je suis en train d'introduire cassandra unité pour un ensemble de UTs courir avec org.gradle.parallel=true pour une application au printemps-démarrage.cassandra unité pour une suite de Java donnant UTs des pannes intermittentes si org.gradle.parallel = true

L'exécution de tous les tests n'est pas fiable, mais fonctionne parfois.

Je suppose que cela est lié au problème décrit à https://github.com/jsevellec/cassandra-unit/issues/155, c'est-à-dire que la première instance est encore en attente au prochain démarrage de UT et qu'il n'y a aucun moyen de l'arrêter rapidement.

Mon approche originale qui donne des résultats peu fiables est avec org.gradle.parallel=true-à-dire

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 
@TestExecutionListeners(
    listeners = CassandraUnitTestExecutionListener.class, 
    mergeMode = MERGE_WITH_DEFAULTS 
) 
@CassandraDataSet 
@EmbeddedCassandra 
public class MyCassandraUnitTest { 

    @Test 
    public void xxx_xxx() { 
    } 

} 

comme décrit à cassandra-unit/wiki et StephanPraetsch github example

Pour contourner ce problème, j'ai essayé de supprimer les annotations et au lieu d'utiliser l'API native-à-dire essayer de garder une course pour tous les tests, et avec org.gradle.parallel=false cela semble être fiable, mais ralentit la construction globale. (Test encore pour assurer sa non coïncidence) Avec cette approche

Avant unité de classe:

EmbeddedCassandraServerHelper.startEmbeddedCassandra(); 

et après l'unité de classe:

EmbeddedCassandraServerHelper.cleanEmbeddedCassandra(); 

comme décrit à - https://github.com/jsevellec/cassandra-unit/wiki/How-to-use-it-in-your-code.

L'erreur que je reçois avec la première approche est temporisations comme

00:27:31.826 [Test worker] ERROR org.cassandraunit.utils.EmbeddedCassandraServerHelper - Cassandra daemon did not start after 20000 ms. Consider increasing the timeout 

ou bien des conflits de port comme

2017-02-02 19:44:41.741 ERROR 40053 --- [pool-2-thread-1] o.a.cassandra.service.CassandraDaemon : Fatal configuration error 

    org.apache.cassandra.exceptions.ConfigurationException: /127.0.0.1:7010 is in use by another process. Change listen_address:storage_port in cassandra.yaml to values that do not conflict with other services 
     at org.apache.cassandra.net.MessagingService.getServerSockets(MessagingService.java:557) 
     at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:501) 
     at org.apache.cassandra.net.MessagingService.listen(MessagingService.java:485) 
     at org.apache.cassandra.service.StorageService.prepareToJoin(StorageService.java:745) 
     at org.apache.cassandra.service.StorageService.initServer(StorageService.java:648) 
     at org.apache.cassandra.service.StorageService.initServer(StorageService.java:548) 
     at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:385) 
     at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:601) 
     at org.cassandraunit.utils.EmbeddedCassandraServerHelper$1.run(EmbeddedCassandraServerHelper.java:129) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
     at java.lang.Thread.run(Thread.java:745) 

    2017-02-02 19:44:41.745 INFO 40053 --- [  Thread-7] o.s.w.c.s.GenericWebApplicationContext : Closing org.s[email protected]7ffd8dee: startup date [Thu Feb 02 19:44:17 GMT 2017]; root of context hierarchy 
    2017-02-02 19:44:41.972 WARN 40053 --- [iceShutdownHook] org.apache.cassandra.gms.Gossiper  : No local state or state is in silent shutdown, not announcing shutdown 
    2017-02-02 19:44:41.972 INFO 40053 --- [iceShutdownHook] o.apache.cassandra.net.MessagingService : Waiting for messaging service to quiesce 
    2017-02-02 19:44:41.982 INFO 40053 --- [iceShutdownHook] org.apache.cassandra.hints.HintsService : Paused hints dispatch 
    2017-02-02 19:44:42.072 INFO 40053 --- [iceShutdownHook] org.apache.cassandra.hints.HintsService : Paused hints dispatch 

Répondre

1

répondre à ma propre question: je sacrifiais construire le projet parallèle à gradle, à savoir org.gradle.parallel=false dans mon gradle.properties

Dans mes tests ont:

@BeforeClass 
public static void before() throws InterruptedException, IOException, TTransportException { 
    EmbeddedCassandraServerHelper.startEmbeddedCassandra(20000); 
} 

@AfterClass 
public static void after() throws InterruptedException, IOException, TTransportException { 
    EmbeddedCassandraServerHelper.cleanEmbeddedCassandra(); 
} 

Le cleanEmbeddedCassandra() efface juste les espaces-clés mais laisse le serveur Cassandra en cours d'exécution.

J'aurais préféré que le nettoyage arrête EmbeddedCassandraServer au lieu de le laisser fonctionner jusqu'à ce que le processus se termine.

L'approche fonctionnant de manière fiable mais pas ce que je voulais peut-être quelqu'un postera un meilleur moyen!

0

Avez-vous essayé? EmbeddedCassandraServerHelper.startEmbeddedCassandra(EmbeddedCassandraServerHelper.CASSANDRA_RNDPORT_YML_FILE);