Namen für Integrationstests auswählen

13

Bei Unit-Tests ist die Domain recht klein, daher ist es einfach. Ich habe Osheroves methodName_conditions_result()Schema verwendet und fand es sehr klar.

Aber bei Integrationstests habe ich das Gefühl, dass dies einen sehr langen Namen ergeben würde, und was kann ich ersetzen methodName? Wie benenne ich Integrationstestklassen?

Beispiele aus der Praxis für Namen von Integrationstests sind sehr willkommen. Ich hoffe, die Antworten helfen mir auch, diese Tests besser zu verstehen.

Bigstones
quelle
1
Warum wurde diese Frage (zweimal) abgelehnt?
Bigstones

Antworten:

6

Bei Unit- und Integrationstests verfolge ich einen etwas anderen Ansatz. Ich versuche, sie so weit wie möglich nach Funktionen zu benennen. Wenn alle Tests bestanden sind, sehen Sie eine Liste aller Funktionen, die funktionieren und nicht funktionieren.

  • canRegisterUser
  • canHandleInvalidInput
  • canRelayDocumentBetweenServers
  • canCreateSchema
  • canLoginUsingWebService
  • canLoginUsingBasicAuth
  • canDeleteDocument
  • canAddDocument

Es ist nicht immer pragmatisch, die Tests so zu benennen, aber es kann sehr hilfreich sein, insbesondere nach dem Lesen von Hunderten von Unit- und Integrationstests. Der insgesamt umfassende Klassenname, der diese Methoden enthält, sollte auch auf die getesteten Funktionen hinweisen. Es wird bei der Organisation helfen.

Ich würde auch vorschlagen, Unit-Tests für Bugfixes mit einem eindeutigen Präfix zu benennen, um bugfix1002zu beweisen, dass der Bug behoben wurde.

Andrew T Finnell
quelle
5

Dies wurde wirklich geschrieben, um bei Unit-Tests zu helfen, aber vielleicht werden Sie feststellen, dass für Integrationstests (mehr oder weniger) dieselben Regeln gelten:

Schauen Sie sich sieben Schritte an !

Ich bevorzuge, dass, wie auch immer Sie es nennen, es wirklich der Name der Testsuite (Name des Geräts auf unserer Karte), der Effekt, den Sie überprüfen, und die Bestätigungsmeldung sind, die hervorstechen und die Ursache des Fehlers klarstellen müssen. Wenn Sie feststellen, dass dies mit Asheroves Benennung am einfachsten ist, dann unterstütze ich das von ganzem Herzen. Aber vielleicht besteht der Trick darin, dass Sie den Teil "Methode" mit allem ausfüllen, was die Bedingung, das Ergebnis und die Ausnahme sinnvoll macht.

Ich freue mich über eine Suite mit dem Namen "MakingADeposit" mit einem Test namens "AccountDoesntExist" und einem Fehler mit der Meldung "Expected NonesuchAccount Ausnahme - keine empfangen".

Wenn es Ihnen nichts ausmacht, wenn ich den Namen der Testsuite durch "::" trenne, bin ich mit "AccountHandling :: MakingADeposit_AccountDoesntExist_ThrowsAnException" einverstanden.

Die Karte schlägt auch vor, dass Sie, wenn Sie keinen guten Namen haben, fortfahren und einen besseren Namen geben, wenn Ihnen einer einfällt (hoffentlich lange bevor Sie den Code an CI senden).

tottinge
quelle
2

Integrationstests sollten ähnlichen Regeln wie Komponententests folgen, da jeder Test einen Aspekt einer Anforderung testen sollte, aber das gesamte System testet. Die Klasse sollte das gesamte zu testende Objekt benennen, z. B. "TpcInputValidation", und die Benennung der Methode sollte ausdrücklich widerspiegeln, was der Test versucht, ohne übermäßig wortreich zu sein, z. B. "shouldRaiseValidationErrorWithBadDates ()".

Die Methoden sollten ein Konzept des Features testen, und eine große Anzahl von Asserts könnte auf etwas anderes hinweisen. (Siehe "Clean Code: Ein Handbuch für agiles Software-Handwerk", S. 132, von Robert Martin).

Schlüsselfertig
quelle
Warum entspricht "ein Feature" Ihrer Meinung nach im Allgemeinen "einem Assert"? Anscheinend möchten Sie behaupten, dass sich das System in dem Zustand befindet, in dem Sie es erwarten. Dies kann eine beliebige Anzahl von Asserts sein. Aber ich schweife ab, weil es um die Benennung geht und nicht darum, wie man einen Integrationstest schreibt.
Jeremy Heiler
@ Andrew, ich habe nicht gesagt, dass es eine harte Regel ist, aber das Beobachten der Anzahl von Asserts könnte bei der Anleitung zum Testen eines Konzepts der Funktion helfen, das nicht unbedingt eines pro Methode ist. Wenn Sie den Umfang etwas einschränken, können Sie feststellen, wo die Probleme liegen, wenn sie fehlschlagen. Aber ich gebe Ihnen, dass es nicht toll ist, eine Behauptung zu sagen, und ich werde das herausarbeiten, danke.
Schlüsselfertig
1

Das Problem ist also, dass ein Eigenname der Funktionalität für einen Methodennamen zu lang ist? Ich weiß, dass es umständlich ist, Testmethoden mit Namen wie registerAndValidateUnderageUniversityDriverWithCoverageSetA_test()und möglicherweise jemals gegen Compilerregeln für lange Methodennamen zu schreiben (PL / SQL erlaubt nur bis zu 30 Zeichen - ich weiß nicht, ob Java und C # solche Kurznamenbeschränkungen auferlegen, aber sogar Wenn dies nicht der Fall ist, wird es ab einem bestimmten Punkt ziemlich unhandlich und wirklich sehr lange Methodennamen sind möglicherweise nur für generierten Code nützlich, der von anderem generierten Code gelesen / verwaltet wird. Sie können versuchen, es zu verkürzen, regValUnderageUnivDrvrWCovrgA_test()aber das ist auch wirklich schrecklich zu lesen. Eine Option, die ich verwendet habe, die mir nicht gefallen hat, die aber zu dieser Zeit die beste Wahl war, warunderageUnivDrvr_test_01()und dann gab es eine Tabelle, in der die Methodennamen einer viel längeren Beschreibung der getesteten Funktionalität zugeordnet waren. Hässlich, aber es hat funktioniert. Sie können die Beschreibung des Tests auch in der Dokumentation der Funktion in der Quelldatei dokumentieren. Dies kann hilfreich sein, da Sie die Dokumentation der Tests direkt aus dem Code generieren können, anstatt zwischen Tabellenkalkulation und Code hin und her zuzuordnen.

FrustratedWithFormsDesigner
quelle