Wie kann ich Unit-Test Ausdauer?

stimmen
43

Als Neuling in der testgetriebenen Entwicklung zu üben, habe ich am Ende oft in einem Dilemma nach oben, wie zum Unit-Test-Persistenz in einer Datenbank.

Ich weiß, dass dies technisch ein Integrationstest (kein Unit-Test) sein würde, aber ich möchte die besten Strategien für die folgenden, um herauszufinden:

  1. Testen Abfragen.
  2. Testen Einsätze. Wie weiß ich, dass der Einsatz, die schief gegangen ist, wenn es nicht funktioniert? Ich kann es testen, indem Sie Einfügen und dann abfragen, aber wie kann ich wissen, dass die Abfrage nicht falsch war?
  3. Testen Aktualisierungen und Löschungen - wie Testeinsätze

Was sind die besten Praktiken diese zu tun?


In Bezug auf Test SQL: Ich bin mir bewusst, dass dies geschehen könnte, aber wenn ich eine O / R-Mapper wie NHibernate verwende, fügt es einige Namen Warzen in den Aliasnamen für die Ausgabe-Abfragen verwendet, und wie etwas unberechenbar ist, ich bin nicht sicher, ich konnte für das testen.

Soll ich alles nur, verlassen und einfach NHibernate vertrauen? Ich bin mir nicht sicher, das ist klug.

Veröffentlicht am 05/08/2008 um 10:43
quelle vom benutzer
In anderen Sprachen...                            


10 antworten

stimmen
16

Schauen Sie in DB Einheit. Es ist eine Java-Bibliothek, aber es muss eine C # gleichwertig sein. Damit können Sie die Datenbank mit einem Satz von Daten vorbereiten, damit Sie wissen, was in der Datenbank vorhanden ist, dann können Sie mit der DB Unit Interface zu sehen, was in der Datenbank ist. Es kann viele Datenbanksysteme läuft gegen, so können Sie Ihren aktuellen Datenbank-Setup verwenden, oder sonst etwas verwenden, wie HSQL in Java (Java-Datenbank-Implementierung mit einem in Speicher-Option).

Wenn Sie testen möchten, dass Ihr Code die Datenbank ordnungsgemäß verwendet (die Sie wahrscheinlich tun sollte), dann ist dies der Weg zu gehen, um jeden Test zu isolieren und die Datenbank sicherzustellen, hat Daten vorbereitet erwartet.

Beantwortet am 11/08/2008 um 10:40
quelle vom benutzer

stimmen
15

Als Mike Stone sagte , ist DbUnit groß für die Datenbank in einen bekannten Zustand bekommen , bevor die Tests ausgeführt werden . Wenn die Tests abgeschlossen sind, können DbUnit die Datenbank in den Zustand versetzt zurück in es war , bevor Sie die Tests lief.

DbUnit (Java)

DbUnit.NET

Beantwortet am 25/08/2008 um 14:22
quelle vom benutzer

stimmen
4

Sie haben die Unit-Tests durch die Datenbankverbindung spöttisch aus. Auf diese Weise können Sie Szenarien bauen, wo bestimmte Abfragen in den Ablauf eines Verfahrens Aufruf Erfolg haben oder scheitern. Ich in der Regel meine Mock Erwartungen bauen, so dass der eigentliche Abfrage Text ignoriert wird, weil ich die Fehlertoleranz des Verfahrens wirklich testen will und wie sie selbst behandelt - die Besonderheiten der SQL sind zu diesem Zweck irrelevant.

Offensichtlich ist dies bedeutet , dass Ihr Test nicht wirklich überprüfen, ob die Methode funktioniert , weil die SQL falsch sein kann. Dies ist , wo Integrationstests in kicken. Dafür erwarte ich , dass jemand anderes eine gründlichere Antwort haben, wie ich gerade fange an mit denen ich in den Griff zu bekommen.

Beantwortet am 05/08/2008 um 10:47
quelle vom benutzer

stimmen
3

Ich habe einen Beitrag hier über schriftliche Einheit Testen der Datenschicht , die genau dieses Problem abdeckt. Wir entschuldigen uns für die (beschämend) Stecker, aber der Artikel ist zu lang , um hier zu posten.

Ich hoffe, das hilft Ihnen - es ist für mich sehr gut in den letzten 6 Monaten auf 3 aktiven Projekten gearbeitet hat.

Grüße,

Rob G

Beantwortet am 13/08/2008 um 00:23
quelle vom benutzer

stimmen
2

Bei JDBC - basierten Projekten können Acolyte Framework verwendet werden: http://acolyte.eu.org . Es ermöglicht den Datenzugriff Sie Tests Mockup wollen, von JDBC Abstraktion profitieren, ohne einen spezifischen Test DB verwalten zu müssen.

Beantwortet am 09/07/2014 um 10:20
quelle vom benutzer

stimmen
2

Denn NHibernate, würde ich befürworten spöttisch aus auf jeden Fall nur die NHibernate APIfür Unit - Tests - die Bibliothek vertrauen , das Richtige zu tun. Wenn Sie sicherstellen möchten , dass die Daten tatsächlich auf die DB geht, tun einen Integrationstest.

Beantwortet am 05/08/2008 um 12:20
quelle vom benutzer

stimmen
2

Das Problem, das ich erleben, als Unit-Tests Ausdauer, vor allem ohne ORM und Ihre Datenbank so spöttisch (Verbindung), ist, dass Sie nicht wirklich wissen, ob Ihre Anfragen erfolgreich zu sein. Es könnte sein, dass Sie Ihre Anfragen speziell für eine bestimmte Datenbank-Version ausgelegt sind und nur mit dieser Version folgen. Sie werden nie herausfinden, ob Sie Ihre Datenbank verspotten. Also meiner Meinung nach, Unit-Tests Persistenz ist nur von begrenztem Nutzen. Sie sollten immer Tests gegen die gezielte Datenbank ausgeführt wird hinzufügen.

Beantwortet am 05/08/2008 um 11:29
quelle vom benutzer

stimmen
1

Ich schaffe in der Regel ein Repository und verwenden, dass meine Einheit zu retten, dann ein frisches abrufen. Dann behaupte ich, dass die gleich den gespeicherten abgerufen wird.

Beantwortet am 27/08/2008 um 22:17
quelle vom benutzer

stimmen
1

Technisch Unit-Tests von persistance sind nicht Unit-Tests sind sie Integrationstests.

Mit C # MbUnit, verwenden Sie einfach die SqlRestoreInfo und Attribute Rollback

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

        [SetUp]
        public void Setup()
        {

        }

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

Das gleiche gilt in NUnit erfolgen, excpet die Attributnamen slighty unterscheiden.

Wie für die Überprüfung, ob Ihre Anfrage succeful war, müssen Sie in der Regel mit einer zweiten Abfrage folgen, um zu sehen, ob die Datenbank geändert wurde, wie erwartet.

Beantwortet am 05/08/2008 um 12:27
quelle vom benutzer

stimmen
1

Ich würde spotten auch die Datenbank, und überprüfen, ob die Abfragen sind, was Sie erwartet. Es besteht die Gefahr, dass der Test die falsche SQL überprüft, aber dies würde in den Integrationstests nachgewiesen werden

Beantwortet am 05/08/2008 um 11:19
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more