Connect with us

Entwicklung & Code

Flexibel und pflegeleicht: Testing ohne Mocks


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Robuste, automatisierte Tests sind feste Bestandteile der agilen Softwareentwicklung. Da Anforderungen und Rahmenbedingungen sich stetig ändern, müssen Entwicklerinnen und Entwickler kontinuierlich in der Lage sein, ihre Architektur anzupassen. Ihr Code muss wachsen und sich weiterentwickeln können. Sie müssen laufend bestehende Features erweitern, anpassen, umsortieren, zusammenführen oder aufteilen. Dazu benötigen sie die Unterstützung einer schnellen, verlässlichen und robusten Testsuite, die bestehende Funktionen der Software nicht beeinträchtigt.




Martin Grandrath ist Software-Developer und entwickelt seit über 15 Jahren Applikationen mit Web-Technologien. Seine Schwerpunkte sind neben Frontend-Architektur vor allem Software-Craftsmanship und testgetriebene Entwicklung. Seit 2023 arbeitet er als Senior IT-Consultant bei codecentric.

Auf Mocks basierende Tests verursachen häufig zusätzlichen Pflegeaufwand beim Refaktorieren, also Änderungen an der Codestruktur, die die Arbeit mit dem Code insgesamt vereinfachen, das Verhalten des Systems aber nicht verändern. Die Art und Weise, wie Mocks in der Praxis meist zum Einsatz kommen, führt zu einer Kopplung von Tests und Implementierungsdetails. Änderungen an diesen Details erfordern Anpassungen der Tests, was zulasten der Entwicklungsgeschwindigkeit geht.

Dieser Artikel zeigt auf, welche Kompromisse mit auf Mocks basierenden Tests verbunden sind und stellt mit dem Nullable-Entwurfsmuster von James Shore eine Alternative vor.

Mock-Objekte oder kurz Mocks (englisch für „Attrappe“) sind eine Unterkategorie der Test-Doubles, die in Unit Tests als Platzhalter für Produktionsobjekte dienen. Der Begriff Test-Double ist angelehnt an das Stunt-Double in Filmen. Weitere Arten von Test-Doubles sind Stubs, Spies oder Fakes.

Mocks zeichnen während eines Testlaufs auf, wie die Software mit ihnen interagiert: Welche ihrer Methoden ruft die Anwendung in welcher Reihenfolge und mit welchen Argumenten auf? Anschließend verifiziert der Unit-Test, ob die beobachteten Interaktionen mit den erwarteten übereinstimmen. Auf diese Weise werden die Interaktionen zwischen den Objekten zu einem integralen Bestandteil der Implementierung und der Tests. Diese Art von Tests wird als Interaction-based bezeichnet.

Gleichzeitig isolieren Mocks das zu testende Objekt von seinen Abhängigkeiten. Während des Tests wird also nur der Code eines einzelnen Objekts ausgeführt, während alle Interaktionspartner durch Mocks ersetzt werden. Tests, die Objekte in Isolation testen, nennt man solitary.

Auch wenn Solitary Interaction-based Tests ihre Vorzüge haben und sich im Laufe der Zeit zum Standard entwickelt haben, sind sie nicht frei von Nachteilen. Dass Tests an die Interaktionen zwischen Objekten gekoppelt sind, erschwert Refaktorierungen. Diese sind jedoch ein unverzichtbares Werkzeug, um die Qualität der Codebasis dauerhaft aufrechtzuerhalten.

Refaktorierungen, die die Interaktionen zwischen Objekten verändern, können zu False Positives führen: Tests schlagen fehl, obwohl das Programm als Ganzes keine Fehler enthält. Lediglich die Objektinteraktionen weichen von den Erwartungen der Tests ab. Eine Suite aus Interaction-based Tests macht die Codebasis dadurch insgesamt weniger flexibel, da die Tests die Implementierungsdetails fixieren.

Zudem kann es vorkommen, dass Solitary Tests Fehler nicht erkennen, wenn zwar alle Objekte in Isolation erwartungsgemäß arbeiten, es aber im Zusammenspiel der Objekte zu unerwünschtem Verhalten kommt. Um dem vorzubeugen, sind neben den Unit Tests zusätzliche Integrationstests erforderlich, die gezielt das Zusammenspiel mehrerer Objekte testen.

Eine Alternative stellen Sociable, State-based Tests dar.

In Sociable Tests interagiert das zu testende Objekt nicht mit Test-Doubles, sondern mit den echten Abhängigkeiten, die auch im Produktivbetrieb existieren. Fehler, die durch die Interaktion zwischen den Objekten entstehen, fallen im Test sofort auf. Separate Integrationstests sind nicht erforderlich.

