Entwickelt oder testet Unit Testing?

24

Ich hatte eine Diskussion mit einem Testmanager über die Rolle von Unit- und Integrationstests. Sie forderte die Entwickler auf, zu melden, welche Einheiten und Integrationen wie getestet wurden. Aus meiner Sicht sind Unit- und Integrationstests Teil des Entwicklungsprozesses und nicht des Testprozesses. Über die Semantik hinaus meine ich, dass Unit- und Integrationstests nicht in die Testberichte aufgenommen werden sollten und Systemtester sich nicht darum kümmern sollten. Meine Argumentation basiert auf zwei Dingen.

  1. Unit- und Integrationstests werden immer anhand einer Schnittstelle und eines Vertrags geplant und durchgeführt. Unabhängig davon, ob Sie formalisierte Verträge verwenden, testen Sie immer noch, was z. B. eine Methode tun soll, dh einen Vertrag.

    Beim Integrationstest testen Sie die Schnittstelle zwischen zwei verschiedenen Modulen. Die Schnittstelle und der Vertrag bestimmen, wann der Test bestanden wird. Sie testen jedoch immer einen begrenzten Teil des gesamten Systems. Systemtests werden dagegen anhand der Systemspezifikationen geplant und durchgeführt. Die Spezifikation bestimmt, wann der Test bestanden wird.

  2. Ich sehe keinen Wert darin, dem (System-) Tester die Breite und Tiefe von Unit- und Integrationstests mitzuteilen. Angenommen, ich schreibe einen Bericht, in dem aufgeführt ist, welche Art von Komponententests für eine bestimmte Business-Layer-Klasse durchgeführt werden. Was soll er / sie davon nehmen?

    Daraus zu schließen, was getestet werden sollte und was nicht, ist eine falsche Schlussfolgerung, da das System möglicherweise immer noch nicht so funktioniert, wie es die Spezifikationen erfordern, obwohl alle Einheiten- und Integrationstests bestanden wurden.

Dies mag wie eine nutzlose akademische Diskussion erscheinen, aber wenn Sie wie ich in einem streng formalen Umfeld arbeiten, ist es tatsächlich wichtig zu bestimmen, wie wir Dinge tun. Wie auch immer, irre ich mich total?

Rubio
quelle
9
Ist das wichtig?
Yannis
5
@YannisRizos Aus dem Titel, nein. Aus der gesamten Frage geht hervor, dass es dem Fragenden eindeutig so erscheint
Ludwig Magnusson,
2
@Rubio Aufgrund Ihrer Frage stimme ich zu, dass Berichte zu Komponententests für den Systemtester unbrauchbar sind. Unit-Tests sind ein hilfreiches Werkzeug für den Entwickler. Wie motiviert Ihr Testmanager die Notwendigkeit dieser Berichte?
Ludwig Magnusson
2
@LudwigMagnusson Stimmt, aber wenn es nur um die Person geht, die fragt, ist das zu lokal.
Yannis
5
Entwickler, die an den Testmanager berichten, sind falsch, egal was passiert. Wenn sie diese Anfrage über Ihren ( Entwickler-) Manager weitergeleitet hätte , müssten Sie nur das tun, was Ihr Chef Ihnen gesagt hat. „Sprechen Sie mit meinem Manager“ ist die Waffe braucht man , um zu wissen , wie in „streng formalen Umfeld“ als Ihr verwenden
gnat

Antworten:

30

Das Schreiben automatisierter Tests ist Aufgabe des Entwicklers. Die Tests sind Teil der Codebasis und sollten als solche behandelt werden. Sie sollten denselben Codeüberprüfungen, Codierungsstandards, Versionskontrolldisziplinen usw. wie der Rest des Projekts unterliegen.

