Sollten Entwickler für andere Tests als Unit-Tests verantwortlich sein, wenn ja, welche sind die häufigsten?

35

Ich arbeite derzeit an einem ziemlich großen Projekt und habe JUnit und EasyMock verwendet, um die Funktionalität von Komponententests ziemlich ausführlich zu testen. Ich bin jetzt daran interessiert, um welche anderen Arten von Tests ich mich kümmern sollte. Ist es meine Verantwortung als Entwickler, sich um Dinge wie Funktions- oder Regressionstests zu kümmern? Gibt es eine gute Möglichkeit, diese benutzerfreundlich in Tools wie Maven / Ant / Gradle zu integrieren? Sind diese besser für einen Tester oder BA geeignet? Gibt es andere nützliche Testarten, die mir fehlen?

Jackie
quelle
2
Während dies in der Praxis simpel ist, skalieren Sie nach außen, so weit dies in Ihrer Umgebung zulässig ist, während Sie in der Praxis gesprächig und isoliert bleiben, wie es normalerweise der Fall ist. Stellen Sie sich das End-to-End-Team als mehr als Trennung und mehr als Kompetenz vor. Jedes Team repräsentiert eine unterschiedliche Kompetenz, die für einen durchgängigen Erfolg genutzt werden sollte. Das Team sollte für den Erfolg verantwortlich sein, für dessen Erreichung Tests erforderlich sind. Wie sie in Bezug auf die Implementierung angegangen werden, ist genau das, ein Implementierungsdetail, das auf Fähigkeiten basiert.
Aaron McIver
1
Die Antwort auf diese Frage hängt auch vom Kenntnisstand der anderen Teammitglieder ab. In einem Team, in dem die Qualitätssicherung keine ausgeprägten Programmierkenntnisse besitzt, können Entwickler beispielsweise mehr tun als in einem Team, in dem die Qualitätssicherung ihre eigenen Testkombinationen erstellen kann.
Neontapir
Ein gutes Kriterium ist, wie automatisierbar die Tests sind. Programmierer sind gut darin, Dinge mit Code zu automatisieren.
rwong

Antworten:

44

Es liegt in Ihrer Verantwortung, fehlerfreien Code zu liefern. Sie sollten schreiben, mitschreiben oder sicherstellen, dass Tests geschrieben oder durchgeführt werden, um Vertrauen in den von Ihnen gelieferten Code zu gewinnen.

Hinweis: Ich sage nicht, dass Sie einen fehlerfreien Code liefern müssen. Vielmehr sollten Sie versuchen, den bestmöglichen Code für die gestellten Anforderungen zu schreiben. Dazu gehört auch, dass der Code getestet werden muss.

Ob Sie persönlich für Funktions- und Regressionstests verantwortlich sind, hängt hauptsächlich von der Organisation Ihres Unternehmens ab. Alle bestens ausgebildeten Programmierer, die ich kenne, fragen sich nicht "ob es in meiner Verantwortung liegt, Tests vom Typ X zu schreiben?". Stattdessen fragen sie sich: "Was muss ich tun, um sicherzustellen, dass mein Code ordnungsgemäß getestet wird?". Die Antwort könnte darin bestehen, Komponententests zu schreiben oder der Regression Tests hinzuzufügen, oder es könnte bedeuten, mit einem QS-Experten zu sprechen und ihm zu helfen, zu verstehen, welche Tests geschrieben werden müssen. In allen Fällen bedeutet dies jedoch, dass sie sich ausreichend um den Code kümmern, den sie schreiben, um sicherzustellen, dass er ordnungsgemäß getestet wurde.

Fazit: Sie sollten für die Bereitstellung von qualitativ hochwertigem Code verantwortlich sein. Wenn dies bedeutet, dass Sie einige Funktions- oder Regressionstests schreiben müssen, führen Sie diese durch.