State-based Tests verifizieren das sichtbare Verhalten von Objekten und ignorieren die darunter liegenden Interaktionen. Diese Tests reagieren daher sehr viel robuster gegenüber Refactorings, da sie sich nur für das Endergebnis interessieren und nicht für die Implementierungsdetails.

Die echten Produktionsobjekte in den Tests zu verwenden, statt sie durch Mocks zu ersetzen, führt zunächst zu einem Problem: Der zu testende Code muss mit APIs, Datenbanken oder dem Dateisystem kommunizieren. Diese Nebenwirkungen (Side Effects) würden zu nicht deterministischen Tests führen, da sie vom globalen Zustand abhängig sind, unter anderem von Drittsystemen. So könnte etwa ein Test fehlschlagen, weil eine Fremd-API mit anderen Daten antwortet, als es der Test erwartet.

Ein weiteres Problem sind die Auswirkungen, die API-Aufrufe haben können. Dass jede Ausführung der Warenkorbtests eine Kreditkarte belastet, ist nicht wünschenswert. Darüber hinaus muss es möglich sein, zu testen, wie sich ein Programm verhält, wenn eine Dritt-API mit unterschiedlichen Formaten, mit Fehlern oder gar nicht antwortet. Und schließlich verlangsamt die API-Anbindung die Tests.

Integrationstests sind zwar für den Übergang des zu implementierenden Systems mit der Außenwelt notwendig, aber die Nebenwirkungen sind für die Tests innerhalb des Systems unerwünscht.



Source link

Entwicklung & Code

Britisches Urteil: Apple hat App-Käufer abgezockt


Apple hat sein Monopol im App Store für iPhones und iPads missbraucht und jahrelang viel zu hohe Gebühren verrechnet. So urteilt das für England und Wales zuständige Wettbewerbsgericht Competition Apeal Tribunal. Es schreibt Apple umfangreiche Rückerstattungen an Kunden vor, denen in den meisten Fällen zweistellige Pfundbeträge winken. Da es aber Millionen betroffene Kunden gibt, geht es in Summe um hunderte Millionen Pfund. Sollte die Gerichtsentscheidung rechtskräftig werden, ist sie eine empfindlichere Niederlage für Apple, als es dieser Betrag erscheinen lässt.

Weiterlesen nach der Anzeige

Denn das Urteil betrifft den Zeitraum 1. Oktober 2015 bis 15. November 2024, und damit mehr als fünf Jahre vor dem EU-Austritt Großbritanniens. Entsprechend stellen die drei Richter auch auf EU-Recht ab. Ihre einstimmige Entscheidung hat also Vorbildwirkung nicht nur für Schottland und Nordirland, sondern für die gesamte EU. Außerdem läuft seit 2023 beim selben Gericht eine parallele Sammelklage im Namen jener App-Anbieter, die ihre Software sowie In-App-Verkäufe über denselben App Store abwickeln mussten. Ein Urteil zugunsten Apples in dem Parallelverfahren wäre eine Überraschung.

Das am Donnerstag ergangene Urteil geht auf eine bereits 2021 erhobene Sammelklage der Britin Dr. Rachael Kent zurück. Laut eigener Angabe ist sie die erste Frau, die je eine Sammelklage in Großbritannien angestrengt hat. Die Wissenschaftlerin forscht im Bereich digitale Kultur und Gesellschaft und lehrt am King’s College London. Als Besitzerin eines iPhones konnte sie Apps für ihr Handy ausschließlich über Apples App Store beziehen, weil Apple seit jeher alternative Vertriebswege verbietet. Dieses Monopol macht die Sache teuer, denn Apple verrechnet regelmäßig 30 Prozent Gebühren. Kent ging zu Gericht (Dr. Rachael Kent v Apple Inc and Apple Distribution International Ltd, Az. 1403/7/7/21).

Laut Urteilsbegründung hat Apple tatsächlich sein Monopol in zwei Märkten missbraucht: (Ver)Kauf von Apps, sowie Umsätze in Apps. In beiden Märkten hat Apple jeglichen Wettbewerb ausgeschlossen. Apple argumentierte, das sei durch Leistungswettbewerb gerechtfertigt, schließlich seien iPhones und iPads eine feine Sache. „Apples Verhalten kann in diesem Zusammenhang nicht als Leistungswettbewerb gerechtfertigt werden, da Apple überhaupt nicht im Wettbewerb steht“, heißt es in der Zusammenfassung der fast 400 Seiten dicken Urteilsausfertigung. Verschärfend komme hinzu, dass Apple auch für In-App-Käufe zur Nutzung seines Zahlungsabwicklungssystems zwinge.

