Ich habe diese Klasse, die ich mit TDD bauen wollte, aber ich scheiterte. Es ist eine ziemlich einfache Klasse namens SubMissions
, und es holt nur einige Daten aus einer SQL-Datenbank.
Also hat es Methoden wie getSubMissionForPage()
, getSubMissionFromId()
etc ..
Ich habe versucht, es mit TDD zu bauen. Mein erster Test enthielt einen Aufruf von getSubMissionPage()
, der nur dazu dient, Daten zurückzugeben. Also ist es verdammt schwer, diesen Test zum Scheitern zu bringen, da er alle Daten zurückgeben kann. Ich konnte keinen Weg finden, ihn zum Scheitern zu bringen.
Ich weiß, dass der Test fehlgeschlagen ist der erste Schritt, um zu wissen, was zu implementieren ist, aber was tun Sie, wenn es tatsächlich keine Möglichkeit gibt, einen Test zu versäumen?
Jedes Mal, wenn Sie sich auf eine externe Datenquelle verlassen, kann Ihr Test immer fehlschlagen. Was passiert, wenn die Verbindung zu Ihrer Datenbank unterbrochen wird? Was ist, wenn die Tabelle nicht existiert, von der Sie Daten abrufen möchten? Was ist, wenn die Daten, die Sie erhalten, nicht die Daten sind, die Sie erwarten?
Das Testen von Klassen, die mit DBs verbunden sind, ist ein wenig komplizierter als das Testen von HelloWorld.java, weil Sie einen Weg brauchen, die Datenbank zu verspotten . Sie können hier mehr über Mock Objects erfahren.
Kurze Antwort, Ihre Tests / Software können IMMER fehlschlagen. Wenn Sie nicht glauben, dass Ihr Test fehlschlagen kann, denken Sie nicht genug über den Problembereich nach.
Das Abrufen von einer Datenbank ist nicht der Ort, um mit TDD zu beginnen.
Es könnte gut sein, einige Beispiele von TDD im Netz zu betrachten. Bob Martins Bowling-Spiel-Scoring ist ein guter Anfang.
Das sagte ...
Mein erster Test enthielt einen Aufruf von getSubMissionPage (), der nur dazu dient, Daten zurückzugeben. Also ist es verdammt schwer, diesen Test zum Scheitern zu bringen, da er alle Daten zurückgeben kann. Ich konnte keinen Weg finden, ihn zum Scheitern zu bringen.
Der Zweck besteht nicht darin, Daten zurückzugeben, sondern die richtigen Daten zurückzugeben.
Der Weg, um einen Test dafür zu machen, besteht darin, es mit einer Datenbank zu versorgen, die es veranlassen sollte, ein spezifisches Ergebnis zurückzugeben und zu sehen, dass es tut. Und natürlich wird es nicht, bis Sie den richtigen Code schreiben, so schreiben Sie zuerst den Test und die reale Implementierung nach dem Scheitern.
Der schwierigste Teil von TDD mit einer Datenbank besteht darin, dass das Testen mit einer realen Datenbank langsam sein kann und die Wiederholbarkeit des Tests schwierig sein kann, da Ihre Tests manchmal die Daten ändern. Um mit diesen Problemen umzugehen, können Sie Hilfe von Tools wie DbUnit , JDBC-Jock-Version, eine In-Memory-Datenbank und Rollbacks für Stellen Sie sicher, dass Ihre Tests keine dauerhaften Änderungen vornehmen.
Aber Sie sind am besten mit Datenbank-Sachen nicht anzufangen.
Das Schöne an TDD ist, dass wenn Sie einen Test finden, der schwer zu schreiben ist, deutet dies auf ein mögliches Problem im Design hin. In diesem Fall die Abstraktion Ihrer Datenzugriffslogik.
Sie können beispielsweise Dependency Injection verwenden, um eine Schnittstelle an ein Datenzugriffs-Repository zu senden (mit einem Fake oder Mock in Ihrem Testfall), mit dem Sie Ihre Datenzugriffstests von Ihren Logiktests isolieren können. d. h., Sie erstellen ein SubmissionRepository, das den Datenzugriff abwickelt, und Ihre Submissions-Klasse verarbeitet die Geschäftslogik und ruft die grundlegenden Crud- und Shaping-Operationen in Ihr Repository auf.
Natürlich müssen Sie irgendwann einen Teil des Datenzugriffs als Teil eines Integrationstests testen, aber ich benutze immer die Übung, mit TDD zu beginnen, um mehr entkoppelte Designs zu unterstützen.
Lassen Sie die Methode eine RuntimeException auslösen, wenn der Test fehlschlagen soll. Eclipse füllt Methodenstubs mit einer geeigneten UnsupportedOperationException für Sie aus.
Um den Test grün zu machen, lassen Sie einfach die Methode null zurückgeben, anstatt zu werfen.
Stören Sie nicht die Verbindung mit der Datenbank, bis ein oder zwei zusätzliche Tests Sie dazu zwingen.
Nun. Es gibt ein paar Standard-Typen zu testen: Null und und leere Schnur in den Sinn. Wenn die Daten wirklich alles sein können, dann ist alles gültig.
Das Testen einer Datenbank ist wahrscheinlich nicht der beste Weg, um in TDD einzutauchen. Beginnen Sie mit einer Klasse, die keine Abhängigkeiten aufweist. Stellen Sie sich ein Schachspiel vor, Sie könnten Klassen wie:
habenIch würde mit Location beginnen, da es keine Abhängigkeiten hat, dann Square, da es nur von Location abhängt, dann Board, da es nur von Square abhängt.
'getSubMissionPage' soll nicht nur irgendwelche Daten zurückgeben - es soll eine spezifische Anfrage machen und dann auf der Basis der Anfrage etwas zurückgeben.
Sie müssen "SubMissions" so konfigurieren, dass eine Scheindatenquelle verwendet wird, und dann testen, dass die Klasse die Korrekturoptimierungen durchführt und die Daten den Objekten korrekt zuordnet.
Das Schöne an TDD ist, dass wenn Sie einen Test finden, der schwer zu schreiben ist, deutet dies auf ein mögliches Problem im Design hin. In diesem Fall die Abstraktion Ihrer Datenzugriffslogik.
Sie können beispielsweise Dependency Injection verwenden, um eine Schnittstelle an ein Datenzugriffs-Repository zu senden (mit einem Fake oder Mock in Ihrem Testfall), mit dem Sie Ihre Datenzugriffstests von Ihren Logiktests isolieren können. d. h., Sie erstellen ein SubmissionRepository, das den Datenzugriff abwickelt, und Ihre Submissions-Klasse verarbeitet die Geschäftslogik und ruft die grundlegenden Crud- und Shaping-Operationen in Ihr Repository auf.
Natürlich müssen Sie irgendwann einen Teil des Datenzugriffs als Teil eines Integrationstests testen, aber ich benutze immer die Übung, mit TDD zu beginnen, um mehr entkoppelte Designs zu unterstützen.
Das Abrufen von einer Datenbank ist nicht der Ort, um mit TDD zu beginnen.
Es könnte gut sein, einige Beispiele von TDD im Netz zu betrachten. Bob Martins Bowling-Spiel-Scoring ist ein guter Anfang.
Das sagte ...
Mein erster Test enthielt einen Aufruf von getSubMissionPage (), der nur dazu dient, Daten zurückzugeben. Also ist es verdammt schwer, diesen Test zum Scheitern zu bringen, da er alle Daten zurückgeben kann. Ich konnte keinen Weg finden, ihn zum Scheitern zu bringen.
Der Zweck besteht nicht darin, Daten zurückzugeben, sondern die richtigen Daten zurückzugeben.
Der Weg, um einen Test dafür zu machen, besteht darin, es mit einer Datenbank zu versorgen, die es veranlassen sollte, ein spezifisches Ergebnis zurückzugeben und zu sehen, dass es tut. Und natürlich wird es nicht, bis Sie den richtigen Code schreiben, so schreiben Sie zuerst den Test und die reale Implementierung nach dem Scheitern.
Der schwierigste Teil von TDD mit einer Datenbank besteht darin, dass das Testen mit einer realen Datenbank langsam sein kann und die Wiederholbarkeit des Tests schwierig sein kann, da Ihre Tests manchmal die Daten ändern. Um mit diesen Problemen umzugehen, können Sie Hilfe von Tools wie DbUnit , JDBC-Jock-Version, eine In-Memory-Datenbank und Rollbacks für Stellen Sie sicher, dass Ihre Tests keine dauerhaften Änderungen vornehmen.
Aber Sie sind am besten mit Datenbank-Sachen nicht anzufangen.
Ich habe diese Klasse, die ich mit TDD bauen wollte, aber ich scheiterte. Es ist eine ziemlich einfache Klasse namens %code% , und es holt nur einige Daten aus einer SQL-Datenbank.
Also hat es Methoden wie %code% , %code% etc ..
Ich habe versucht, es mit TDD zu bauen. Mein erster Test enthielt einen Aufruf von %code% , der nur dazu dient, Daten zurückzugeben. Also ist es verdammt schwer, diesen Test zum Scheitern zu bringen, da er alle Daten zurückgeben kann. Ich konnte keinen Weg finden, ihn zum Scheitern zu bringen.
Ich weiß, dass der Test fehlgeschlagen ist der erste Schritt, um zu wissen, was zu implementieren ist, aber was tun Sie, wenn es tatsächlich keine Möglichkeit gibt, einen Test zu versäumen?
Jedes Mal, wenn Sie sich auf eine externe Datenquelle verlassen, kann Ihr Test immer fehlschlagen. Was passiert, wenn die Verbindung zu Ihrer Datenbank unterbrochen wird? Was ist, wenn die Tabelle nicht existiert, von der Sie Daten abrufen möchten? Was ist, wenn die Daten, die Sie erhalten, nicht die Daten sind, die Sie erwarten?
Das Testen von Klassen, die mit DBs verbunden sind, ist ein wenig komplizierter als das Testen von HelloWorld.java, weil Sie einen Weg brauchen, die Datenbank zu verspotten . Sie können hier mehr über Mock Objects erfahren.
Kurze Antwort, Ihre Tests / Software können IMMER fehlschlagen. Wenn Sie nicht glauben, dass Ihr Test fehlschlagen kann, denken Sie nicht genug über den Problembereich nach.
Lassen Sie die Methode eine RuntimeException auslösen, wenn der Test fehlschlagen soll. Eclipse füllt Methodenstubs mit einer geeigneten UnsupportedOperationException für Sie aus.
Um den Test grün zu machen, lassen Sie einfach die Methode null zurückgeben, anstatt zu werfen.
Stören Sie nicht die Verbindung mit der Datenbank, bis ein oder zwei zusätzliche Tests Sie dazu zwingen.
'getSubMissionPage' soll nicht nur irgendwelche Daten zurückgeben - es soll eine spezifische Anfrage machen und dann auf der Basis der Anfrage etwas zurückgeben.
Sie müssen "SubMissions" so konfigurieren, dass eine Scheindatenquelle verwendet wird, und dann testen, dass die Klasse die Korrekturoptimierungen durchführt und die Daten den Objekten korrekt zuordnet.
Nun. Es gibt ein paar Standard-Typen zu testen: Null und und leere Schnur in den Sinn. Wenn die Daten wirklich alles sein können, dann ist alles gültig.
Das Testen einer Datenbank ist wahrscheinlich nicht der beste Weg, um in TDD einzutauchen. Beginnen Sie mit einer Klasse, die keine Abhängigkeiten aufweist. Stellen Sie sich ein Schachspiel vor, Sie könnten Klassen wie:
habenIch würde mit Location beginnen, da es keine Abhängigkeiten hat, dann Square, da es nur von Location abhängt, dann Board, da es nur von Square abhängt.
(1) und (2) waren nur Übungen, die Ihnen helfen sollten, sicher zu sein, dass der Test funktioniert.
Nun stellen Sie sich die Frage: Was könnte der Grund für einen Testversagen sein? Ich denke, dass in Ihrem Fall die Gründeliste wie folgt aussieht: 1. keine Verbindung zur DB 2. falsches DB-Schema 3. inkonsistente Daten
Hier sind die Möglichkeiten, diese Gründe zu simulieren: 1. Fahren Sie Ihre Datenbank herunter oder ändern Sie die Anmeldeinformationen / jdbc-URL, die Sie für die Verbindung verwenden. 2. Lassen Sie eine interessante Tabelle fallen oder ändern Sie die Namen ihrer Spalten. 3. Es ist ein bisschen schwierig, Daten inkonsistent zu machen. Dies tritt normalerweise auf, wenn DB-Einschränkungen nicht korrekt definiert sind. Manchmal machen es Leute, um das Schema generischer zu machen. Wenn es nicht Ihr Fall ist, vergessen Sie einfach # 3.
Viel Glück mit TDD! Ich glaube, dass Ihre Testszenarien in Zukunft anspruchsvoller werden.
Sie müssen keinen Test für jede einzelne Methode schreiben. Wenn Sie denken, dass ein Test zu einfach ist, können Sie entscheiden, keinen Test dafür zu schreiben. Einige werden argumentieren, dass Sie noch einen Test schreiben sollten, aber ich denke, dass es Fälle gibt, in denen Sie nicht müssen.
Sehen Sie sich diese JUnit-FAQ an: Ссылка
(1) und (2) waren nur Übungen, die Ihnen helfen sollten, sicher zu sein, dass der Test funktioniert.
Nun stellen Sie sich die Frage: Was könnte der Grund für einen Testversagen sein? Ich denke, dass in Ihrem Fall die Gründeliste wie folgt aussieht: 1. keine Verbindung zur DB 2. falsches DB-Schema 3. inkonsistente Daten
Hier sind die Möglichkeiten, diese Gründe zu simulieren: 1. Fahren Sie Ihre Datenbank herunter oder ändern Sie die Anmeldeinformationen / jdbc-URL, die Sie für die Verbindung verwenden. 2. Lassen Sie eine interessante Tabelle fallen oder ändern Sie die Namen ihrer Spalten. 3. Es ist ein bisschen schwierig, Daten inkonsistent zu machen. Dies tritt normalerweise auf, wenn DB-Einschränkungen nicht korrekt definiert sind. Manchmal machen es Leute, um das Schema generischer zu machen. Wenn es nicht Ihr Fall ist, vergessen Sie einfach # 3.
Viel Glück mit TDD! Ich glaube, dass Ihre Testszenarien in Zukunft anspruchsvoller werden.