Bryan Oakley
quelle
Ich stimme dem liefernden hochwertigen Codeteil von ganzem Herzen zu. Ich bezog mich mehr auf "über" guten Code. Haben Änderungen, die in Ihrer Perspektive als "fehlerfrei" eingestuft werden, an anderer Stelle eine negative Leistung? Das beste Beispiel, an das ich denken kann, ist, dass eine Anforderung nicht richtig auf Ladung geprüft wurde. Mein Code verursacht also Probleme beim Laden des Servers, obwohl er "fehlerfrei" ist (ok, also kann man argumentieren, dass es sich nur um Humor handelt). PS Ich denke, Ihr Vertrauensteil ist hier der Schlüssel.
Jackie
10
Es liegt in Ihrer Verantwortung, fehlerfreien Code zu liefern. Es liegt in der Verantwortung des Entwicklers, das zu erstellen, was gefragt wurde . Fehler können und werden durch schlecht erfasste / interpretierte Anforderungen, Umweltprobleme in einer bestimmten Bereitstellung, Konflikte innerhalb eines Betriebssystems usw. verursacht. Sofern nicht für jeden einzelnen Fehler eine Ursachenanalyse durchgeführt wird, entspricht der fehlerfreie Code dem erwarteten Geschäftsmittel es zu tun, was der Benutzer erwartet und alles andere ist ein Defekt. Es ist unrealistisch anzunehmen, dass ein Entwickler während des gesamten SDLC involviert bleiben kann, um einfach das Vertrauen zu erhöhen. das wird nicht skalieren.
Aaron McIver
2
"Programmtests können eine sehr effektive Methode sein, um das Vorhandensein von Fehlern aufzuzeigen, aber sie sind hoffnungslos unzureichend, um ihre Abwesenheit aufzuzeigen." - Edsger W. Dijkstra, "The Humble Programmer" (Vortrag über den Turing Award), 1972.
John R. Strohm
1
"Es liegt in Ihrer Verantwortung, fehlerfreien Code zu liefern." ist Märchenland. Sie können das liefern, was der Umfang erfordert, aber Randfälle und Interpretationen der Geschäftslogik machen es unmöglich, dass Ihre Aussage eingehalten wird. Warum hat Ihrer Meinung nach jede Hauptversion von Software Releases und Patches usw.? Weil wir alle unvollkommen sind, einschließlich der Geschäftslogik.
Jason Sebring
4
Wäre jeder, der Probleme mit dem ersten Satz dieser Antwort hat, glücklicher, wenn Bryan es so formuliert hätte: "Es ist Ihr Ziel , fehlerfreien Code zu liefern"?
Carson63000
13

Dies könnte Ihnen helfen:

Die agilen Testquadranten

Q1 werden von den Entwicklern geschrieben.

Q2 werden von den Entwicklern automatisiert und in Zusammenarbeit mit dem Unternehmen und / oder den Testern geschrieben.

foobarcode
quelle
Entwickler sind häufig auch an Q4-Tests beteiligt.
Neontapir
Die verknüpfte Datei kann nicht mehr gefunden werden.
Dušan Rychnovský
3

Gibt es andere nützliche Testarten, die mir fehlen?

Es gibt Akzeptanztests, für die ich BDD- ähnliche Frameworks empfehlen würde, die die Gherkin-Sprache verwenden : JBehave (Java), Cucumber (Ruby), Behat (PHP) usw. Diese Art von Tests hat einige Vorteile gegenüber Komponententests:

  • Tests sind für Nichtentwickler leicht lesbar, sodass Sie sie den Kunden zeigen können
  • In Tests werden Geschäftsprozesse klar beschrieben, ohne auf Implementierungsdetails einzugehen. (Die Implementierung ist zwar nicht wichtig, aber besser, wenn Sie die Geschäftsanforderungen vom Code selbst trennen.)
  • Tests erledigen Dinge, die Benutzer mit Ihrer Anwendung erledigen
  • Sie sind einfacher zu schreiben (IMHO, hängt möglicherweise von der Sprache und dem Framework ab): keine Verspottung, weniger technische Details