Damit habe Apple mehrfach gegen Artikel 102 des Vertrages über die Arbeitsweise der Europäischen Union sowie gegen Kapitel II des britischen Wettbewerbsgesetzes verstoßen. „Apple hat seine Marktmacht missbraucht, indem es exzessive und unfaire Preise verlangt hat, in Form von Kommissionen für den Vertrieb von iOS-Apps und für die Zahlungsabwicklung von In-App-Käufen“, heißt es in der Urteilszusammenfassung weiter.

„Mit dem Binnenmarkt unvereinbar und verboten ist die missbräuchliche Ausnutzung einer beherrschenden Stellung auf dem Binnenmarkt oder auf einem wesentlichen Teil desselben durch ein oder mehrere Unternehmen, soweit dies dazu führen kann, den Handel zwischen Mitgliedstaaten zu beeinträchtigen. (…)“

Die Differenz zwischen den verlangten Gebühren und den Kosten sei signifikant und dauerhaft. Das zeige, dass die Preise überhöht sind. Der Tarif sei sowohl für sich genommen unfair, als auch im Vergleich zu den Online-Shops Epic Games‘, Microsofts und Steams.

Weiterlesen nach der Anzeige

Apple versuchte sich dadurch zu rechtfertigen, dass der Wettbewerbsausschluss zur Erreichung legitimer Ziele notwendig und verhältnismäßig sei. Beides lehnt das Gericht ab. Außerdem meinte Apple, ein einzelner App Store sei effizienter; davon würden Verbraucher in größerem Umfang profitieren, als sie durch die hohen Preise belastet würden. Auch das akzeptiert das Gericht nicht, schließlich schließe Apple jeglichen Wettbewerb in den beiden Märkten von vornherein aus.

Statt 30 Prozent sind laut Urteil maximal zehn Prozent für In-App-Käufe und maximal 17,5 Prozent für App-Käufe gerechtfertigt. Die Differenz habe allerdings nicht nur Kunden, sondern auch die Anbieter der Apps und App-Inhalte belastet. Die Anbieter hätten nur die Hälfte der Mehrbelastung an ihre Kunden weiter verrechnet.

Diese Hälfte soll Apple für den gut neun Jahre langen relevanten Zeitraum rückerstatten, zuzüglich acht Prozent Zinsen. Die andere Hälfte müssen sich die App-Anbieter erstreiten. Das dafür anhängige Verfahren heißt Dr Sean Ennis v Apple Inc and Others (Az. 1601/7/7/23).

Über die genauen Modalitäten der Rückerstattung sollen sich die Streitparteien tunlichst einigen und das Ergebnis bei der nächsten Tagsatzung, frühestens im November, präsentieren. Parallel kann Apple die Zulassung von Rechtsmitteln beantragen, was das Unternehmen sicher tun wird. Das Gericht muss dann entscheiden, gegen welche Teile des Urteils Apple berufen kann.


(ds)



Source link

Weiterlesen

Entwicklung & Code

AWS: CloudWatch generiert jetzt automatisch Incident-Reports


Amazon Web Services hat für seinen Monitoring-Dienst CloudWatch eine neue Funktion zur automatischen Erstellung von Incident-Reports angekündigt. Laut AWS können Kunden damit innerhalb weniger Minuten umfassende Post-Incident-Analyseberichte generieren. Das Timing der Veröffentlichung ist bemerkenswert: Sie erfolgt kurz nach dem schweren Ausfall der AWS-Infrastruktur, der zahlreiche Dienste auch von anderen Anbietern lahmlegte.

Weiterlesen nach der Anzeige

Die neue CloudWatch-Funktion sammelt automatisch Telemetriedaten, Nutzeraktionen während der Fehlersuche sowie Systemkonfigurationen und fügt diese zu einem strukturierten Bericht zusammen. Laut AWS umfassen die generierten Reports Executive Summaries, detaillierte Zeitverläufe der Ereignisse, Impact-Assessments und konkrete Handlungsempfehlungen. Das System korreliert dabei die verschiedenen Datenquellen, um ein möglichst vollständiges Bild des Vorfalls zu zeichnen.

CloudWatch ist Amazons zentrale Plattform für die Echtzeitüberwachung von Cloud-Ressourcen und -Anwendungen. Der Dienst bietet laut AWS-Dokumentation eine systemweite Übersicht über die Anwendungsperformance, operative Systemgesundheit und Ressourcenauslastung. Die neue Incident-Report-Funktion erweitert dieses Monitoring jetzt um eine strukturierte Nachbetrachtung von Störfällen.

