Wie wurden Guava-Komponententests automatisch generiert?

31

Guave hat Unit-Testfälle automatisch generiert :

Guave hat eine erstaunliche Anzahl von Einzeltests: Ab Juli 2012 umfasst das Paket für Guaventests über 286.000 einzelne Testfälle. Die meisten davon werden automatisch generiert und nicht von Hand geschrieben. Guavas Testberichterstattung ist jedoch äußerst gründlich, insbesondere für com.google.common.collect.

Wie sind sie entstanden? Mit welchen Techniken und Technologien wurden sie entworfen und generiert?

dzieciou
quelle
Ich erinnere mich, dass ich einen Vortrag von einem Google-Typen gesehen habe, der sich mit diesem Thema befasst hat. Keine Ahnung, wie der Name lautete, das Gespräch fand auf einer Java-Convention statt
Zavior,
3
Das Paket com.google.common.collect.testing enthält viele Klassen mit dem Namen "Generator", sodass es wie ein Framework für die Testgenerierung aussieht. Es gibt auch Unterpakete mit Klassen dokumentiert als „Skelette“ oder „Basisklassen“ für Tests ...
gnat
1
@gnat Ja, ich war mir sicher, dass ich es irgendwo gesehen habe. com.google.common.collect.testing.features zeigt beispielsweise die Merkmale / Einschränkungen an, die eine Auflistungsklasse erfüllen sollte, und ein Testfall ist eine Kombination aus diesen. Auf diese Weise können sie das Testen parametrisieren
dzieciou
Möglicherweise haben Sie mehr Glück bei der Qualitätssicherung und dem Testen
Monica - M. Schröder
Die Frage stieß auf großes Interesse in der Community, aber es gab bisher keine vernünftige Antwort . Deshalb bin ich Martins Vorschlag gefolgt und habe ihn hier gestellt: sqa.stackexchange.com/questions/5214/… .
15.

Antworten:

8

Ein großer Teil dieser Testmenge ist für die Implementierung der Guava-Sammlung bestimmt. Sie haben generische Tests geschrieben, mit denen die Erfassungsschnittstellen eingehend getestet werden. Auf diese Weise wird eine Suite pro Implementierung erstellt. Siehe zum Beispiel Klassen genannt CollectionAddAllTester, ListIndexOfTester.

Dies alles wird durch eine Bibliothek namens testlib unterstützt, die als Teil von Guava ausgeliefert wird. Das ist ziemlich allgemein. Es unterstützt das Schreiben generischer Tests für jede Schnittstelle (nicht nur für Sammlungen). Sie können Featureeine Reihe möglicher Implementierungen angeben und diese testen (z. B. wenn Ihr Satz nicht modifizierbar ist, erwarten Sie ein anderes Ergebnis set.add()). Wenn Sie die Tests ausführen, geben Sie an, welche Funktionen Ihre Implementierung unterstützt.

Es basiert auf JUnit 3 und nicht auf 4. Normalerweise verfügen Sie über eine Klasse mit zahlreichen TestCaseMethoden testSomething(), die von JUnit reflektiert ausgeführt werden. Die Testlib-Bibliothek greift in die Ausführung dieser Tests ein, sodass der Lebenszyklus folgendermaßen aussieht:

  • Für jede Implementierung, die Sie testen möchten
  • Für jede (anwendbare) Prüfmethode
  • Erstellen Sie die TestCaseInstanz
  • Initialize the TestSubjectGenerator- Dies ist die Testlib-Schnittstelle, die Sie erweitern, um die Sie das Testobjekt tatsächlich erstellen
  • Führen Sie die Testmethode reflektierend aus. Ermöglicht während dieser Methode getSubjectGenerator()den Zugriff auf die Testperson

Das Schlüsselbit ist der zusätzliche Initialisierungsschritt, mit dem ein bestimmtes Testobjekt in den generischen Testfall eingefügt werden kann.

Ich habe einen Beitrag darüber geschrieben, wie man Testlib-Generierungs-Suites für eigene Interfaces schreibt.

(Wird auch auf derselben Frage auf der sqa- Site gepostet .)

Joe Kearney
quelle
6

Es gibt Unit-Test-Generatoren. In der .NET-Welt könnte dies beispielsweise durch Microsoft Pex geschehen.

Beispielsweise versucht Microsoft Pex auf Basis der Codeanalyse alle möglichen Werte als Argumente für eine Methode. Bei einigen Argumenten wird erwartet, dass die Methode eine Ausnahme auslöst. Solche Sachen können automatisch für Tests erstellt werden. Statische Werte wie eine leere Zeichenfolge, die in bestimmten Fällen zurückgegeben wird, können ebenfalls automatisch getestet werden.

Sebazzz
quelle
2
Das ist ein zufälliger Test, der nur für negative Pfade nützlich ist (Ausnahmen, ungültige Eingaben, Abstürze, Zeitüberschreitung). Ich glaube, sie haben Tests auch für Happy Path generiert, und dies erfordert mehr Design und nicht nur das Starten des statischen Analysewerkzeugs.
Dzieciou
Und ich weiß, dass es Möglichkeiten und Werkzeuge gibt, um einen Test für einen glücklichen Pfad zu generieren (siehe z. B. diese Antwort ), aber ich bin interessiert, wie dies in einem bestimmten Fall von Guava
dzieciou