Unit-Testing mit vielen Anwendungsfällen

7

Ich arbeite an einer Java-Anwendung, die viele Anwendungsfälle hat. Eingaben in die Anwendung sind verschiedene Arten von Ereignissen, die zu unterschiedlichen Zeiten auftreten. Diese Art der Eingabe führt zu Hunderten von Testfällen. Hat jemand diese Art von Szenario erlebt? Stellen Sie sicher, dass alle Testfälle abgedeckt sind, bevor Sie eine Freigabe an das QA-Team abgeben? Meine Frage ist also: Was ist der beste Ansatz, um Programme mit vielen Testfällen zu testen?

    
Geos 31.07.2009, 18:43
quelle

10 Antworten

14

Versuchen Sie nicht, die gesamte Anwendung von Anfang an mit Unit-Tests abzudecken. Tun Sie es in kleinen, inkrementellen Schritten. Setzen Sie einen kleinen Meilenstein, um innerhalb von ein oder zwei Wochen zu erreichen, und beginnen Sie dann, Tests für die erste Funktionalität dieses Meilensteins zu schreiben. Starten Sie dann die Implementierung dieser Funktionalität. Es sollte so etwas sein:

Kleine, schrittweise Schritte

  1. Zerlegen Sie die Anwendung in kleinere Feature-Meilensteine, die Sie in diesem Moment sehen können
  2. Wählen Sie die dringendste Funktion, die in diesem Moment implementiert werden muss
  3. Brechen Sie diese Funktion in kleinere Aufgaben
  4. Schreiben Sie einen Test für eine der Aufgaben
  5. Führen Sie den Test aus. Es sollte fehlschlagen ( ROT ). Wenn es deinen Test besteht, ist dein Test gebrochen.
  6. Beginnen Sie mit dem Schreiben der geringsten Menge Code, damit dieser Test bestanden wird. Hartcodierte Werte sind erlaubt.
  7. Führen Sie die Tests aus ( GRÜN ). Sie sollten bestehen (besonders wenn hart codierte Werte verwendet werden). Jetzt wissen Sie, dass Sie ein Sicherheitsnetz für zukünftige Refactorings haben.
  8. Beginnen Sie mit dem Refactoring ( REFACTOR ), wenn es erforderlich ist, andernfalls gehen Sie zu Schritt 4.

Bereiten Sie sich auf Änderungen vor

Der Vorteil dieser Methode, eine große Aufgabe in überschaubare Stücke zu zerlegen, besteht darin, dass es Ihnen die Chance gibt, etwas innerhalb von ein oder zwei Wochen fertig zu bekommen. Später kann das Management die Prioritäten neu überdenken und Sie müssen die Liste vom ersten Punkt an neu organisieren. Ein weiterer Vorteil ist, dass bei jedem Schritt ein Unit-Test, der Sie unterstützt, Vertrauen schafft und Sie tatsächlich etwas schneller an Ihr Management liefern, als Sie glauben würden, denn bei jedem Schritt haben Sie ( etwas) funktionierende Version Ihres Programms. Sie können Fortschritte sehen, und das ist sehr wichtig für Sie und für sie. Sie sehen, dass tatsächlich gearbeitet wird, und Sie bekommen das Feedback, das Sie für Ihre Anwendung brauchen (Anforderungen ändern sich immer, lassen Sie sie so früh wie möglich ändern).

Als Gren sagte, du bist wahrscheinlich verwirrende Anwendungsfälle mit Komponententests. Die Aktionen, die ein Benutzer für eine Anwendung ausführen kann, können genauso gut von einer einzigen Methode im Domänenmodell verarbeitet werden. Also ist die Situation vielleicht nicht so schlimm wie es scheint.

Kein Frontdesign, auch nicht für Unit Tests

Versuchen Sie nicht, alle Ihre Tests von Anfang an zu schreiben. So habe ich es gemacht und es war ein großer Fehler. Sobald Sie kleine Iterationen durchführen (Testmethode / Methodenimplementierung), werden Sie viel produktiver und selbstbewusster. Wenn Sie alle Ihre Tests im Voraus schreiben, stellen Sie möglicherweise fest, dass aufgrund von Faktorisierungen, die notwendig sind, um Ihre ersten Tests zu bestehen, Sie die gesamte API, die Sie sich beim Schreiben der Tests vorgestellt haben, überdenken müssen, während Sie einen Test schreiben. dann die Implementierung, ein Test, dann die Implementierung, Sie enden mit dem, was es emergent Design genannt wird. Und das ist die beste Art von Design. So sind Designmuster entstanden. Designmuster entstanden nicht von jemandem, der den ganzen Tag stand und über Wege zur Lösung des Problems nachdachte.

    
Ionuț G. Stan 31.07.2009, 19:39
quelle
5