scriptin
quelle
3

Funktionstests können wie Komponententests automatisiert werden und sind sehr nützlich, um zu testen, wie die verschiedenen Komponenten Ihres Projekts zusammenarbeiten und wie gut Ihr System die Geschäftsregeln widerspiegelt.

Dieser automatisierte Test dient auch als Regressions- und Akzeptanztest für wichtige (oder geringfügige) Änderungen an der Software (Fehlerbehebung, Umgestaltung, Geschäftsänderung, neue Funktionalität usw.). Dies gibt den Entwicklern viel mehr Selbstvertrauen.

Es gibt verschiedene Rahmenbedingungen für diese Art von Tests, wir verwenden Fitnesse mit sehr guten Ergebnissen. Hat eine sehr gute Bibliothek zum Testen von Webseiten (wir verwenden sie zum Testen unserer Web-App und unserer Web-Services) und integriert sich sehr gut in Maven und Jenkins .

Früher haben wir auch "funktionsübergreifende Tests" zwischen Entwicklern durchgeführt, aber diese Art von Tests ist nicht "wiederholbar", sodass ihre Nützlichkeit eingeschränkt ist ...

Pablo Lascano
quelle
2

Als Entwickler betrachte ich mich als verantwortlich für das Testen aller meiner Codes und garantiere nach besten Kräften, dass es keine Fehler gibt. Deshalb haben wir so viele Werkzeuge zur Verfügung, wie zum Beispiel das Verspotten. Das Ziel beim Erstellen von spöttischen Objekten in Ihren Tests besteht darin, Ihren Code von der "Außenwelt" zu isolieren und sicherzustellen, dass er einwandfrei funktioniert. Wenn etwas fehlschlägt, ist es "nicht Ihre Schuld".

Trotz der Tatsache, dass es nicht Ihre Schuld ist und Ihr Code so funktioniert, wie er sollte, heißt das nicht, dass Sie bei den restlichen Tests nicht helfen können. Ich glaube, es liegt auch in Ihrer Verantwortung, Ihre Arbeit zu unterstützen und in die Arbeit anderer zu integrieren. IT-Entwicklungsteams sollten jedes Mal als gut geölte Maschine arbeiten und mit anderen Abteilungen (wie der Qualitätssicherung) als größeres Team zusammenarbeiten, um zuverlässige Software bereitzustellen.

Aber das ist die Arbeit eines Teams, nicht nur Ihrer.

nunomvbarreiro
quelle
1

Offensichtlich Integrationstests ; Sie sind wichtiger und schwieriger zu schreiben als Unit-Tests. Es ist wie ein Haus zu bauen; Mit Unit-Tests können Sie nur sicherstellen, dass die Steine ​​fest sind und Druck, Temperatur, Luftfeuchtigkeit und anderen Bedingungen standhalten. Aber Sie haben keine Ahnung, wie das Haus mit den zusammengesetzten Ziegeln aussieht und sich verhält.

Das Problem bei großen Projekten, insbesondere bei Java-Projekten, die sich in einem Container befinden, besteht darin, dass Integrationstests schwierig sind. Um Systemintegrationstests in großen Projekten zu vereinfachen, ist ein speziell für das Projekt erstelltes Testframework erforderlich, für dessen Codierung der Entwickler verantwortlich ist. In letzter Zeit wurden in diesem Bereich große Verbesserungen vorgenommen, und Plattformen wie Arquillian vereinfachen das Schreiben eines Testframeworks erheblich (oder ersetzen es sogar).

m3th0dman
quelle
1