Das Ausführen dieser Tests erfolgt aus zwei Gründen: Erstens als Leitfaden für die Entwickler. Sie führen Tests durch, um sicherzustellen, dass der soeben geschriebene Code den Anforderungen entspricht, Sie verwenden ihn als zusätzliche Dokumentation und stellen sicher, dass durch Änderungen keine vorhandene Funktionalität beeinträchtigt wird. Wenn Sie eine echte TDD durchführen, sind die Tests auch eine maßgebliche Quelle für technische Spezifikationen. Der zweite Grund für die Verwendung der Tests liegt in der Qualitätssicherung und Bereitstellung. Das Ausführen aller automatisierten Tests sollte einer der ersten Schritte in jeder Testrunde sein. Das Ausführen automatisierter Tests ist kostengünstig (praktisch überhaupt kein Personal erforderlich), und es macht wenig Sinn, manuelle Tests durchzuführen, wenn die automatisierten Tests fehlschlagen.

Dies bedeutet, dass die Verantwortlichkeiten folgendermaßen aussehen sollten:

  • Entwickler schreiben automatisierte Tests
  • Entwickler führen bei Bedarf einzelne automatisierte Tests als Teil ihres Entwicklungsworkflows durch
  • Die Qualitätssicherung führt alle automatisierten Tests als eine der ersten Teststufen durch

Wenn Sie einen Build-Server haben, läuft die Aufgabe von QA (in Bezug auf automatisierte Tests) darauf hinaus, "den Bericht des Build-Servers zu öffnen und sicherzustellen, dass alles grün ist".

tdammers
quelle
Ausgezeichnete Post, genau so, wie ich sie posten wollte. Nur Qualm verlässt sich zu stark auf Unit-Tests, und Integrationstests können später zu Problemen führen. Ich stimme der Tatsache nicht zu, dass die Aufgabe von QA darin besteht, den Build-Server zu überprüfen (ich gehe davon aus, dass Sie so etwas wie Hudson meinen). Dies bedeutet, dass die Entwickler die gesamte Testlast auf sich nehmen müssen, um Tests zu schreiben, die die gesamte Geschäftslogik abdecken, was den Entwicklern zu viel Gewicht zu geben scheint.
Dardo
4
@dardo: Natürlich sind automatisierte Tests nicht die einzigen Tests, die Sie durchführen sollten, sonst könnten Sie die Qualitätssicherung einfach ganz loswerden. Das wäre lächerlich - viele sehr wichtige Aspekte eines Softwareprodukts können einfach nicht automatisch getestet werden. Was ich damit meine, ist, dass sich die Qualitätssicherung angesichts der Existenz automatisierter Tests keine Sorgen machen muss, sondern lediglich die Ausgabe des Build-Servers überprüfen muss. Danach machen sie ihre normale Sache - manuelle und halbautomatische Tests am fertigen Build.
tdammers
Ah ja, stimme zu 100% zu. Wie ein Kontrollpunkt, sind sie da, passieren sie usw.
dardo
@tdammers - Testen ist nur ein kleiner Teil der Qualitätssicherung.
Matthew Flynn
2
Ausgezeichnete Antwort, aber ich stimme nicht zu, dass Tests als gesehen werden sollten an authoritative source of technical specifications. Tests sollten eine Bestätigung der Spezifikationen sein, aber sicherlich kein Ersatz. Das soll nicht heißen, dass ich mich auch für eine große Vorab-Spezifikation aussetze, sondern dass ich die Unterscheidung mache, dass wir Tests anwenden, um die Dinge zu validieren, die wir über die Art und Weise wissen, wie sich ein System verhalten soll, anstatt die zu haben Tests definieren das Verhalten. Eine pedantische Unterscheidung, aber dennoch wichtig.
S.Robins
10

Ich denke, das Wichtigste für Sie wäre zu klären, warum sie diesen Bericht benötigt.

