Die Anpassung der Datenbank für Tests kann die Dinge beschleunigen. Ofc. Dies hängt von dem verwendeten db-Typ ab ... Durch db-Integrationstests können Sie Ihre Transaktionen einfach zurücksetzen. Durch andere Integrationstests können Sie die Datenzugriffsebene einfach ausspionieren.
durch funktionelle Tests, die Sie keine andere Wahl haben, aber Ihr System mit der realen Datenbank zu testen ...
Ich experimentiere derzeit mit Event-Sourcing, die eine Menge, indem sie Vorrichtungen helfen kann. Die kürzeste Beschreibung dieser Technik: Sie benötigen DDD (und auch CQRS wird empfohlen), speichern Domänenereignisse in Ihrem Ereignisspeicher, und danach können Sie den aktuellen Status erstellen, indem Sie die zugehörigen Ereignisse aus dem Ereignisspeicher abrufen und sie in a wiederholen Sequenz. Sie können viele verschiedene Cache-Datenbanken oben auf diesem Ereignisspeicher erstellen, die nur den aktuellen Status einer Komponente Ihres Dienstes enthalten, nichts mehr ... Der Synchronisationsprozess wird von Klassen ausgeführt, die Projektionen genannt werden, und wird automatisch sync oder async genannt indem Sie ein Ereignis speichern. Also, um eine Befestigung zu machen, müssen Sie nur Domain-Ereignisse speichern ...
Zum Beispiel können Sie so etwas wie dies durch eine sehr einfache REST-API schreiben:
Herstellung Aufnahme:
event.storage.clear();
every.cache.clear();
var credentials = {
name: "infje",
password: "oéö9péüöáé9oilusw"
};
var resourceId = "swegretz34ze4wed";
var userDataSet = [
{
id: 1,
type: "UserCreate",
resource: resourceId,
identificationFactors: credentials,
nick: "inf3rno",
birthDate: "1333.03.03.",
hobbies: ["wall climbing"]
},
{
id: 2,
type: "UserUpdate",
resource: resourceId,
hobbies: ["base jumping", "knitting"]
}
];
event.storage.persistAll(userDataSet);
auth.cache.sync(event.storage); //a relational database with the user credentials
users.cache.sync(event.storage); //a nosql document database with the user profile
Funktionstest:
var response = http.get("https://my.test.api/users", credentials);
assert(response).toEqual({
size: 1,
items: [
{
id: resourceId,
nick: "inf3rno",
hobbies: ["base jumping", "knitting"],
birthDate: "1333.03.03."
}
]
});
Anmerkung: Dies ist nur ein Proof of concept-Code, so Details wie Passwort-Verschlüsselung, REST Hypermedia-Einschränkung, automa c Aufruf von Projektionsklassen, etc ... sind jetzt nicht relevant.
Ofc. Dies ist immer noch langsames Ereignis langsamer als Ihr ursprünglicher Ansatz, aber Sie können diesen Teil nicht ändern, wenn Sie die echte Datenbank testen möchten, und mit Event Sourcing ist es mühelos, Test-Fixtures zu machen, Daten zu migrieren, die Struktur der Cache-Datenbanken zu ändern neue Version, etc ... Also es ist definitiv einen Versuch wert ...
Ich benutze bereits Hudson, Maven, JWebUnit und andere Tools. Die End-to-End-Tests werden von jedem erfolgreichen Build des Hauptprojekts ausgelöst. Die interessante Frage ist jedoch, wie ich meine Umgebung einrichten und abreißen kann, wenn sie tatsächlich in der Datenbank gehostet wird und in der Webanwendung zwischengespeichert wird, während ich meine Tests in einem separaten Prozess durchführe. –