In der realen Welt sind Sie nur so verantwortlich, wie Ihr Team / Chef Sie zur Rechenschaft zieht. Wenn Sie dafür bezahlt werden oder gezwungen sind, sich endlos anzustrengen, um alle Ecken und Kanten zu finden und nach Lust und Laune die Interpretation von Business-Logik-Fehlern durch Ihren Chef (oder schlimmer noch durch Marketing) zu analysieren, sind Sie auf jeden Fall für alle verantwortlich.

Mit anderen Worten, tun Sie, was für den Umfang, den Sie erhalten, erforderlich ist. Es ist ein nettes Extra, in gewissem Sinne zu werfen oder zu sehen, wie andere das Produkt verwenden, das Sie erstellen, um einen Überblick über Anwendungsfälle und mögliche Probleme zu erhalten, die behoben werden müssen. Bringen Sie dies jedoch vor dem "Reparieren" zu Ihrem Team oder Chef. Dies schließt die Werkzeuge Ihrer Wahl ein. Alle Ihre Bemühungen sollten etwas sein, mit dem jeder an Bord ist.

Wenn Ihre Frage von Nutzen ist, mag ich Bugzilla, Google Docs, Zendesk oder Basecamp in Bezug auf Kommunikationssysteme.

Jason Sebring
quelle
1

Ich glaube nicht, dass dies bereits behandelt wurde - tut mir leid, wenn ich es verpasst habe.

Ein Problem ist die effiziente Nutzung der Zeit eines Entwicklers.

Entwicklern mangelt es oft an den Fähigkeiten, um bei bestimmten Testarten gut zu sein. Zum Teil ist dies nur natürlich. Es ist der gleiche Grund, warum Autoren Redakteure haben. Es ist sehr schwierig, die Mängel an etwas zu erkennen, wenn Sie zu nahe dran sind. Es geht aber auch um unterschiedliche Fähigkeiten und Spezialitäten.

In diesem Fall ist ein Entwickler, der Zeit mit Testen verbringt, in Bezug auf Kosten und Nutzen schlecht. Dieser Entwickler würde produktiver sein, wenn er andere Dinge tut, und ein spezialisierter Tester würde produktiver sein, wenn er die Tests durchführt.

Dabei werden natürlich verschiedene Annahmen getroffen, die nicht unbedingt gültig sind. In einem kleinen Unternehmen ist es zum Beispiel möglicherweise nicht sinnvoll, Mitarbeiter zu beschäftigen, die sich auf Tests spezialisiert haben. Es kann jedoch sinnvoller sein, zusätzliches Support-Personal einzustellen und es testen zu lassen, oder zumindest Leute dazu zu bringen, Code zu testen, den sie nicht selbst geschrieben haben.

Steve314
quelle
0

Ich glaube, wir (auch ein Entwickler) sind dafür verantwortlich, alle möglichen Testszenarien zu erfassen, bevor sie für die Qualitätssicherung freigegeben werden. Der Zweck der Qualitätssicherung ist die Validierung der Software. Wenn Sie Ihren eigenen Code auf Fehler hämmern, werden Sie auch bei der Qualitätssicherung immer gut aussehen.

Honus Wagner
quelle
Ich denke, ich versuche zu erreichen, was als effektives "Hämmern" gilt.
Jackie
Das ist definitiv subjektiv. Ich würde sagen, jede Art von Test, die für Ihr Projekt gilt (natürlich gelten nicht alle Testtypen für alle Projekte). Hier ist eine anständige Liste: softwaretestinghelp.com/types-of-software-testing . Was Sie selbst tun und auf was Sie verzichten, hängt natürlich von Ihrer Zeit, Ihren Ressourcen und Ihren Fähigkeiten ab. Beispielsweise können Sie möglicherweise keine Abnahmetests durchführen, da es bestimmte Regeln gibt, die nur ein Benutzer befolgen konnte. Kurz gesagt, tun Sie alles, was Sie können, in der Zeit, die Sie haben.
Honus Wagner
Bei meinen Projekten, bei denen es sich hauptsächlich um Webprojekte handelt, versuche ich generell, Unit, Functional, Usability, Regression und Performance zu erfassen. Wenn ich Zeit habe, setze ich mich für White Box, Stress, Kompatibilität und sogar Akzeptanz ein, wenn ich genug weiß. Mein genereller Codierungsstil ist extrem leistungsorientiert, daher setze ich meine Priorität darauf herab. Nichts davon bedeutet, dass die Qualitätssicherung in keinem dieser Testtypen etwas falsches findet, sondern nur, dass sie weniger finden und die Runde 2 viel einfacher machen.
Honus Wagner
0