Es kann verschiedene Erklärungen geben (wie aus mehreren Antworten hervorgeht), die sehr unterschiedliche Strategien erfordern.

  • Wenn sie eine vernünftige Person ist und nur Informationen erhalten möchte, um die Arbeit ihres Testteams zu unterstützen, ist es sinnvoll, ein gemeinsames Verständnis zu erlangen und eine Lösung zu finden, die für Sie beide geeignet wäre. Sie können mit ihr die Art der Einheitentests und den grundlegenden Unterschied zwischen Einheitentests und Funktionstests / Systemtests / Abnahmetests diskutieren. Hoffentlich kannst du ihr klar machen, dass diese auf sehr unterschiedlichen Ebenen funktionieren und keine die andere ersetzen kann.
  • Wenn sie ein Kontrollfreak oder eine Bürokraten ist und nur deswegen einen Bericht verlangt, können Sie mit dem geringsten Aufwand etwas generieren, um ihre Launen zu befriedigen (z. B. was @Doc vorschlug :-).
  • Wenn sie in ein Machtspiel verwickelt ist, können Sie sich fragen, ob sie berechtigt ist, Berichte von Entwicklern anzufordern. Nach meiner Erfahrung sollten Entwickler normalerweise keine Berichte an die QA-Abteilung senden.
Péter Török
quelle
Gute Argumente. Sie scheint eine vernünftige Person zu sein. Meine Befürchtung, die ich nicht sehr deutlich gemacht habe, ist, dass die Unit-Tests die Tester in die falsche Richtung führen und falsche Sicherheit, was sie brauchen und was nicht.
Rubio
2
@Rubio, in der Tat, du solltest ihr klarstellen, dass Komponententests keine Systemtests ersetzen können. Tatsächlich kann eine hohe Einheitentestabdeckung eines bestimmten Moduls sogar ein Warnsignal dafür sein, dass dieses Modul während des Systemtests besondere Aufmerksamkeit benötigt! Wenn sich die Entwickler die Mühe gemacht haben, so viele Tests zu schreiben, wurde der Code in letzter Zeit möglicherweise drastisch geändert / erweitert und / oder ist voller Fehler.
Péter Török,
7

Ich denke, die Rolle von Qualitätssicherung und Entwicklung sowie das Zusammenspiel können zwischen Organisationen sehr unterschiedlich sein. Aber im Allgemeinen sage ich in meinem Team den Mitgliedern, dass sie so tun sollen, als gäbe es kein QA-Team, in dem Sinne, dass sie für die Änderungen verantwortlich sind, die sie in die Produktion bringen. Im Gegenzug nimmt unser QA-Team nicht viel von Entwicklertests an und testet das System in ausreichendem Maße als funktionierendes Ganzes.

Aus diesem Grund kümmert sich unser QA-Team nicht so sehr darum, was Unit-Tests sind oder nicht, bevor sie mit den Tests beginnen.

Ich denke, es ist hilfreich für das QA-Team, zu verstehen, was die Unit-Tests auf hoher Ebene tun und was nicht, damit wir gemeinsam daran arbeiten können, Lücken und Bereiche zu identifizieren, die strenger sein könnten. Vielleicht ist Ihr Kollege hinter einer Zusammenfassung auf hohem Niveau her, im Gegensatz zu den blutigen Details.

Paul Sanwald
quelle
5

Sie bestand darauf, dass Entwickler berichten, welche Einheiten und Integrationen wie getestet wurden.

Versucht sie wirklich darüber zu streiten, ob diese Art des Testens tatsächlich im Bereich der "Entwicklung" liegt, oder versucht sie nur herauszufinden, wie gut Ihr Code durch Unit-Tests abgedeckt ist? Wenn Sie sich nur die von Ihnen gegebenen Informationen ansehen, scheint es, als ob sie nur wissen möchte, welche Teile des Codes abgedeckt sind und wo sie die Anstrengungen ihres Teams konzentrieren sollte.

Ich habe gleich nach der Schule in einem Testteam gearbeitet, bevor ich in eine Entwicklungsrolle gewechselt bin, und ich kann sehen, wie wertvoll dies für sie und ihr Team sein kann.

