2013-04-15 18 views
12

Zacząłem używać Redis w moim projekcie przy pomocy biblioteki Jedis. Wszystko działa dobrze, ale teraz mam problem, że moje testy funkcjonalne wymagają, aby Redis był, którego chcę uniknąć w mojej ciągłej integracji. Jaki jest najlepszy sposób na zrobienie tego?Testowanie integracji z Redis

+3

Czy możesz zawijać wszystkie swoje wywołania jedis wewnątrz DAO, aby abstrakcyjne czerwone zniknęły? Następnie, gdy przeprowadzisz testy jednostkowe, wstrzyknij testową implementację tego DAO, która zwraca jakieś dane urządzenia. – Adam

+1

Tak, abstrakcja jest czymś, co chcę robić i do testowania jednostkowego Nie mam problemu z kpiny z połączeń z Redis, ale dla testów zintegrowanych szukałem rozwiązania. Na przykład. Kasandra ma coś, co nazywamy zatopioną kassandra, z której korzystamy. –

+0

Ahh ciekawe - nie jestem pewien, czy Redis ma coś takiego. Do moich testów integracyjnych używamy instancji redis specyficznej dla naszego środowiska CI i specyficznych nadpisań konfiguracji, aby wskazać, że testy powinny przebiegać w stosunku do tej sztucznej instancji redis. – Adam

Odpowiedz

8

Oto kilka opcji, które masz na testowanie funkcjonalne/Integracja:

  1. Wystarczy uruchomić instancję REDiS na ciebie serwer CI. Wszystkie testy będą odpowiedzialne za właściwe oczyszczenie po wykonaniu.
  2. Spróbuj jakoś kontrolować proces redis, to znaczy mieć jakiś skrypt powłoki lub zadanie na serwerze CI, aby uruchomić/zatrzymać go przed/po uruchomieniu testów. Co najmniej część obciążeń związanych z instalacją/czyszczeniem jest usuwana z testów, ponieważ dla każdej niezależnej kompilacji będziesz miał niezależną konfigurację redis.
  3. Redis sterowania dalej za pomocą jakiegoś rozwiązania w pamięci, jak wspomniałeś o Kasandra (jeśli istnieje).

Należy wspomnieć, że testy integracyjne nie powinny zastępować testów jednostkowych. Testy jednostkowe powinny być prawdopodobnie preferowane i mogą obejmować więcej przypadków, podczas gdy testy integracyjne mogą być używane tylko w celu sprawdzenia, czy wszystkie elementy aplikacji ładnie się ze sobą łączą. I myślę, że to jest powód, dla którego wiele osób decyduje się na opcję numer jeden.

Oto podobne pytanie about mongodb Odpowiedź zawiera odsyłacz do projektu, który działa na drugą opcję (kontroluje proces mongodb). Jeśli śledzisz kilka powiązanych linków na stronie projektu, jest także coś o nazwie nosql-unit. Ten, który moim zdaniem próbuje objąć trzecią opcję. Nie użyłem go, ale wygląda na to, że ma coś dla redis.

1

Możesz uruchomić serwer Redis na dowolnym porcie, korzystając z wiersza poleceń: redis-server --port 7777. Tak więc do celów testowania integracji można uruchomić Redis na dostępnym (lub losowym) porcie, upewniając się, że Jedis jest skonfigurowany do korzystania z tego portu.

W ten sposób otrzymujesz "świeżą" instancję Redis, o której wiesz, że nie będzie w konflikcie z żadnymi innymi procesami, w tym z innymi testami działającymi w tym samym czasie. Jest to tak blisko, jak tylko mogę pomyśleć o analogii do uruchamiania wbudowanej bazy danych w pamięci do testowania integracji.

Do wstępnego ładowania Redis z "danymi w puszkach" użyj przełącznika --dbfilename <file>: redis-server --port 7777 --dbfilename test.rdb.

16

I zostały wdrożone proste Redis osadzonych biegacza dla Java: https://github.com/kstyrc/embedded-redis

Obecnie używa Redis 2.6.14 dla * nix i https://github.com/MSOpenTech/redis dla Windows. Możesz jednak użyć klasy RedisServer do uruchomienia własnego skryptu uruchamiania.

Mam zamiar przedłużyć wdrożenie do obsługi RedisConf (bind, slaveof, port, dbfilename, etc). Następnie załaduję słoik do clojars dla mvn deps.

+0

Po dodaniu fragmentu zależności w moim pliku pom.xml wskazanym w pliku README.md, oznacza on, że nie może znaleźć zależności. Dodałem także fragment kodu repozytorium. Gdzie Twój kod jest hostowany od teraz? –

+0

Próbowałem użyć twojego osadzonego projektu redis bez rezultatu: oto post dotyczący moich nieszczęść: http://stackoverflow.com/questions/29059794 – balteo

+0

@NishantKelkar może powinieneś odświeżyć maven? Artefakt jest tam: https://clojars.org/repo/redis/embedded/embedded-redis/0.5/ – kstyrc

0

spróbuj nosql-unit. Obsługuje test jednostki redis za pomocą java.

Próbowałem EmbeddedRedis i stwierdziłem, że wiele interfejsów Jedis nie jest obsługiwanych. Dlatego używanie EmbbededRedis nie jest dobrym pomysłem, szczególnie gdy używasz zaawansowanej funkcji redis, takiej jak "potok".

Proponuję za pomocą ManagedRedis dla testów jednostkowych:

  1. pobrać kod źródłowy Redis z redis.io do swojego testowego zasobu
  2. zbudować Redis-serwer w $ (twój-Redis-dir)/src
  3. Napisz test jednostki z ManagedRedis, tutaj jest example. Zauważ, że "REDIS_HOME" to katalog, w którym pobrano Twój kod redis, ManagedRedis odnajdzie serwer redis w $ {REDIS_HOME}/src
  4. uruchomi test jednostki.
+1

Jeśli polecisz bibliotekę, zwykle pokazuje się jak można go zastosować. Proszę dodać przykładowy kod do swojej odpowiedzi. –

0

Jako @ksytrc wymieniony w his answer zasadniczo użyłem jego rozwiązania. Pracował w this project. Musisz tylko dodać zależność embedded-redis.

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

następnie w klasie testowej zdefiniować redisServer

RedisServer redisServer; 

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

także określić application.yml z poniższych poświadczeń.