TDD: Wie kann ich eine Suche testen?

8

Meine Website wird eine erweiterte Suche haben. Leute können dort hingehen und nach einem Objekt suchen (zum Beispiel Autos). Ich habe einige Tests erstellt, die die Anzahl der Ergebnisse basierend auf den Suchparametern überprüfen. Ich denke darüber nach, welche Tests ich schreiben soll, dann schreibe ich es, dann füge ich Daten in die Testdatenbank ein. Aber hier kommt das Problem. Wenn ich neue Werte in die Datenbank einfüge, brechen meine alten Tests ab. Das liegt daran, dass ich die Anzahl der Datensätze überprüfe ...

%Vor%

Ist das normal? Sollten meine alten Tests brechen, wenn ich neue Tests erstelle?

Sollen meine Tests an Daten gebunden sein?

Meine Suche hat zu viele Parameter und sie werden in derselben Form (Ansicht) verwendet. Soll ich Tests erstellen, die nach jedem Parameter suchen, oder soll ich sie zusammen testen? Soll ich es in mehr Testklassen aufteilen?

Danke.

    
thom 13.09.2011, 23:12
quelle

5 Antworten

6

Wenn Sie einen Komponententest mit einer Datenbank durchführen, sollte der Test die tatsächliche Datenbank enthalten, gegen die er getestet wird. Es könnte sich um eine einfache Datenbank handeln, die nur für den Test relevante Werte enthält, z. B. eine Zeile, die übereinstimmt, und eine Zeile, die nicht übereinstimmt. Es ist auch sinnvoll, eine Reihe von Tests mit einem Snapshot der Live-Datenbank zu erstellen, wie er zu einem bestimmten Zeitpunkt existierte.

Eine besonders praktische Möglichkeit, dies zu erreichen, ist uns eine Sqlite3-Datenbank speziell für den Test zu erstellen und Ihre Anwendung so einzustellen, dass sie diese für den Test verwendet.

    
quelle
1

Wenn möglich, sollten Sie die Verbindung zwischen dem Code, mit dem Ihre Daten abgerufen werden, und der Datenbank selbst trennen. Ihre Komponententests sollten nicht von der Datenbank abhängen, und Sie sind auf einige Gründe gestoßen, warum: Sie müssen Ihre Daten über mehrere Tests hinweg pflegen, indem Sie neue Tests erstellen, bei denen andere Fehler verursachen, und so weiter. Wenn Sie den Datenzugriffspunkt irgendwie vortäuschen und Daten streng im Speicher zurückgeben könnten, wäre das der ideale Fall. Ich weiß nicht, wie einfach es in PHP sein würde, aber eine Schnittstelle zu Ihrem Datenzugriffscode aufzubauen und eine falsche / verspottete Implementierung dieser Schnittstelle zu verwenden, könnte einen großen Beitrag dazu leisten, dieses Ziel zu erreichen.

    
Scott 14.09.2011 00:21
quelle
1

Kurz gesagt:
Keine Möglichkeit, dies in einer Live-Datenbank zu tun

Sie benötigen eine separate Datenbank für Tests. Dies kann tatsächlich eine Kopie der Datenbank sein.

Vor den Tests müssen Sie dann die Datenbank so vorbereiten, dass sie sich im festen Status befindet, den Sie erwarten (z. B. Laden von Daten von Fixtures oder Importieren der SQL-Datei).

Die beste Option ist dann die Datenbanktransaktion , wenn Sie Änderungen am ursprünglichen Datenbankzustand vornehmen möchten.

Sobald die Transaktion gestartet wurde, können Sie an der Datenbank arbeiten.

Nachdem Sie die Tests abgeschlossen haben, müssen Sie die Transaktion einfach zurücksetzen und die Datenbank im sauberen Zustand haben.

SQLite (bereits erwähnt) wird in den meisten Fällen gut funktionieren, aber es kann von der Live-Datenbank abweichen. Wie auch immer, mit verschiedenen Datenbank Adaptern wird es sehr hilfreich sein.

    
takeshin 14.09.2011 16:14
quelle
0

Ihre Tests sollten nicht brechen, wenn Sie neue Tests erstellen, und Ihre Tests sollten nicht datenabhängig sein. Ein Test, der bestimmte Daten in der Datenbank erfordert, sollte diese Daten in die Datenbank einfügen. Und wenn es keine anderen Daten in der Datenbank benötigt, sollte alles andere gelöscht werden.

Dies wird natürlich Ihre Tests verlangsamen - also die Datenzugriffsebene überspielen.

    
Carl Manaster 13.09.2011 23:20
quelle
0

Ich würde jede Testmethode ihre eigenen Daten erstellen lassen, dann ihre eigenen Beispieldaten verfolgen, behaupten und dann zerstören.

Ich habe normalerweise eine shared addData () -Methode und dann eine Datenbankbereinigungsmethode. Hoffentlich werden Sie in der Lage sein, Ihre hinzugefügten Daten auf irgendeine Weise identifizierbar zu machen, so dass Ihre Bereinigungsmethode generisch sein kann. In Ihrem Beispiel könnten Sie vielleicht alle Ihre brandId mit "test-" beginnen, und dann würde Ihre Abfrage alle Datensätze suchen und löschen, wo die brandId wie "test -%" gefällt.

    
Mike Hedman 14.09.2011 02:54
quelle

Tags und Links