Soll ich schreiben von Unit-Tests für CRUD-Operationen, wenn ich bereits die Integration-Tests?
In unserem letzten Projekt Sonar beschwerte sich über eine schwache test-coverage. Wir bemerkten, dass es nicht der Meinung integration-tests standardmäßig. Neben der Tatsache, dass Sie können konfigurieren, Sonar, es wird also betrachten Sie (JaCoCo-plugin), wir diskutieren über die Frage, in unser team, wenn es wirklich das Bedürfnis zu schreiben Unit-Tests, wenn Sie decken alle service-und Datenbank-Ebene mit integration tests sowieso.
Was meine ich mit integration-tests ist, dass alle unsere tests, die gegen eine dedizierte Oracle-Instanz des gleichen Typs, die wir verwenden in der Produktion. Wir verspotten Sie nicht alles. Wenn ein Dienst abhängig ist, ein weiterer service, den wir verwenden, der eigentliche Dienst. Daten, die wir benötigen, bevor Sie einen test konstruieren wir durch einige factory-Klassen, die unsere Dienste nutzen/Repositories (DAOs).
Also aus meiner Sicht - das schreiben von Integrations-tests für einfache CRUD-Operationen insbesondere bei der Verwendung von frameworks wie Spring Data/Hibernate ist kein großer Aufwand. Manchmal ist es sogar einfacher, weil Sie nicht denken, was und wie es zu verspotten.
Also wieso sollte ich das schreiben von Unit Tests für meine CRUD-Operationen, sind weniger zuverlässig als die Integration-Tests, die ich schreiben kann?
Der einzige Punkt den ich sehe, ist, dass die integration der tests mehr Zeit in Anspruch nehmen, zu laufen, je größer das Projekt wird. So dass Sie nicht wollen, um Sie laufen alle vor dem check-in. Aber ich bin mir nicht so sicher, ob das so schlimm ist, wenn Sie eine CI-Umgebung mit Jenkins/Hudson, die den job machen.
So irgendwelche Meinungen oder Vorschläge werden sehr geschätzt!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn die meisten Ihrer Dienste einfach durchlassen, um Ihre daos und Ihre daos wenig tun, aber Methoden aufgerufen werden, die auf Spring
HibernateTemplate
oderJdbcTemplate
dann Sie sind richtig, dass unit-tests nicht wirklich etwas beweisen, dass Ihre integration tests bereits beweisen. Allerdings mit unit-tests vorhanden sind wertvoll für alle üblichen Gründen.Da unit tests nur zum testen einzelner Klassen, im Speicher ausgeführt, mit keine Festplatten-oder Netzwerk-Zugang, und nie wirklich testen mehrere Klassen gemeinsam, Sie gehen in der Regel wie diese:
Unit-Tests der service, der einfach nur durchläuft, um das dao, können Sie mock so:
Aber ist das wirklich eine gute Idee? Diese Mockito Behauptungen sind zu behaupten, dass eine dao-Methode genannt habe, nicht, dass es Tat, was erwartet wurde! Sie erhalten Ihren Versicherungsschutz zahlen, aber Sie sind mehr oder weniger verbindlich Ihre tests, um eine Implementierung des dao. Autsch.
Nun dieses Beispiel angenommen, dass der service hatte keine wirkliche business-Logik. Normalerweise werden die Dienstleistungen haben, die business-Logik in addtion zu dao nennt, und Sie werden sicherlich müssen diese testen.
Nun, für unit-testing, daos, ich möchte eine eingebettete Datenbank.
Ich noch nennen dies ein unit-test auch wenn die meisten Menschen nennen könnte es ein integration-test. Die embedded-Datenbank befindet sich im Speicher, und es ist und brachte nach unten, wenn die tests ausgeführt werden. Aber dies beruht auf der Tatsache, dass die eingebettete Datenbank sieht genauso aus, wie die Produktion-Datenbank. Wird das der Fall sein? Wenn nicht, dann ist all die Arbeit war ziemlich nutzlos. Wenn dem so ist, dann, wie Sie sagen, diese tests sind dabei nichts anderes als die integration-tests. Aber ich kann Ihnen auf Nachfrage mit
mvn test
und ich habe das Vertrauen zu überarbeiten.Deshalb Schreibe ich diese unit-tests sowieso und treffen meiner Berichterstattung Ziele. Wenn ich Schreibe, integration tests, die ich geltend machen, dass eine HTTP-Anforderung gibt den erwarteten HTTP-Antwort. Ja, es fasst die unit-tests, aber hey, wenn Sie üben, TDD haben Sie die unit-tests geschrieben, bevor der eigentliche dao-Implementierung sowieso.
Beim schreiben von unit-tests nach der dao, dann kann man Sie natürlich auch keinen Spaß zu schreiben. Die TDD-Literatur ist voll von Warnungen darüber, wie das schreiben von tests nach Ihren code fühlt sich an wie Arbeit und niemand will es tun.
TL;DR: der Integrationstests wird, subsumieren Ihre unit-tests und in diesem Sinne die unit-tests sind nicht das hinzufügen einer echten Prüfung Wert. Allerdings, wenn Sie haben eine hohe Deckkraft unit test suite haben Sie das Vertrauen zu überarbeiten. Aber natürlich, wenn die dao ist trivial Aufruf von Spring data access-Vorlage, dann können Sie nicht die Umgestaltung. Aber man weiß ja nie. Und schließlich, obwohl, wenn die unit-tests geschrieben werden zuerst in TDD-Stil, die Sie haben Sie trotzdem.
Sie nur wirklich brauchen, um den unit-test jede Schicht isoliert, wenn Sie planen, um die Ebenen ausgesetzt, die andere Komponenten aus Ihrem Projekt. Für eine web-app, die einzige Möglichkeit, die der repository-Schicht aufgerufen werden kann, ist durch die services-Schicht, und die einzige Möglichkeit die service-Ebene aufgerufen werden können, ist von der controller-Schicht. So können die Tests beginnen und enden an der controller-Schicht. Die hintergrund-tasks, diese sind aufgerufen, in der service-Schicht, so müssen hier überprüft werden.
Tests mit einer realen Datenbank ist ziemlich schnell in diesen Tagen, so nicht langsam Ihre tests nach unten zu viel, wenn Sie entwerfen Sie Ihre setup/tear down gut. Allerdings, wenn es irgendwelche anderen Abhängigkeiten, die könnten langsam sein, oder problematisch, dann sollten diese verspottet/Stubs.
Dieser Ansatz wird Ihnen:
Allerdings testen Lagen in der isolation nicht erlauben Ihrem team, mehr zu arbeiten und gleichzeitig so eine dev tun können, repository und andere können tun, service für Sie, ein Stück Funktionalität und produzieren unabhängig getestet, funktioniert.
Es wird immer die doppelte Reichweite, wenn Selen/funktionalen tests werden berücksichtigt, soweit Sie nicht verlassen sich auf diese allein, da Sie zu langsam laufen. Allerdings, funktionale tests nicht unbedingt brauchen, um alle code -, Kern-Funktionalität allein kann ausreichend sein, sofern der code wurde bedeckt von unit - /integration-tests.