MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak przetestować metodę, która łączy się z mongo, bez faktycznego łączenia się z mongo?

Istnieje kilka odpowiedzi SO związanych z kodem testów jednostkowych, który wykorzystuje MongoDB jako magazyn danych:

  • Mocowanie bazy danych w node.js?
  • Mock/testowanie bazy danych Mongodb Node.js
  • Osadzone MongoDB podczas uruchamiania testów integracyjnych
  • Podobne:klasy testowania jednostek, które mają funkcjonalność online

Spróbuję skonsolidować te rozwiązania.

Preambuła

Przede wszystkim powinieneś chcesz, aby MongoDB działał podczas wykonywania testów. Język zapytań MongoDB jest złożony, więc uruchamianie prawidłowych zapytań w stabilnej instancji MongoDB jest wymagane, aby upewnić się, że zapytania działają zgodnie z planem, a aplikacja prawidłowo reaguje na wyniki. Mając to jednak na uwadze, nie powinieneś nigdy przeprowadzaj testy na systemie produkcyjnym, ale zamiast na systemie peryferyjnym do środowiska integracyjnego. Może to być na tej samej maszynie, co oprogramowanie CI, lub po prostu stosunkowo blisko niej (pod względem procesu, niekoniecznie sieciowego lub geograficznego).

Ten ENV może być mało obciążony i całkowicie uruchamiany w pamięci (zasób 1) (zasób 2), ale niekoniecznie wymaga takiej samej charakterystyki wydajności, jak produkcyjny ENV. (Jeśli chcesz przetestować wydajność, i tak powinno to być obsługiwane w innym środowisku niż CI).

Konfiguracja

  • Zainstaluj mongod usługa specjalnie dla CI. Jeśli zestawy repl i/lub sharding budzą obawy (np. problem z zapisem, nie używaj $isolated itp.), możliwe jest naśladowanie środowiska klastrowego, uruchamiając wiele mongod instancje (1 konfiguracja, dane 2x2 dla shard+repl) i mongos instancja na tej samej maszynie z kilkoma skryptami/poprawkami init.d lub czymś w rodzaju dockera.
  • Użyj konfiguracji specyficznych dla środowiska w Twojej aplikacji (osadzonej za pomocą plików .json lub w innym miejscu, takim jak /etc, /home/user/.your-app lub podobne). Twoja aplikacja może je załadować na podstawie zmiennej środowiskowej węzła, takiej jak NODE_ENV=int . W ramach tych konfiguracji parametry połączenia z bazą danych będą się różnić. Jeśli nie jesteś używając konfiguracji specyficznych dla środowiska, zacznij to robić jako sposób na abstrakcję ustawień środowiska wykonawczego aplikacji (tj. „local”, „dev”, „int”, „pre”, „prod” itp.). Mogę dostarczyć próbkę na żądanie.
  • Dołącz do aplikacji/pakietu testowego osprzęt zorientowany na testy. Jak wspomniano w jednym z powiązanych pytań, sterownik MongoDB Node.js obsługuje niektóre biblioteki pomocnicze:mongodb-fixtures i node-database-cleaner . Urządzenia zapewniają działający i spójny zestaw danych do testowania:pomyśl o nich jako o bootstrapie.

Budowanie/testy

  1. Wyczyść powiązaną bazę danych za pomocą czegoś takiego jak node-database-cleaner .
  2. Wypełnij swoje urządzenia do pustej bazy danych za pomocą mongodb-fixtures .
  3. Wykonaj swoją kompilację i przetestuj.
  4. Powtórz.

Z drugiej strony...

Jeśli nadal zdecydujesz, że nie uruchomienie MongoDB jest właściwym podejściem (i nie byłbyś jedynym), wtedy najlepszym rozwiązaniem jest abstrahowanie wywołań magazynu danych od sterownika za pomocą ORM (dla całej aplikacji, a nie tylko testowania). Na przykład coś takiego jak model twierdzi, że jest niezależny od bazy danych, chociaż nigdy go nie używałem. Stosując to podejście, nadal będziesz potrzebował osprzętu i konfiguracje środowiska , jednak instalacja MongoDB nie byłaby wymagana. Zastrzeżenie polega na tym, że jesteś na łasce wybranego ORM.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak obliczyć różnicę znaczników czasu w mongodb (w godzinach)?

  2. 6 najlepszych praktyk dotyczących wdrażania MongoDB na Amazon EC2

  3. Nie można uruchomić obrazu docker mongo w systemie Windows

  4. Skrobanie i indeksowanie stron internetowych za pomocą Scrapy i MongoDB

  5. Jaka jest różnica między metodami insert(), insertOne() i insertMany()?