Wenn Sie Hunderte von Testfällen haben, nehme ich an, dass dies daran liegt, dass sie die Variabilität der Eingabe und die Anforderungen der Anwendung widerspiegeln?

Wenn Sie keine Tests für alle diese (bekannten) Fälle schreiben, wie werden Sie dann wissen, ob Sie die gewünschte Funktionalität geliefert haben?

Die Alternative zum automatisierten Testen ist das manuelle Testen, und ich kann nicht erkennen, wie das manuelle Testen hunderter Testfälle Ihnen im Vergleich zu automatisierten Tests Zeit spart.

    
Mark Seemann 31.07.2009 18:54
quelle
4

Um die Testfälle zu minimieren, setze ich JUnit-Theorien intensiv ein:

%Vor%

divisible wird mit beliebigen Kombinationen von a und b aufgerufen:

%Vor%

Nett, ist es nicht?

Überprüfen Sie auch meine hashCode / equals Checker .

    
dfa 31.07.2009 19:49
quelle
1

Alles hängt von Ihrer Zeit und Ihrem Budget ab. In einer idealen Welt sollten Sie alle Möglichkeiten nutzen. Aber wir alle wissen, dass dies ein bisschen weit von der Realität entfernt ist.

Wie Sie sagen, scheint es, dass es ein wirklich großes Projekt ist. In diesem Fall wird erwartet, dass auch viel Zeit für Tests benötigt wird. Wir sollten uns Gedanken über die Zeit machen, wann immer wir ein Projekt schätzen.

Ich würde vorschlagen, die Testfälle in verschiedenen Kategorien zu trennen und alles zu tun, was Sie mit Ihrer Zeit und Ihrem Budget erreichen können. Versuchen Sie, die Hauptkategorien mit mehr Tests als die sekundären zu erfassen. Dies ist entscheidend, da in der Regel 80% der Zeit für 20% des Codes ausgegeben werden. Und das ist der wichtigste Teil.

Es ist auch wichtig, Prioritäten zu setzen, was notwendig ist, damit der Rest funktioniert. Nehmen wir an, Sie haben eine Anwendung, bei der nur abonnierte Benutzer etwas tun können. Dann sollte der abonnierende Teil sehr gut getestet werden, wenn Sie möchten, dass Ihre Anwendung nützlich ist.

Schließlich sollten Sie versuchen, einige Akzeptanztests zu erstellen, die darauf hinweisen, dass etwas nicht stimmt (obwohl sie keine große Hilfe sein können, um herauszufinden, was genau falsch ist).

    
Samuel Carrijo 31.07.2009 18:47
quelle
1

Schreiben Sie die Tests, bevor Sie den Code schreiben. Das bedeutet nicht, dass Tests für jedes Szenario geschrieben werden, bevor es überhaupt beginnt , das heißt einen Test schreiben, diesen Test bestehen und mit dem nächsten Schritt fortfahren. Ehrlich gesagt nicht fügen Sie so viel zur Entwicklungszeit hinzu, besonders wenn Sie jetzt wissen, dass das zweite etwas bricht.

Achten Sie in allen Fällen auf eine 100% ige Testabdeckung.

    
Matt Grande 31.07.2009 19:03
quelle
1

Ich denke, Sie verwirren das Testen von Anwendungsfällen und Komponententests. Testfälle sollten versuchen, auf Methodenebene oder höchstens auf Klassenebene zu sein. In diesem Fall sollten Sie versuchen, die bestmögliche Abdeckung in Ihren Budget- / Zeitbeschränkungen zu erreichen, und Sie sollten sie vor / während des Schreibens Ihres Codes schreiben.

Ich denke, Entwickler sollten auch versuchen, die tatsächlichen Anwendungsfälle zu durchlaufen und sie mit etwas Selen zu automatisieren, um sicherzustellen, dass das Produkt solide ist, aber letztendlich nach einer angemessenen Menge dieser Art von Tests sollte es an QA geliefert werden.

    
Gren 31.07.2009 19:19
quelle
0

