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
risposta
Qui ci sono alcune opzioni che si hanno per i test funzionali/integrazione:
- Basta avviare un'istanza di Redis sul vostro server CI. Tutti i test saranno responsabili della corretta pulizia dopo l'esecuzione.
- 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.
- 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.
È 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
.
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.
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? –
Ho provato a utilizzare inutilmente il tuo progetto redis incorporato: ecco un post relativo ai miei problemi: http://stackoverflow.com/questions/29059794 – balteo
@NishantKelkar forse dovresti aggiornare Maven? Il manufatto è lì: https://clojars.org/repo/redis/embedded/embedded-redis/0.5/ – kstyrc
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:
- scaricare un codice sorgente Redis dal redis.io nella vostra risorsa prova
- costruire un Redis-server nel $ (your-Redis-dir)/src
- 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
- esegui il test dell'unità.
Se si consiglia una libreria, è consuetudine mostrare come può essere applicato. Aggiungi un codice di esempio alla tua risposta. –
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
- 1. Test di integrazione con aerospike?
- 2. Test di integrazione con Authlogic?
- 3. Test di scrittura con RSpec per Redis con Rails
- 4. Test di integrazione della molla con profilo
- 5. Test di integrazione molla lento con Autowiring
- 6. Test di integrazione con Hibernate Envers
- 7. Test di integrazione con sicurezza a molla
- 8. Grails: test di un reindirizzamento con un test di integrazione
- 9. Test di integrazione Servizi WCF concatenati con database di test
- 10. Test unità separati e test di integrazione
- 11. Amazon Kinesis + Test di integrazione
- 12. Test di integrazione e unità
- 13. Test di integrazione per fullCalendar
- 14. Filtro test integrazione Grails
- 15. Mocking per test di integrazione
- 16. Test unità/integrazione continua con Simulink/Stateflow
- 17. Quadro di test di integrazione multi-lingua
- 18. Test di integrazione di Capybara con JavaScript asincrono
- 19. Attività di test di integrazione separata su gradle con Android
- 20. Sovrascrivi registrazione Autofac - Test di integrazione con DI
- 21. Test di integrazione di Grails con più servizi
- 22. Elasticsearch Spring test di integrazione di avvio
- 23. Google fornisce agli utenti di test i test di integrazione
- 24. Test Driven Development/Test di integrazione nello sviluppo di RIA
- 25. Maven - test di integrazione separati dai test di unità
- 26. python & maven (integrazione test unità)
- 27. Test SBT/Scala e Integrazione
- 28. Framework test UI + integrazione continua?
- 29. Migliori pratiche di test di integrazione
- 30. test di integrazione ASP.NET 5 Identity
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
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. –
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