Die automatisch erstellten Berichte sollen IT-Teams helfen, wiederkehrende Muster zu erkennen und präventive Maßnahmen zu implementieren. AWS verspricht, dass Kunden durch die strukturierte Post-Incident-Analyse ihre operative Aufstellung kontinuierlich verbessern können. Die Funktion erfasst dabei kritische Betriebstelemetrie, Servicekonfigurationen und Untersuchungsergebnisse automatisch – manuelle Zusammenstellungen entfallen. Inwiefern dies jetzt bereits bei Amazons jüngstem Ausfall intern geholfen haben könnte, bleibt jedoch offen. Nach den versprochenen wenigen Minuten lagen hierbei jedenfalls keine gesicherten Informationen vor.

Die neue CloudWatch-Funktion ergänzt die kürzlich eingeführte KI-gestützte Fehleranalyse in CloudWatch Investigations. Diese nutzt generative KI zur Diagnose und automatischen Ursachenanalyse von Betriebsproblemen. Die Integration mit AWS Systems Manager soll die Komplexität von Cloud-Umgebungen bei der Fehlerbehebung reduzieren. Laut AWS ist der Dienst in mehreren Regionen verfügbar, darunter Europe (Frankfurt). Die Kosten entsprechen denen von CloudWatch Investigations, für die Funktion gelten keine zusätzlichen Aufpreise.


(fo)



Source link

Weiterlesen

Entwicklung & Code

JavaScript: Testing-Framework Vitest 4.0 bringt visuelles Regressionstesting


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

Vitest liegt in der neuen Hauptversion 4.0 vor. Updates gibt es unter anderem für den Browser Mode, den Umgang mit dem End-to-End-Testing-Framework Playright und das Debugging mit der Visual-Studio-Code-Erweiterung.

Weiterlesen nach der Anzeige

Bei Vitest handelt es sich um ein Testing-Framework auf Basis des Frontend-Build-Tools Vite.js, das einen Fokus auf Schnelligkeit legt. Beide sind quelloffen verfügbar, jedoch arbeitet das Vite-Team derzeit auch an dem kommerziellen Angebot Vite+, das eine einheitliche JavaScript-Toolchain darstellen soll.


enterJS 2026

enterJS 2026

(Bild: jaboy/123rf.com)

Call for Proposals für die enterJS 2026 am 16. und 17. Juni in Mannheim: Die Veranstalter suchen nach Vorträgen und Workshops rund um JavaScript und TypeScript, Frameworks, Tools und Bibliotheken, Security, UX und mehr. Vergünstigte Blind-Bird-Tickets sind bis zum Programmstart erhältlich.

Der Browser Mode ist ein Feature der Vitest-API, das bislang als experimentell gekennzeichnet war und nun den stabilen Status erreicht hat. Damit lassen sich Tests nativ im Browser ausführen.

Um einen Provider festzulegen, ist nun die Installation eines separaten Pakets notwendig: @vitest/browser-playwright, @vitest/browser-webdriverio oder @vitest/browser-preview. Damit können Developer einfacher mit benutzerdefinierten Optionen arbeiten, und sie können auf die Kommentare /// verzichten.

Der Browser Mode erhält darüber hinaus eine neue Funktion: Visual Regression Testing. Das bedeutet, Vitest erstellt Screenshots von UI-Komponenten und Seiten und vergleicht diese mit Referenzbildern, um unbeabsichtigte visuelle Änderungen festzustellen. Das Visual Regression Testing lässt sich durch die Assertion toMatchScreenshot ausführen, wie das Entwicklungsteam demonstriert:

Weiterlesen nach der Anzeige


import { expect, test } from 'vitest'
import { page } from 'vitest/browser'

test('hero section looks correct', async () => {
  // ...the rest of the test

  // capture and compare screenshot
  await expect(page.getByTestId('hero')).toMatchScreenshot('hero-section')
})


Vitest 4.0 bringt ein Update für die Verwendung mit dem End-to-End-Testing-Framework Playwright: Es kann nun Playwright Traces generieren, wenn die trace-Option in der test.browser-Konfiguration gesetzt ist, oder mithilfe der Option --browser.trace=on, in der sich auch off, on-first-retry, on-all-retries oder retain-on-failure festlegen lassen. Die erstellte Trace-Datei lässt sich mit dem Playwright Trace Viewer öffnen. In der Extension für Visual Studio Code gibt es ebenfalls eine Neuerung: Dort lässt sich nun der „Debug Test“-Button beim Ausführen von Browser-Tests nutzen.

Die komplette Liste der Änderungen führt das Vitest-Team im Changelog auf und geht in einem Blogeintrag detaillierter auf die wichtigsten Neuerungen ein. Da es einige Breaking Changes gibt, empfiehlt es Entwicklerinnen und Entwicklern, vor einem Upgrade die Migrationsanleitung zu beachten.


(mai)



Source link

Weiterlesen

Beliebt