2017-12-26 6 views
0

Wir verwenden mongodb-prebuilt Paket für die Durchführung von Unit/Integration Tests (CI/CD) für die entwickelte Software, die Interaktion mit mongodb Datenbank führt.Richtiger Weg zum Testen Test mongodb Server

Häufiger Anwendungsfall ist folgendes: Starten Sie den Test des mongodb-Servers mit dem Prebuild-Paket, führen Sie die Testsuite aus und beenden Sie den Server. Erste und zweite Punkte sind leicht erledigt, aber der dritte verursacht einige Probleme.

Wenn der mongodb-prebuilt -gestartete Server nicht beendet wurde, bleibt der Test Runner für immer hängen. Wenn Sie stattdessen versuchen, den Server mit dem Befehl testConnection.command({ shutdown: 1 }) zu beenden, wird unhandledRejection ausgelöst, was sich auf eine geschlossene Verbindung bezieht - die natürlich durch das Stoppen des Servers zwangsweise geschlossen wurde.

Welches ist der richtige Weg zu entsorgen mongodb-prebuilt bei afterAll Testabschnitt? Test Engine ist jest, aber es ist nicht wichtig.
Beispielcode hier:

import { MongodHelper } from 'mongodb-prebuilt'; 
import { MongoClient } from 'mongodb'; 

describe('Test suite',() => { 
    let testConnection; 
    beforeAll(async() => { 
     const mongodHelper = new MongodHelper(['--port', "27018"]); 
     await mongodHelper.run(); 
     testConnection = await MongoClient.connect(`mongodb://localhost:27018/admin`); 
    }); 
    afterAll(async() => { 
     await testConnection.dropDatabase(); 
     await testConnection.command({ shutdown: 1 }); 
     await testConnection.close(); 
     testConnection = null; 
    }); 
    /* Here follows some test suite that uses testConnection */ 
} 

Es gab einige Versuche Problem zu lösen:

1) Sie erwarten nicht testConnection.command({ shutdown: 1 }) -Generated Versprechen, und sofort Client-Verbindung Schließen initiieren - es auf einigen Computern funktioniert, aber hängt höchstwahrscheinlich von der Ausführungsgeschwindigkeit ab und funktioniert daher instabil.

2) Aufgrund der Client-Verbindungsabbruch am Ende der Tests stark spielt keine Rolle - es ist möglich, die Einrichtung process.on('unhandledRejection', ...) Handler in afterAll Abschnitt und nur stumm Ausnahme - funktioniert gut, aber ideologisch falsche

zu sein scheint also Gibt es vielleicht eine stereotypische Lösung für die ursprüngliche Aufgabe?

WICHTIGER HINWEIS: einige Mock-Pakete stattdessen leben mongodb verwenden was darauf hindeutet, ist überhaupt nicht geeignet, da entwickelte Software spezifischen Adapter für mongodb und sollte alle Aspekte der Live-Datenbank, einschließlich Timings, admin Befehle respektieren und so

auf

Antwort

0

komfortabelste Lösung für ursprüngliches Problem wird mit mongo-unit npm Paket, das trotz des Namen, API für automatisierte integrierte Tests mit echten mongodb vorkompilierte Server, einschließlich Starts und Stoppen es: mit

Messgeräte Testsuitesieht wie folgen aus:

import 'regenerator-runtime/runtime'; 
import mongoUnit from 'mongo-unit'; 
import { MongoClient } from 'mongodb'; 

describe('MongoDB-based test suite,() => { 
    let testConnection; 

    beforeAll(async() => { 
     const connectionUrl = await mongoUnit.start({ dbName: 'admin' }); 
     testConnection = await MongoClient.connect(connectionUrl); 
    }); 

    afterAll(async() => { 
     await testConnection.dropDatabase(); 
     await testConnection.close(true); 
     await mongoUnit.stop(); 
     testConnection = null; 
    }); 

    /* Test suite goes here */ 

}); 

Paket ermöglicht auch erste Datenbank beim Start zu wählen, und klar mongodb Server-Prozess am Ende der Testsuite Anhalt durchzuführen.

Verwandte Themen