Wie der Kopf sagt, nachdem ich einige Zeilen (nur zum Testen) in die Datenbank in einer Unit-Test-Funktion eingefügt habe, stelle ich derzeit eine Abfrage am Ende von die Funktion, um diese manuell zu entfernen, aber ich glaube, das ist nicht die beste Vorgehensweise zu tun. Also was ist das?Was ist die beste Methode zum Reinigen von Daten nach dem Einfügen für einen Komponententest
Antwort
Nun, bei der Arbeit an Data Fixtures ist vielleicht die beste Option setUp()
und tearDown()
Methoden zu implementieren.
Wenn Sie externe Ressourcen wie Dateien, Datenbanken oder Sockets zugewiesen haben, scheint tearDown()
Methode der beste Weg zu gehen.
Von PHPUnit docs:
setUp() und tearDown() sind in der Theorie schön symmetrisch, aber nicht in Praxis. In der Praxis müssen Sie nur tearDown() implementieren, wenn Sie in setUp() externe Ressourcen wie Dateien oder Sockets zugewiesen haben. Wenn Ihre setUp() nur einfache PHP-Objekte erstellt, können Sie allgemein ignorieren tearDown(). Wenn Sie jedoch viele Objekte in Ihrer setUp() erstellen, möchten Sie möglicherweise die Variablen aufheben, die auf diese Objekte in Ihrer tearDown() zeigen, so dass sie Garbage Collected sein können. Die Speicherbereinigung von Testfallobjekten ist nicht vorhersehbar.
Sie können weitere Informationen Daten-Befestigungen in Chapter 4. Fixtures erhalten:
"Best practice" ist immer eine subjektive Anfrage. Es ist wahrscheinlich nicht die beste Praxis, echte Dienste zu nutzen, aber ich tue es, weil es realistisch ist, dass es für mich am besten funktioniert. Durch die Verwendung von echten Diensten teste ich tatsächlich gegen alle Arten von datenbankspezifischen Minutien (wie Fremdschlüsseleinschränkungen, Trigger usw.).
Sie könnten eine Datenbanktransaktion erstellen, Ihre SQL-Abfragen ausführen und dann die Transaktion zurücksetzen. Aber um dies zu tun, müssen Sie zwei Annahmen:
- , dass Sie keine Logik von Auto-Increment-Felder impliziert (wie sollten Sie bereits tun, sowieso)
- , dass Sie nicht auf der Bühne SQL-Abfragen im Rahmen einer Transaktion, die implizite Commits ausführen. Implizite Commits können nicht zurückgesetzt werden.
Implizite Commits für MySQL sind, according to its documentation wie folgt:
'ALTER TABLE', 'CREATE INDEX', 'DROP INDEX', 'DROP TABLE', ‚RENAME TABLE ‘ 'CREATE TABLE' 'CREATE DATABASE' 'DROP DATABASE' 'TRUNCATE TABLE', 'ALTER PROCEDURE' 'CREATE PROCEDURE' 'PROCEDURE', 'ALTER FUNCTION', 'CREATE FUNCTION', 'DROP FUNCTION', 'ALTER VIEW', 'CREATE TRIGGER', 'CREATE VIEW', 'DROP TRIGGER', ‚DROP VIEW‘, 'CREATE USER', 'DROP USER', 'RENAME USER'
- 1. Was ist die beste Methode zum Speichern/Berechnen von Benutzerbewertungen?
- 2. Was ist die beste Methode zum Indizieren von eindeutigen Textfeldern?
- 3. Was ist die beste Methode zum Erstellen von ClickOnce-Bereitstellungen?
- 4. Was ist die beste Methode zum Einstellen von Bildquellen?
- 5. Was ist die beste Methode zum Aufräumen von CSS?
- 6. Was ist die beste Ressource für JSON für einen Anfänger
- 7. Was ist die beste Data-Mining-Methode für die Fahrzeugsuche?
- 8. Was ist die beste Methode zum Speichern/Abrufen von Daten für einen Desktop ohne Verwendung einer Datenbank?
- 9. Die beste Methode zum Floaten?
- 10. Die beste Methode zum Extrahieren von Daten aus einer Zeichenfolge
- 11. Was ist die beste Methode zum dynamischen Sandbox-Inline-JavaScript?
- 12. NACH EINFÜGEN Trigger zum Einfügen von Daten in eine andere Tabelle nach dem Einfügen in die ursprüngliche Tabelle
- 13. Beste Methode zum Speichern von Daten für Greasemonkey-basierte Crawler?
- 14. Die beste Methode zum Kopieren von HTML-Dateien nach wwwroot?
- 15. Beste Methode zum Senden von Daten über Geräte? (Android)
- 16. Was ist die beste Methode zum Erstellen von "ummauerten Gärten" für mehrere Clients in Ihrer Datenbank?
- 17. Was ist die beste Methode zum Verwalten von SQL-Änderungsskripten für zwei Entwickler?
- 18. Was ist die beste Datenstruktur (Container) für schnelles Einfügen/Löschen von Elementen nach Index?
- 19. Die beste Methode zum Abfragen von Speicherplatz auf dem Remoteserver
- 20. Was ist die beste Methode, um einen FileSystemWatcher-Fehler wiederherzustellen?
- 21. Was ist die beste Datenstruktur zum Speichern von Objekten, die nach Datum indiziert sind?
- 22. Beste Methode zum Sammeln und Importieren von Daten in drupal?
- 23. Was ist die beste Methode zum Speichern von Testfällen, aus denen Ihre xunit-Tests geladen werden?
- 24. Was ist die beste Java-Methode zum Erstellen von JSON/XML-REST-Webdiensten, die WCF ähnelt?
- 25. Eine Listview für Daten reinigen
- 26. Beste Methode zum Abrufen von Daten in XPages und Java
- 27. Was ist die beste reaktionsfähige Methode für HTML-Vorlage
- 28. Was ist die beste Praxis zum Schließen von Ressourcen?
- 29. Die beste Methode zum Speichern von Dateien
- 30. Der beste Weg zum Komponententest Sammlung?
Unit-Tests sollten mit echten Dienste normalerweise nicht in Wechselwirkung treten: die übliche Praxis * mock sie ist * statt. – eggyal
Ruby on Rails verwendet Transaktionen, um Änderungen rückgängig zu machen, die während des Tests vorgenommen wurden. – tadman
Ehrlich gesagt bevorzuge ich die Interaktion mit realen Diensten, da es eher ein genauer "Test" ist - und da Rollback-Transaktionen nur Autoinkremente beeinflussen und Autoinkremente niemals eine Logik haben sollten, rationalisiere ich, dass es in Ordnung ist Starten Sie eine Transaktion, führen Sie einen Test durch, und führen Sie dann die Transaktion am Ende der Transaktion zurück. Achten Sie nur auf SQL-Abfragen, die Transaktionen durch Auslösen impliziter Commits (wie "ALTER") unterbrechen. Aber während ich das tue, bin ich mir nicht sicher, ob es das beste Verfahren ist. –