sql server - Wie teste ich die Persistenz von Einheiten?

Translate

Als Anfänger in der Praxis der testgetriebenen Entwicklung gerate ich oft in ein Dilemma, wie man die Persistenz von Unit-Tests in einer Datenbank festlegt.

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

  1. Abfragen testen.
  2. Einsätze testen. Woher weiß ich, dass der Einsatz falsch gelaufen ist, wenn er fehlschlägt? Ich kann es testen, indem ich es einfüge und dann abfrage, aber woher weiß ich, dass die Abfrage nicht falsch war?
  3. Testen von Updates und Löschvorgängen - wie beim Testen von Beilagen

Was sind die Best Practices dafür?


Zum Testen von SQL: Ich bin mir bewusst, dass dies möglich ist, aber wenn ich einen O / R-Mapper wie NHibernate verwende, werden in den für die Ausgabeabfragen verwendeten Aliasnamen einige Namenswarzen angehängt, und da dies etwas unvorhersehbar ist, bin ich mir nicht sicher Ich könnte das testen.

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

This question and all comments follow the "Attribution Required."

Alle Antworten

Translate

Schauen Sie in die DB-Einheit. Es ist eine Java-Bibliothek, aber es muss ein C # -Äquivalent geben. Sie können die Datenbank mit einer Reihe von Daten vorbereiten, damit Sie wissen, was sich in der Datenbank befindet. Anschließend können Sie eine Schnittstelle mit DB Unit herstellen, um zu sehen, was sich in der Datenbank befindet. Es kann auf vielen Datenbanksystemen ausgeführt werden, sodass Sie Ihr eigentliches Datenbank-Setup oder etwas anderes wie HSQL in Java (eine Java-Datenbankimplementierung mit einer In-Memory-Option) verwenden können.

Wenn Sie testen möchten, ob Ihr Code die Datenbank ordnungsgemäß verwendet (was Sie höchstwahrscheinlich tun sollten), können Sie auf diese Weise jeden Test isolieren und sicherstellen, dass die Datenbank die erwarteten Daten vorbereitet hat.

Quelle
Translate

WieSagte Mike StoneDbUnit eignet sich hervorragend, um die Datenbank in einen bekannten Zustand zu versetzen, bevor Sie Ihre Tests ausführen. Wenn Ihre Tests abgeschlossen sind, kann DbUnit die Datenbank wieder in den Zustand versetzen, in dem sie sich vor dem Ausführen der Tests befand.

DbUnit (Java)

DbUnit.NET

Quelle
Translate

Sie führen den Komponententest durch, indem Sie die Datenbankverbindung verspotten. 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 zu diesem Zweck irrelevant.

Dies bedeutet natürlich, dass Ihr Test die Methode nicht wirklich überprüftfunktioniert, weil die SQL möglicherweise falsch ist. Hier setzen Integrationstests an. Dafür erwarte ich, dass jemand anderes eine gründlichere Antwort erhält, da ich mich gerade erst mit diesen selbst auseinandersetze.

Quelle
Translate

Ich habe hier einen Beitrag über geschriebenUnit-Test der Datenschichtwas genau dieses Problem abdeckt. Entschuldigung für den (beschämenden) Plug, aber der Artikel ist zu lang, um hier zu posten.

Ich hoffe das hilft dir - es hat in den letzten 6 Monaten bei 3 aktiven Projekten sehr gut für mich funktioniert.

Grüße,

Rob G.

Quelle
Translate

Das Problem, das ich beim Testen der Persistenz von Unit-Tests hatte, insbesondere ohne ORM und damit 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 entwickelt wurden und nur mit dieser Version erfolgreich sind. Sie werden das nie herausfinden, wenn Sie Ihre Datenbank verspotten. Meiner Meinung nach ist die Persistenz von Unit-Tests nur von begrenztem Nutzen. Sie sollten immer Tests hinzufügen, die für die Zieldatenbank ausgeführt werden.

Quelle
Translate

ZumNHibernateIch würde definitiv befürworten, nur das zu verspottenNHibernate APIVertrauen 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.

Quelle
Translate

Für JDBC-basierte Projekte kann mein Acolyte-Framework verwendet werden:http://acolyte.eu.org. Es ermöglicht das Modellieren des Datenzugriffs, den Sie testen möchten, und profitiert von der JDBC-Abstraktion, ohne dass eine bestimmte Test-DB verwaltet werden muss.

Quelle
Translate

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

Quelle
Dan
Translate

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

Bei C # mit mbUnit 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 gemacht werden, außer dass sich die Attributnamen geringfügig unterscheiden.

Um zu überprüfen, ob Ihre Abfrage erfolgreich war, müssen Sie normalerweise eine zweite Abfrage durchführen, um festzustellen, ob die Datenbank wie erwartet geändert wurde.

Quelle
Translate

Normalerweise erstelle ich ein Repository und verwende es, um meine Entität zu speichern und dann ein neues abzurufen. Dann behaupte ich, dass das Abgerufene gleich dem Gespeicherten ist.

Quelle