Jason
quelle
1
Aber sollte der Fokus nicht auf den technischen Daten liegen? Es gibt Situationen, in denen Codeänderungen unerwartete Auswirkungen haben und es für den Entwickler sehr wichtig ist, mitzuteilen, dass das Testen auch dies und das abdecken sollte.
Rubio
1
@Rubio: Natürlich, aber aus rein praktischer Sicht versuchen Sie es aus ihrer Perspektive zu betrachten. Unter der Annahme, dass nicht alle Teile der Anwendung dieselbe Menge an Code enthalten, die von den Komponententests abgedeckt wird, möchten Sie nicht mehr Ihrer begrenzten Ressourcen für die Teile der Anwendung mit geringerer Abdeckung verwenden? Für mich ist es einfach eine Frage des Blicks auf den Bericht und der Frage an mein Team: "Hey Leute, es scheint, als ob Area X weniger Code enthält als Area Y, konzentrieren wir uns darauf, Tests auf Area X durchzuführen."
Jason
@Rubio: Ja, aber wenn Sie TDD (dh BDD) ordnungsgemäß ausführen, sollten Ihre Tests in erster Linie den Spezifikationen entsprechen. Wenn Ihr Unternehmen wirklich aufgeklärt war, konnte das Testteam die Tests für das Entwicklerteam schreiben.
gbjbaanb
2
Was getestet wird: automatisch generierter Bericht zur Codeabdeckung. Wie wird es getestet: Lesen Sie den Einheitentestcode. @ gbjbaanb: "Das Testteam könnte die Tests für das Entwicklerteam schreiben." An dieser Aussage sind so viele Dinge falsch, dass ich nicht weiß, wo ich anfangen soll, außer zu sagen: Sehr schlechte Idee .
BryanH
5

Ich sehe nicht, dass es zu wichtig ist.

Wenn Sie sie nicht für QA / Testing bereitstellen und sie keine ordnungsgemäßen Tests durchführen und die Produktion fehlschlägt, liegt es an ihnen, dass sie sie durch die QA in die Produktion lassen, ohne zu überprüfen, ob sie wie angegeben funktioniert.

Wenn Sie sie der Qualitätssicherung / Prüfung zur Verfügung stellen und sie keine ordnungsgemäßen Prüfungen durchführen ... dasselbe Ergebnis, als hätten Sie sie nicht zur Verfügung gestellt.

Wenn Sie sie jedoch bereitstellen, können sie sie auch mit der Spezifikation vergleichen und / oder vorschlagen, welche Tests möglicherweise fehlerhaft sind oder geändert werden müssen, weil sie einen Fehler gefunden haben.

Wirklich, ich sehe keinen großen Nachteil darin, sie bereitzustellen. Es ist immer noch auf QA / Testen gegen die Spezifikation zu validieren. Wenn sie faulenzen und einfach darauf vertrauen, dass Ihre Tests gut genug sind, weil sie alle bestanden haben, sind sie es, die bei ihrer Arbeit gescheitert sind. Solange sie auch noch die Spezifikation haben, sind die Ergebnisse der Einheiten- / Integrationstests nur flusend und sollten nicht in der Lage sein, Sie auf die eine oder andere Weise zu verletzen. Dies ist der Grund, warum wir Entwickler und QA haben. Mehrere Überprüfungen, die die App wie angegeben ausführt.

Entwickler machen Fehler, Qualitätssicherung macht Fehler, im Idealfall machen sie nicht beide Fehler in einem Artikel ... und wenn doch, ist es möglicherweise ein Analyst, der den Ball fallen ließ und eine unklare Spezifikation schrieb.