Natürlich wäre der beste Ansatz, alle Testfälle zu testen ... Aber Zeit, Geld und so weiter machen das unmöglich ...

Einer der Ansätze wäre, Testfälle zu gruppieren und einen "super" Testfall für jede Gruppe zu finden!

Eine weitere Möglichkeit wäre, kritische Module Ihrer Anwendung zu identifizieren und ihre Testfälle vorrangig zu verwalten.

    
Matthieu 31.07.2009 18:51
quelle
0

Es ist nicht mein Ansatz, viele Unit-Tests vom allerersten Schritt einer neuen Anwendung an zu schreiben. Wenn ich eine neue Anwendung (von Grund auf neu) erstelle, erstelle ich zuerst einen Prototyp, ohne UT . Sobald ich einen funktionierenden Prototyp an einem sonnigen Tag habe und einige Kollegen ihn überprüfen (und genehmigen, verbessern usw.), mache ich zwei Dinge: Ich schreibe Einzeltests, die das sonnige Tages-Szenario abdecken, und dann refaktoriere ich meinen Code / p>

Nur dann arbeite ich weiter an der Anwendung, aber ich versuche UT zu schreiben, die ich für wichtig halte. Zu viel UT kann den falschen Eindruck erwecken, dass der Code vollständig abgedeckt ist. In der realen Welt existiert eine solche Abdeckung selten.

    
Ron Klein 31.07.2009 18:58
quelle
0

Bei der Anzahl der Kombinationen ist es wahrscheinlich nicht realistisch, alle Szenarien abdecken zu können.

Was Sie tun können, ist:

  • Testen Sie den gesamten Code mindestens einmal (fast 100% Codeabdeckung)

  • Konzentriere dich auf Bereiche, in denen du Schwierigkeiten hast, zusätzliche Tests zu schreiben

  • Immer wenn QA einen Fehler findet, schreiben Sie einen Test, um den Fehler anzuzeigen, bevor Sie ihn beheben

Shiraz Bhaiji 31.07.2009 19:04
quelle
0
___ qstnhdr ___ Unit-Testing mit vielen Anwendungsfällen ___ qstntxt ___

Ich arbeite an einer Java-Anwendung, die viele Anwendungsfälle hat. Eingaben in die Anwendung sind verschiedene Arten von Ereignissen, die zu unterschiedlichen Zeiten auftreten. Diese Art der Eingabe führt zu Hunderten von Testfällen. Hat jemand diese Art von Szenario erlebt? Stellen Sie sicher, dass alle Testfälle abgedeckt sind, bevor Sie eine Freigabe an das QA-Team abgeben? Meine Frage ist also: Was ist der beste Ansatz, um Programme mit vielen Testfällen zu testen?

    
___ answer1214227 ___

Wenn Sie Hunderte von Testfällen haben, nehme ich an, dass dies daran liegt, dass sie die Variabilität der Eingabe und die Anforderungen der Anwendung widerspiegeln?

Wenn Sie keine Tests für alle diese (bekannten) Fälle schreiben, wie werden Sie dann wissen, ob Sie die gewünschte Funktionalität geliefert haben?

Die Alternative zum automatisierten Testen ist das manuelle Testen, und ich kann nicht erkennen, wie das manuelle Testen hunderter Testfälle Ihnen im Vergleich zu automatisierten Tests Zeit spart.

    
___ answer1214479 ___

Versuchen Sie nicht, die gesamte Anwendung von Anfang an mit Unit-Tests abzudecken. Tun Sie es in kleinen, inkrementellen Schritten. Setzen Sie einen kleinen Meilenstein, um innerhalb von ein oder zwei Wochen zu erreichen, und beginnen Sie dann, Tests für die erste Funktionalität dieses Meilensteins zu schreiben. Starten Sie dann die Implementierung dieser Funktionalität. Es sollte so etwas sein:

Kleine, schrittweise Schritte

  1. Zerlegen Sie die Anwendung in kleinere Feature-Meilensteine, die Sie in diesem Moment sehen können
  2. Wählen Sie die dringendste Funktion, die in diesem Moment implementiert werden muss
  3. Brechen Sie diese Funktion in kleinere Aufgaben
  4. Schreiben Sie einen Test für eine der Aufgaben
  5. Führen Sie den Test aus. Es sollte fehlschlagen ( ROT ). Wenn es deinen Test besteht, ist dein Test gebrochen.
  6. Beginnen Sie mit dem Schreiben der geringsten Menge Code, damit dieser Test bestanden wird. Hartcodierte Werte sind erlaubt.
  7. Führen Sie die Tests aus ( GRÜN ). Sie sollten bestehen (besonders wenn hart codierte Werte verwendet werden). Jetzt wissen Sie, dass Sie ein Sicherheitsnetz für zukünftige Refactorings haben.
  8. Beginnen Sie mit dem Refactoring ( REFACTOR ), wenn es erforderlich ist, andernfalls gehen Sie zu Schritt 4.

