Bei der Verwendung von stubs und mocks?
Habe ich diese Verwirrung die ganze Zeit. Wenn ich Schreibe einen code, der verwendet gefälschte code geltend zu machen, einige Operationen, wie kann ich das Vertrauen meiner realen Umsetzung, wenn es begann wirklich mit den realen Objekten anstelle von gefälschten diejenigen.
Ich habe zum Beispiel diesen code --
[Test]
public void CanCreateContactsWithData()
{
using(ISession session = factory.OpenSession())
using (ITransaction trans = session.BeginTransaction())
{
_contactId = (long) session.Save(contact);
trans.Commit();
}
Assert.AreNotEqual(0, _contactId);
}
Dieser code testet die Umsetzung der "contact" - Objekt, ob das gespeichert wird in der Datenbank oder nicht. Wenn ich zufällig die Verwendung einer stub-statt einer realen Datenbank-Verbindung, brauche ich eine separate test für die Speicherung in der Datenbank? Und, tun Sie Jungs nennen, die als integration Tests?
Antworten sind herzlich willkommen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Martin Fowler hat eine gute Diskussion hier.
Aus seinem Artikel:
Meszaros verwendet den Begriff Test Doppel-als Oberbegriff für jede Art von vorgeben Objekt statt einem realen Objekt zu Testzwecken. Der name kommt aus der Vorstellung von einer Stunt-Double in Filmen. (Eines seiner Ziele war es, zu vermeiden, die mit Namen, wurde bereits weit verbreitet.) Meszaros dann definiert vier besonderen Arten der Doppelzimmer:
Diese Arten von verdoppelt, nur spottet, bestehen Sie auf der Verhaltens-Verifikation.
Sollten Sie testen, den code, den Sie geschrieben haben. Wenn Sie schrieb die Datenbank connection-Objekt-code, dann testen Sie es. Ansonsten, wenn es ist Teil einer Bibliothek mit eigenen tests können Sie nur mock/stub und davon ausgehen, dass, wenn das connection-Objekt übergibt es die eigene test-suite, dann funktioniert es.
Beispielsweise, würde ich nicht testen, ruft Hibernate-Methoden, ich nehme an, die Hibernate-Entwickler haben gründlich getestet bereits. Aber ich würde test, dass ich den Aufruf der richtigen Methode, mit einem mock einrichten, die Erwartung.
Verwenden Sie stubs, wenn Sie wollen einfach nur eine Funktion zurückgeben einen Wert (oder gar nichts). Sie weiß nicht wirklich, wenn die Funktion aufgerufen wurde oder nicht, Sie wollen einfach nur zu isolieren Dinge.
Spottet, sind leistungsfähiger, können Sie auch verfolgen, wenn die Funktion aufgerufen wurde, wie oft, und sogar Dinge tun, mit Werten, die Ihre Funktion erhält.
In Ihrem Fall, wenn Sie wollen, zu verspotten, die Datenbank (es wird also ein unit-test eher als eine funktionelle ein), können Sie mock ISession und ITransaction. Sie können dann speichern Sie diese Werte im Speicher und überprüfen, ob die richtigen Werte gespeichert wurden.
Ja, eine echte Datenbank wäre mehr Funktions-oder Integrationstests, je nach definition. Ich persönlich habe das Gefühl, dass die unit-tests sollen genau testen, dass die Methode nur in isolation von allem anderen. Also unabhängig davon, ob die Sitzung oder die Transaktion funktioniert oder nicht, die unit-Tests müssen sicherstellen, dass die Objekte wird werden aufgefordert, Ihre Arbeit zu tun, Wann und wie nötig das ist, wo mocks und stubs kommen. Verwenden Sie Sie, um sicherzustellen, dass Ihre unit-test ist wie entkoppelt von externen Funktionen, so dass es getestet werden kann als eine grundlegende Einheit; im Idealfall sowieso.
Meisten Arten von unit-Tests ist das testen einzelner Teile des Codes, und stubs und mocks sind einfach die tools, die Ihnen helfen, in testen Stück für Stück. Durch die Prüfung Stücke einzeln kann man wohl testen, jedes Stück im detail, aber Sie wird garantiert nicht alles über das gesamte Bild. Verschiedene Arten von Integrationstests wird das tun.
Beim testen größere Stücke von Funktionalität, finde ich oft die tatsächliche Integrations-tests von Datenbank-Logik werden die wenigsten wertvolle test-Artefakte, da Sie oft testen diese gleichen Vorgänge auf der UI-Ebene.