Frage

Als Neuling in der testgetriebenen Entwicklung stehe ich oft vor dem Dilemma, wie ich die Persistenz einer Datenbank einem Unit-Test unterziehen soll.

Ich weiß, dass dies technisch gesehen ein Integrationstest (kein Unit-Test) wäre, aber ich möchte die besten Strategien für Folgendes herausfinden:

  1. Abfragen testen.
  2. Einlagen testen.Woher weiß ich, dass die Einfügung fehlerhaft ist, wenn sie fehlschlägt?Ich kann es testen, indem ich einfüge und dann eine Abfrage durchführe, aber woher weiß ich, dass die Abfrage nicht falsch war?
  3. Aktualisierungen und Löschungen testen – genau wie das Testen von Einfügungen

Was sind die besten Vorgehensweisen dafür?


Zum Testen von SQL:Mir ist bewusst, dass dies möglich ist, aber wenn ich einen O/R-Mapper wie NHibernate verwende, fügt er den für die Ausgabeabfragen verwendeten Aliasnamen einige Namensfehler hinzu, und da dies etwas unvorhersehbar ist, bin ich mir nicht sicher, ob ich das testen könnte Das.

Sollte ich einfach alles aufgeben und einfach NHibernate vertrauen?Ich bin mir nicht sicher, ob das klug ist.

War es hilfreich?

Lösung

Schauen Sie sich die DB-Einheit an.Es handelt sich um eine Java-Bibliothek, es muss jedoch ein C#-Äquivalent vorhanden sein.Damit können Sie die Datenbank mit einem Datensatz vorbereiten, sodass Sie wissen, was sich in der Datenbank befindet. Anschließend können Sie eine Schnittstelle zu DB Unit herstellen, um zu sehen, was sich in der Datenbank befindet.Es kann auf vielen Datenbanksystemen ausgeführt werden, sodass Sie Ihr tatsächliches Datenbank-Setup oder etwas anderes verwenden können, z. B. HSQL in Java (eine Java-Datenbankimplementierung mit einer In-Memory-Option).

Wenn Sie testen möchten, ob Ihr Code die Datenbank ordnungsgemäß verwendet (was Sie höchstwahrscheinlich tun sollten), ist dies der richtige Weg, um jeden Test zu isolieren und sicherzustellen, dass die Datenbank die erwarteten Daten vorbereitet hat.

Andere Tipps

Als sagte Mike Stone, DbUnit eignet sich hervorragend, um die Datenbank vor der Ausführung Ihrer Tests in einen bekannten Zustand zu versetzen.Wenn Ihre Tests abgeschlossen sind, kann DbUnit die Datenbank wieder in den Zustand versetzen, in dem sie sich vor der Ausführung der Tests befand.

DbUnit (Java)

DbUnit.NET

Sie führen die Unit-Tests durch, indem Sie die Datenbankverbindung simulieren.Auf diese Weise können Sie Szenarien erstellen, in denen bestimmte Abfragen im Ablauf eines Methodenaufrufs erfolgreich sind oder fehlschlagen.Normalerweise baue ich meine Scheinerwartungen so auf, dass der eigentliche Abfragetext ignoriert wird, weil ich wirklich die Fehlertoleranz der Methode und ihre Handhabung testen möchte – die Besonderheiten der SQL sind für diesen Zweck irrelevant.

Dies bedeutet natürlich, dass Ihr Test die Methode nicht wirklich überprüft funktioniert, weil die SQL möglicherweise falsch ist.Hier setzen Integrationstests an.Darauf erwarte ich, dass jemand anderes eine ausführlichere Antwort hat, da ich selbst gerade erst anfange, mich damit auseinanderzusetzen.

Ich habe hier einen Beitrag darüber geschrieben Unit-Test der Datenschicht was genau dieses Problem abdeckt.Entschuldigung für den (beschämenden) Stecker, aber der Artikel ist zu lang, um ihn hier zu veröffentlichen.

Ich hoffe, das hilft Ihnen – es hat bei mir in den letzten 6 Monaten bei 3 aktiven Projekten sehr gut funktioniert.

Grüße,

Rob G

Das Problem, das ich beim Unit-Testen der Persistenz hatte, insbesondere ohne ORM und damit das Verspotten Ihrer Datenbank (Verbindung), ist, dass Sie nicht wirklich wissen, ob Ihre Abfragen erfolgreich sind.Es kann sein, dass Ihre Abfragen speziell für eine bestimmte Datenbankversion konzipiert sind und nur mit dieser Version erfolgreich sind.Das werden Sie nie herausfinden, wenn Sie Ihre Datenbank verspotten.Meiner Meinung nach ist die Persistenz von Unit-Tests also nur von begrenztem Nutzen.Sie sollten immer Tests hinzufügen, die für die Zieldatenbank ausgeführt werden.

Für NHibernate, ich würde auf jeden Fall dafür plädieren, das einfach nur zu verspotten NHibernate API Vertrauen Sie bei Unit-Tests darauf, dass die Bibliothek das Richtige tut.Wenn Sie sicherstellen möchten, dass die Daten tatsächlich in die Datenbank gelangen, führen Sie einen Integrationstest durch.

Für JDBC-basierte Projekte kann mein Acolyte-Framework verwendet werden: http://acolyte.eu.org .Es ermöglicht den Mockup-Datenzugriff, den Sie testen möchten, und profitiert dabei von der JDBC-Abstraktion, ohne eine bestimmte Test-Datenbank verwalten zu müssen.

Ich würde auch die Datenbank verspotten und überprüfen, ob die Abfragen Ihren Erwartungen entsprechen.Es besteht die Gefahr, dass der Test das falsche SQL prüft, dies würde aber in den Integrationstests erkannt werden

Technisch gesehen sind Unit-Tests der Persistenz keine Unit-Tests, sondern Integrationstests.

Wenn C# mbUnit verwendet, verwenden Sie einfach die Attribute SqlRestoreInfo und RollBack

    [TestFixture]
    [SqlRestoreInfo(<connectionsting>, <name>,<backupLocation>]
    public class Tests
    {

        [SetUp]
        public void Setup()
        {

        }

        [Test]
        [RollBack]
        public void TEST()
        {
           //test insert. 
        }
    }

Das Gleiche kann in NUnit durchgeführt werden, mit der Ausnahme, dass sich die Attributnamen geringfügig unterscheiden.

Um zu überprüfen, ob Ihre Abfrage erfolgreich war, müssen Sie normalerweise eine zweite Abfrage anschließen, um zu sehen, ob die Datenbank wie erwartet geändert wurde.

Normalerweise erstelle ich ein Repository und verwende es zum Speichern meiner Entität und rufe dann ein neues ab.Dann behaupte ich, dass das Abgerufene dem Gespeicherten entspricht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top