CaffGeek
quelle
2
Der Nachteil für mich ist zusätzliche Arbeit, die keinen oder nur geringen Wert bietet.
Rubio
@Rubio, welche zusätzliche Arbeit? Einfach das Ergebnis ausdrucken. Wenn sie gut benannt sind, werden sie darüber informiert, was Sie testen. Sie sollten nicht den tatsächlichen Code oder eine Beschreibung der Funktionsweise der Methode benötigen. Wenn ja, können sie es selbst nachschlagen.
CaffGeek
1
Die Erstellung eines Berichts über die bestandenen 3500-Einheiten- / Integrationstests wäre für den Tester wahrscheinlich wenig hilfreich, selbst wenn die Tests gut benannt wären (was sie sein sollten, aber nicht). Um den Testern aussagekräftige Informationen zum Komponententest zur Verfügung zu stellen, müsste der Entwickler den Komponententest einer bestimmten Funktion durchgehen und dem Tester auf irgendeine Weise mitteilen, was tatsächlich getestet wird und wie es behauptet wird. Das ist viel Arbeit.
Rubio
1
@Rubio - Automation ist dein Freund. Sie können einen Continuous Integration Server einrichten, der bei jedem Einchecken E-Mails sendet (dies hilft Ihnen auch). Wenn die Qualitätssicherung die Erklärung von Tests und Code anfordert, dann hört es sich so an, als wären sie über die Ebene der Zumutbarkeit hinausgegangen und in den Bereich "das Konzept nicht zu erfassen" übergegangen. Wenn sie den Code nicht lesen können oder wollen, sind sie nutzlos. An diesem Punkt wäre ein Chat mit Ihrem Vorgesetzten von Vorteil, und Sie können so vorgehen: "QS möchte, dass ich x% meiner Zeit damit verbringe, ihnen beim Lesen von Code zu helfen. Ist das in Ordnung?"
BryanH
1
+1 für den Hinweis, dass die Qualitätssicherung nicht von ihrer Verantwortung entbindet, die Software unabhängig zu testen.
2

Unit-Tests liegen in der Verantwortung der Entwickler, dass die Tests hilfreich sein können, um zu verstehen, wie die Codeteile von selbst funktionieren. Einige sehen dies möglicherweise als eine Form der Dokumentation und haben daher einen gewissen Wert, obwohl es zu einem Mehraufwand kommen kann, wenn die Komponententests regelmäßig geändert werden.

Der andere Wert bei der Weitergabe der Tests besteht darin, dass dadurch vermieden werden kann, dass sich Tests verdoppeln, die im Hinblick auf die Gewährleistung der Grundfunktionalität redundant sind.

Es gibt auch Benutzerakzeptanztests, die von alledem getrennt sind, da der Endbenutzer möglicherweise sein eigenes Verständnis der Funktionsweise eines Systems hat.

JB King
quelle
1
Redundantes Testen wird häufig als Argument verwendet und kann manchmal zutreffen. Systemtests werden jedoch immer für das gesamte System durchgeführt, wohingegen sich der Unit- / Integrationstest auf eine bestimmte Unit konzentriert. Ich sehe hier eine Gefahr.
Rubio
2

Wenn Ihr Unternehmen über eine definierte Methode verfügt, mit der die Qualität seiner Produkte sichergestellt werden kann (wenn diese SOX-konform sind oder versuchen, ihre CMMI-Werte zu verbessern, ist dies wahrscheinlich der Fall), müssen die Produkte dem Audit standhalten können, um den Prozess zu belegen wurde verfolgt.

Oft beinhaltet der definierte Prozess Unit-Tests (was eine gute Sache ist). Leider bedeutet dies auch, dass Sie Ihre Unit-Tests dokumentieren und nachweisen müssen, dass sie ausgeführt wurden, um dem Audit standzuhalten. Das bedeutet, dass Sie eine Möglichkeit benötigen, über Ihre Komponententests Bericht zu erstatten.

Schauen Sie sich ein Tool wie Sonar an, das Ihnen dabei hilft - es zeigt den Grad der Codeabdeckung und die Ergebnisse Ihrer Testläufe an.