Bereiten Sie sich auf Änderungen vor

Der Vorteil dieser Methode, eine große Aufgabe in überschaubare Stücke zu zerlegen, besteht darin, dass es Ihnen die Chance gibt, etwas innerhalb von ein oder zwei Wochen fertig zu bekommen. Später kann das Management die Prioritäten neu überdenken und Sie müssen die Liste vom ersten Punkt an neu organisieren. Ein weiterer Vorteil ist, dass bei jedem Schritt ein Unit-Test, der Sie unterstützt, Vertrauen schafft und Sie tatsächlich etwas schneller an Ihr Management liefern, als Sie glauben würden, denn bei jedem Schritt haben Sie ( etwas) funktionierende Version Ihres Programms. Sie können Fortschritte sehen, und das ist sehr wichtig für Sie und für sie. Sie sehen, dass tatsächlich gearbeitet wird, und Sie bekommen das Feedback, das Sie für Ihre Anwendung brauchen (Anforderungen ändern sich immer, lassen Sie sie so früh wie möglich ändern).

Als Gren sagte, du bist wahrscheinlich verwirrende Anwendungsfälle mit Komponententests. Die Aktionen, die ein Benutzer für eine Anwendung ausführen kann, können genauso gut von einer einzigen Methode im Domänenmodell verarbeitet werden. Also ist die Situation vielleicht nicht so schlimm wie es scheint.

Kein Frontdesign, auch nicht für Unit Tests

Versuchen Sie nicht, alle Ihre Tests von Anfang an zu schreiben. So habe ich es gemacht und es war ein großer Fehler. Sobald Sie kleine Iterationen durchführen (Testmethode / Methodenimplementierung), werden Sie viel produktiver und selbstbewusster. Wenn Sie alle Ihre Tests im Voraus schreiben, stellen Sie möglicherweise fest, dass aufgrund von Faktorisierungen, die notwendig sind, um Ihre ersten Tests zu bestehen, Sie die gesamte API, die Sie sich beim Schreiben der Tests vorgestellt haben, überdenken müssen, während Sie einen Test schreiben. dann die Implementierung, ein Test, dann die Implementierung, Sie enden mit dem, was es emergent Design genannt wird. Und das ist die beste Art von Design. So sind Designmuster entstanden. Designmuster entstanden nicht von jemandem, der den ganzen Tag stand und über Wege zur Lösung des Problems nachdachte.

    
___ answer1214213 ___

Natürlich wäre der beste Ansatz, alle Testfälle zu testen ... Aber Zeit, Geld und so weiter machen das unmöglich ...

Einer der Ansätze wäre, Testfälle zu gruppieren und einen "super" Testfall für jede Gruppe zu finden!

Eine weitere Möglichkeit wäre, kritische Module Ihrer Anwendung zu identifizieren und ihre Testfälle vorrangig zu verwalten.

    
___ answer1214361 ___

Ich denke, Sie verwirren das Testen von Anwendungsfällen und Komponententests. Testfälle sollten versuchen, auf Methodenebene oder höchstens auf Klassenebene zu sein. In diesem Fall sollten Sie versuchen, die bestmögliche Abdeckung in Ihren Budget- / Zeitbeschränkungen zu erreichen, und Sie sollten sie vor / während des Schreibens Ihres Codes schreiben.

Ich denke, Entwickler sollten auch versuchen, die tatsächlichen Anwendungsfälle zu durchlaufen und sie mit etwas Selen zu automatisieren, um sicherzustellen, dass das Produkt solide ist, aber letztendlich nach einer angemessenen Menge dieser Art von Tests sollte es an QA geliefert werden.

    
___ answer1214519 ___

Um die Testfälle zu minimieren, setze ich JUnit-Theorien intensiv ein:

%Vor%

%code% wird mit beliebigen Kombinationen von %code% und %code% aufgerufen:

%Vor%

Nett, ist es nicht?

