database - Wie teste ich Webcode?

Translate

Hat jemand gute Tipps zum Schreiben von Testcode für die Datenbank-Backend-Entwicklung, bei der eine starke Abhängigkeit vom Status besteht?

Insbesondere möchte ich Tests für Code schreiben, die Datensätze aus der Datenbank abrufen. Die Antworten hängen jedoch von den Daten in der Datenbank ab (die sich im Laufe der Zeit ändern können).

Erstellen Benutzer normalerweise ein separates Entwicklungssystem mit einer "eingefrorenen" Datenbank, sodass eine bestimmte Funktion immer genau dieselbe Ergebnismenge zurückgeben sollte?

Ich bin mir ziemlich sicher, dass dies kein neues Thema ist, daher wäre ich sehr daran interessiert, aus den Erfahrungen anderer zu lernen.

Gibt es gute Artikel, die dieses Problem der webbasierten Entwicklung im Allgemeinen behandeln?

Normalerweise schreibe ich PHP-Code, aber ich würde erwarten, dass all diese Probleme weitgehend sprach- und rahmenunabhängig sind.

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

Alle Antworten

Translate

Sie sollten sich DBUnit ansehen oder versuchen, ein PHP-Äquivalent zu finden (es muss eines geben). Sie können es verwenden, um die Datenbank mit einem bestimmten Datensatz vorzubereiten, der Ihre Testdaten darstellt. Daher hängt jeder Test nicht mehr von der Datenbank und einem vorhandenen Status ab. Auf diese Weise ist jeder Test in sich geschlossen und wird bei weiterer Datenbanknutzung nicht unterbrochen.

Update: Eine schnelle Google-Suche zeigte aDB-Einheitenerweiterungfür PHPUnit.

Quelle
Translate

Wenn Sie sich hauptsächlich mit dem Testen von Datenschichten befassen, sollten Sie dieses Buch lesen:xUnit-Testmuster: Refactoring-Testcode. Ich war mir selbst immer unsicher, aber dieses Buch leistet hervorragende Arbeit, um die Bedenken wie Leistung, Reproduzierbarkeit usw. aufzuzählen.

Quelle
Translate

Ich denke, es hängt davon ab, welche Datenbank Sie verwenden, aber Red Gate (www.red-gate.com) stellt ein Tool namens SQL Data Generator her. Dies kann so konfiguriert werden, dass Ihre Datenbank mit vernünftig aussehenden Testdaten gefüllt wird. Sie können ihm auch sagen, dass er immer den gleichen Startwert in seinem Zufallszahlengenerator verwenden soll, damit Ihre 'zufälligen' Daten jedes Mal gleich sind.

Sie können dann Ihre Komponententests schreiben, um diese zuverlässigen, wiederholbaren Daten zu verwenden.

Zum Testen der Webseite beschäftige ich mich derzeit mit Selen (selenium.openqa.org). Dies scheint eine browserübergreifende Testsuite zu sein, mit der Sie die Funktionalität testen können. Wie bei all diesen Website-Testtools gibt es jedoch keine echte Möglichkeit, zu testen, wie gut diese Dinge sindaussehenin allen Browsern, ohne ein menschliches Auge auf sie zu werfen!

Quelle
Translate

Wir verwenden eine In-Memory-Datenbank (hsql:http://hsqldb.org/). Ruhezustand (http://www.hibernate.org/) macht es uns leicht, unsere Unit-Tests auf die Test-Datenbank zu richten, mit dem zusätzlichen Bonus, dass sie blitzschnell laufen.

Quelle
Translate

Ich habe genau das gleiche Problem mit meiner Arbeit und finde, dass die beste Idee darin besteht, ein PHP-Skript zu haben, um die Datenbank neu zu erstellen, und dann ein separates Skript, in dem ich verrückte Daten darauf werfe, um zu sehen, ob es kaputt geht.

Ich habe noch nie Unit-Tests oder ähnliches verwendet und kann daher nicht sagen, ob es funktioniert oder nicht.

Quelle
Translate

Wenn Sie die Datenbank vor dem Ausführen der Tests mit einer bekannten Menge einrichten und am Ende abreißen können, wissen Sie, mit welchen Daten Sie arbeiten.

Dann können Sie so etwas wie Selenium verwenden, um einfach von Ihrer Benutzeroberfläche aus zu testen (vorausgesetzt, hier wird webbasiert, aber es gibt viele UI-Testtools für andere Benutzeroberflächen-Varianten) und das Vorhandensein bestimmter Datensätze zu erkennen, die aus der Datenbank zurückgezogen wurden.

Es lohnt sich auf jeden Fall, entweder eine Testversion der Datenbank einzurichten oder Ihre Testskripte im Rahmen der Tests die Datenbank mit bekannten Daten füllen zu lassen.

Quelle
Translate

Du könntest es versuchenhttp://selenium.openqa.org/Es ist eher für GUI-Tests als für eine Anwendung zum Testen von Datenschichten gedacht, zeichnet jedoch Ihre Aktionen auf, die dann wiedergegeben werden können, um Tests auf verschiedenen Plattformen zu automatisieren.

Quelle
Translate

Hier ist meine Strategie (ich verwende JUnit, aber ich bin sicher, dass es eine Möglichkeit gibt, das Äquivalent in PHP zu erreichen):

Ich habe eine Methode, die vor allen Unit-Tests für eine bestimmte DAO-Klasse ausgeführt wird. Es versetzt die Entwicklungsdatenbank in einen bekannten Zustand (fügt alle Testdaten usw. hinzu). Während ich Tests durchführe, verfolge ich alle Daten, die dem bekannten Status hinzugefügt wurden. Diese Daten werden am Ende jedes Tests bereinigt. Nachdem alle Tests für die Klasse ausgeführt wurden, entfernt eine andere Methode alle Testdaten in der Entwicklungsdatenbank und belässt sie in dem Zustand, in dem sie sich vor der Ausführung der Tests befanden. Es ist ein bisschen Arbeit, all dies zu tun, aber normalerweise schreibe ich die Methoden in eine DBTestCommon-Klasse, in die alle meine DAO-Testklassen gelangen können.

Quelle
Translate

Ich würde vorschlagen, drei Datenbanken zu verwenden. Eine Produktionsdatenbank, eine Entwicklungsdatenbank (gefüllt mit einigen aussagekräftigen Daten für jeden Entwickler) und eine Testdatenbank (mit leeren Tabellen und möglicherweise einigen Zeilen, die immer benötigt werden).

Eine Möglichkeit zum Testen des Datenbankcodes ist:

  1. Fügen Sie einige Zeilen (mit SQL) ein, um den Status zu initialisieren
  2. Führen Sie die Funktion aus, die Sie testen möchten
  3. Vergleichen Sie die erwarteten mit den tatsächlichen Ergebnissen. Hier können Sie Ihr normales Unit-Testing-Framework verwenden
  4. Bereinigen Sie die geänderten Zeilen (damit beim nächsten Lauf der vorherige Lauf nicht angezeigt wird)

Die Bereinigung kann auf standardmäßige Weise (natürlich nur in der Testdatenbank) mit durchgeführt werdenDELETE * FROM table.

Quelle
Translate

Im Allgemeinen stimme ich Peter zu, aber zum Erstellen und Löschen von Testdaten würde ich SQL nicht direkt verwenden. Ich bevorzuge die Verwendung einer CRUD-API, die im Produkt verwendet wird, um Daten zu erstellen, die der Produktion so ähnlich wie möglich sind ...

Quelle