Matthew Flynn
quelle
SOX nein, CMMI ja. Unsere Unit- / Integrationstests sind Teil des Code-Überprüfungsprozesses, und das hält auch Audits stand. Ich kann einen generierten Bericht von einem Unit- / Integrationstestlauf erhalten, aber das ist für einen Tester ziemlich kryptisch. Berichterstattung ist auch im Bericht, aber das an sich bedeutet nichts.
Rubio
Geben Sie Ihren Tests zunächst keine kryptischen Namen. Check out dannorth.net/introducing-bdd . Zweitens sagt die Codeabdeckung möglicherweise nicht viel über die Qualität der Tests aus, zeigt jedoch zumindest, dass die getesteten Einheiten nicht explodieren, wenn der größte Teil des gesamten Codes ausgeführt wird.
Matthew Flynn
Guter Link, danke. Ich erinnere mich, einen ausgezeichneten Zeitschriftenartikel gelesen zu haben, in dem verschiedene Arten untersucht wurden, Komponententests zu benennen, aber ich kann ihn jetzt nicht finden. Möglicherweise war es Visual Studio Magazine oder Code Magazine.
Rubio
2

Dies hängt wirklich vom Unternehmen ab, aber aus meiner Erfahrung als Systemtester in einem traditionellen Ansatz, aber auch als Tester in einem agilen Team in einem CD-Modell, ist es äußerst nützlich zu wissen, welche Einheiten und Integrationen getestet wurden.

Qualität liegt in der Verantwortung des Teams - sowohl Entwickler als auch Tester und das Produktmanagement - und die Zusammenarbeit ist der beste Weg, dies sicherzustellen.

Der Testmanager möchte also wissen, was Unit und Integration getestet wurden, und es ist ein bisschen mehr Arbeit für die Entwickler, aber es spart die Gesamtarbeit für das Projekt! Indem sie die Informationen an den Testmanager weitergeben, können sie ihre Bemühungen im Testteam auf das Wesentliche und Wichtige konzentrieren. Wie bereits erwähnt, kann das Team, wenn ein Codebereich nicht einheitlich getestet wurde, seine Anstrengungen auf diesen Bereich konzentrieren, im Vergleich zu einem Bereich, der umfangreich getestet wurde. Sie arbeiten alle an dem gleichen Endziel einer pünktlich veröffentlichten Software höherer Qualität.

Lauren
quelle
1

Ich würde denken, dass es vorteilhaft wäre, diese Art der Sache zur Verfügung zu stellen. Unit Test Coverage sollte etwas sein, das durch Entwicklung und Test bekannt ist, damit sie das erklären können.

Natürlich müssen Sie die geschäftskritischen Dinge testen, egal was passiert. Sie müssen die häufig verwendeten Funktionen gründlich testen, unabhängig davon, ob sie eine gute Einheitentestabdeckung aufweisen. Es kann nicht schaden, sie wissen zu lassen, welche anderen Orte von Unit-Tests abgedeckt werden. Prüft der Code in diesem kleinen Steuerelement bereits, ob Randfälle vorliegen? Diese Art von Zeug ist hilfreich, um auf allen Seiten des Geschäfts Bescheid zu wissen.

Chad Stewart
quelle
Ich wollte eine ähnliche Antwort schreiben. Während das Testen von Einheiten in der Domäne des Softwareentwicklers liegen sollte, kann es dem Testteam helfen, ein Gefühl für die Codeabdeckung zu entwickeln, um bestimmte Bereiche zu verstehen und anzuvisieren, die möglicherweise eine größere Aufmerksamkeit der Tester erfordern. Dies kann auch eine Möglichkeit sein, die Entwickler auf dem Laufenden zu halten, um sicherzustellen, dass sie so viele Randfälle berücksichtigen, wie dies kostengünstig ist. Auf diese Weise kann das Testteam nicht nur das gesamte System validieren, sondern auch alle Dinge berücksichtigen, deren Test ansonsten als kostspielig angesehen werden könnte.
S.Robins
1

Erwähnenswert ist der Ansatz, der in dem Buch "Wie Google Software testet" behandelt wird: Testen und Qualitätskontrolle liegt in der Verantwortung aller und die Standards sind streng.

Die eigentliche Rolle der "Testing" -Abteilung besteht in der Produktivität der Entwickler. dh Automatisierung, damit die Organisation das erforderliche Maß an Genauigkeit wirtschaftlich erreichen kann.

William Payne
quelle