Wer kann besser als ein Entwickler wissen, welche Testfälle am relevantesten sind. Der Entwickler sollte für die Durchführung aller Komponententests verantwortlich sein. Wenn möglich, sollte der Entwickler beim Schreiben und Ausführen der Testskripte behilflich sein. Da dies in großen Projekten selten möglich ist, sollte dem Entwickler Zeit eingeräumt werden, alle Testfälle zu überprüfen. Darüber hinaus sollte der Entwickler über Kenntnisse verfügen und die Vielzahl der verfügbaren automatisierten Testwerkzeuge nutzen.

In meiner Entwicklungskarriere stelle ich fest, dass Projekte zu besseren Ergebnissen führen, wenn eine enge Integration zwischen den Entwicklungsteams und den Testteams besteht.

Mindestens ein Mitglied aus jedem Team sollte an den anderen Planungs- und Implementierungstreffen teilnehmen.

Michelle Cannon
quelle
1
Das einzige Problem, das ich dabei habe, ist, dass es eine gewisse Isolation zwischen den Entwicklern und dem Testteam geben sollte, andernfalls wird das Testteam mit der Meinung des Entwicklers belastet, dass "der Code funktioniert". Qualitätssicherung und Entwickler haben gegensätzliche Ziele; Der Entwickler versucht, es zum Laufen zu bringen, während das QA-Team versucht, es zum Brechen zu bringen, und der Entwickler hat nicht immer die beste Perspektive auf Testrelevanz.
Robert Harvey
Ich bin nicht hundertprozentig einverstanden, aber in letzter Zeit habe ich mich mit mobilen Anwendungen befasst und ich denke, dass sie einen Grad an Integration erfordern, der etwas über das Traditionelle hinausgeht. Beachten Sie, dass ich den Begriff Integration verwende. Es kann eine Isolation geben, aber beide Teams sollten die Testfälle überprüfen und dazu beitragen. Es ist unwahrscheinlich, dass die Entwickler Zugriff auf alle erforderlichen Testressourcen haben, um ordnungsgemäße Tests durchzuführen. Es ist auch unwahrscheinlich, dass Tester das Wissen haben, Testfälle für etwas so Fortgeschrittenes wie das Streamen von Videos über Mobilfunknetze zu entwickeln. zu viel Isolation = Ärger.
Michelle Cannon
Des Weiteren denke ich, je vertikaler der Markt und je spezialisierter sie sind, desto mehr Integration zwischen den Teams ist erforderlich. Eigentlich sollte jeder mit der Vorstellung in die Testphase gehen, dass der Code unter bestimmten Testbedingungen funktioniert, aber mit größerer Wahrscheinlichkeit fehlerhaft ist als nicht
Michelle Cannon
Dies scheint zu funktionieren. Das Testteam erstellt ein Anwendungsfalldokument unter Verwendung der Funktionsspezifikation. Das Entwicklungsteam überprüft das Use-Case-Dokument anhand der technischen und funktionalen Spezifikationen und fügt nach Bedarf Fälle hinzu. Das Testteam entwickelt Testszenarien aus Anwendungsfällen. Entwicklungstest Testfälle überprüfen. Sicher zeitaufwändig, aber besser als spätere Tests in der Bereitstellungs- oder Produktionsphase.
Michelle Cannon