Überprüfen Sie auch meine hashCode / equals Checker .

    
___ answer1214197 ___

Alles hängt von Ihrer Zeit und Ihrem Budget ab. In einer idealen Welt sollten Sie alle Möglichkeiten nutzen. Aber wir alle wissen, dass dies ein bisschen weit von der Realität entfernt ist.

Wie Sie sagen, scheint es, dass es ein wirklich großes Projekt ist. In diesem Fall wird erwartet, dass auch viel Zeit für Tests benötigt wird. Wir sollten uns Gedanken über die Zeit machen, wann immer wir ein Projekt schätzen.

Ich würde vorschlagen, die Testfälle in verschiedenen Kategorien zu trennen und alles zu tun, was Sie mit Ihrer Zeit und Ihrem Budget erreichen können. Versuchen Sie, die Hauptkategorien mit mehr Tests als die sekundären zu erfassen. Dies ist entscheidend, da in der Regel 80% der Zeit für 20% des Codes ausgegeben werden. Und das ist der wichtigste Teil.

Es ist auch wichtig, Prioritäten zu setzen, was notwendig ist, damit der Rest funktioniert. Nehmen wir an, Sie haben eine Anwendung, bei der nur abonnierte Benutzer etwas tun können. Dann sollte der abonnierende Teil sehr gut getestet werden, wenn Sie möchten, dass Ihre Anwendung nützlich ist.

Schließlich sollten Sie versuchen, einige Akzeptanztests zu erstellen, die darauf hinweisen, dass etwas nicht stimmt (obwohl sie keine große Hilfe sein können, um herauszufinden, was genau falsch ist).

    
___ answer1214272 ___

Schreiben Sie die Tests, bevor Sie den Code schreiben. Das bedeutet nicht, dass Tests für jedes Szenario geschrieben werden, bevor es überhaupt beginnt , das heißt einen Test schreiben, diesen Test bestehen und mit dem nächsten Schritt fortfahren. Ehrlich gesagt nicht fügen Sie so viel zur Entwicklungszeit hinzu, besonders wenn Sie jetzt wissen, dass das zweite etwas bricht.

Achten Sie in allen Fällen auf eine 100% ige Testabdeckung.

    
___ tag123unittesting ___ Unit Testing ist eine Methode, bei der einzelne Quellcode-Einheiten auf ihre Tauglichkeit getestet werden. ___ answer1214279 ___

Bei der Anzahl der Kombinationen ist es wahrscheinlich nicht realistisch, alle Szenarien abdecken zu können.

Was Sie tun können, ist:

  • Testen Sie den gesamten Code mindestens einmal (fast 100% Codeabdeckung)

  • Konzentriere dich auf Bereiche, in denen du Schwierigkeiten hast, zusätzliche Tests zu schreiben

  • Immer wenn QA einen Fehler findet, schreiben Sie einen Test, um den Fehler anzuzeigen, bevor Sie ihn beheben

___ answer1214250 ___

Es ist nicht mein Ansatz, viele Unit-Tests vom allerersten Schritt einer neuen Anwendung an zu schreiben. Wenn ich eine neue Anwendung (von Grund auf neu) erstelle, erstelle ich zuerst einen Prototyp, ohne UT . Sobald ich einen funktionierenden Prototyp an einem sonnigen Tag habe und einige Kollegen ihn überprüfen (und genehmigen, verbessern usw.), mache ich zwei Dinge: Ich schreibe Einzeltests, die das sonnige Tages-Szenario abdecken, und dann refaktoriere ich meinen Code / p>

Nur dann arbeite ich weiter an der Anwendung, aber ich versuche UT zu schreiben, die ich für wichtig halte. Zu viel UT kann den falschen Eindruck erwecken, dass der Code vollständig abgedeckt ist. In der realen Welt existiert eine solche Abdeckung selten.

    
___ antwort1214310 ___

Wenn Sie keine Tests für alles schreiben können, ist das nächstbeste, was ich Ihnen vorschlagen würde, Ihre Abdeckung mit Hilfe von Coverage-Tools wie cobertura zu messen. Dadurch wird sichergestellt, dass Sie den Großteil Ihres Codes mithilfe von Blackbox-Tests abdecken. Das Messen der Abdeckung ist sehr wichtig, wenn die Codebasis wächst, sonst ist es unmöglich, den Überblick zu behalten, wie gut Ihre Testsuite ist.

    
___
OpenSource 31.07.2009 19:09
quelle

Tags und Links