2013-04-15 19 views
12

Ho iniziato a utilizzare Redis nel mio progetto con l'aiuto della libreria Jedis. Funziona tutto bene, ma ora ho un problema che i miei test funzionali richiedono che Redis sia attivo e che voglio evitare nella mia Continuous Integration. Qual è il modo migliore per farlo?Test di integrazione con Redis

+3

Puoi avvolgere tutte le tue chiamate jedis all'interno di un DAO per l'astrazione? Quindi, quando si eseguono i test delle unità, iniettare un'implementazione di test di tale DAO che restituisce una sorta di dati della fixture. – Adam

+1

Sì, l'astrazione è qualcosa che voglio fare e per i test di unità non ho problemi a prendere in giro le connessioni a Redis ma per i test integrati cercavo una soluzione. Per esempio. cassandra ha qualcosa chiamato cassandra incorporata che usiamo. –

+0

Ahh interessante - non sono sicuro che Redis abbia qualcosa del genere. Per il mio test di integrazione utilizziamo un'istanza redis specifica per il nostro ambiente CI e specifiche sostituzioni di configurazione per indicare che i test devono essere eseguiti su quell'istanza redis fittizia. – Adam

risposta

8

Qui ci sono alcune opzioni che si hanno per i test funzionali/integrazione:

  1. Basta avviare un'istanza di Redis sul vostro server CI. Tutti i test saranno responsabili della corretta pulizia dopo l'esecuzione.
  2. Provare in qualche modo a controllare il processo di redis, cioè avere uno script di shell o un lavoro sul server CI per avviarlo/arrestarlo prima/dopo aver eseguito i test. Almeno parte del carico di installazione/pulizia viene rimosso dai test, poiché per ogni build indipendente si avrà una configurazione redis indipendente.
  3. Il controllo viene ulteriormente eseguito utilizzando una soluzione in-memory come quella che si menziona per cassandra (se esiste).

Una cosa da ricordare è che i test di integrazione non devono sostituire i test di unità. I test unitari dovrebbero probabilmente essere preferiti e possono coprire più casi, mentre i test di integrazione possono essere utilizzati solo per verificare che tutte le parti dell'applicazione funzionino bene insieme. E penso che questo sia il motivo per cui molte persone scelgono di optare per l'opzione numero uno.

Ecco una domanda simile about mongodb La risposta ha un collegamento al progetto che funziona per la seconda opzione (controlla il processo di mongodb) Se si seguono alcuni collegamenti correlati nella pagina del progetto c'è anche qualcosa chiamato nosql-unit. Questo penso di provare a coprire l'opzione tre. Non l'ho usato ma sembra che abbia qualcosa anche per redis.

1

È possibile avviare il server Redis su una porta arbitraria tramite la riga di comando: redis-server --port 7777. Pertanto, ai fini dei test di integrazione, è possibile avviare Redis su una porta disponibile (o casuale), assicurandosi che Jedis sia configurato per utilizzare tale porta.

In questo modo, hai un'istanza "fresca" di Redis che non sarà in conflitto con altri processi, comprese altre esecuzioni di test che si verificano nello stesso momento. Questo è il più vicino possibile all'analogo di eseguire un database in memoria/incorporato per i test di integrazione.

Per il pre-caricamento di Redis con "dati memorizzati", utilizzare lo switch --dbfilename <file>: redis-server --port 7777 --dbfilename test.rdb.

16

Ho implementato un semplice Redis corridore incorporati per Java: https://github.com/kstyrc/embedded-redis

Attualmente, utilizza redis 2.6.14 per * nix e https://github.com/MSOpenTech/redis per Windows. Tuttavia è possibile utilizzare la classe RedisServer per eseguire il proprio script di esecuzione.

Ho intenzione di estendere l'implementazione per supportare RedisConf (bind, slaveof, port, dbfilename, ecc.). Dopodiché, caricherò jar in clojars per mvn deps.

+0

Quando aggiungo lo snippet di dipendenza nel mio pom.xml che si indica nel README.md, si dice che non è in grado di trovare la dipendenza. Ho anche aggiunto lo snippet del repository. Dove si trova il tuo codice al momento? –

+0

Ho provato a utilizzare inutilmente il tuo progetto redis incorporato: ecco un post relativo ai miei problemi: http://stackoverflow.com/questions/29059794 – balteo

+0

@NishantKelkar forse dovresti aggiornare Maven? Il manufatto è lì: https://clojars.org/repo/redis/embedded/embedded-redis/0.5/ – kstyrc

0

provare nosql-unit. Supporta test unità redis con java.

Ho provato EmbeddedRedis e ho trovato che molte interfacce Jedis non sono supportate. Quindi utilizzare EmbbededRedis non è una buona idea, specialmente quando si utilizzano alcune funzioni di redis avanzate come "pipeline".

io suggerisco di usare ManagedRedis per unit test:

  1. scaricare un codice sorgente Redis dal redis.io nella vostra risorsa prova
  2. costruire un Redis-server nel $ (your-Redis-dir)/src
  3. scrive un test unitario con ManagedRedis, ecco uno example. Nota che "REDIS_HOME" è la directory in cui è stato scaricato il tuo codice redis, ManagedRedis troverà redis-server in $ {REDIS_HOME}/src
  4. esegui il test dell'unità.
+1

Se si consiglia una libreria, è consuetudine mostrare come può essere applicato. Aggiungi un codice di esempio alla tua risposta. –

0

Come @ksytrc menzionato in his answer ho praticamente utilizzato la sua soluzione. Stava funzionando in this project. È sufficiente aggiungere la dipendenza Redis embedded.

 <dependency> 
      <groupId>com.github.kstyrc</groupId> 
      <artifactId>embedded-redis</artifactId> 
      <version>0.6</version> 
      <scope>test</scope> 
     </dependency> 

poi nella classe di test definire il redisServer

RedisServer redisServer; 

    @Before 
    public void setUp() throws IOException { 
     redisServer = new RedisServer(); 
     redisServer.start(); 
    } 

anche definire application.yml con le credenziali di seguito.

spring: 
    redis: 
    host: localhost 
    port: 6379 
Problemi correlati