Folgende Benutzer bedankten sich beim Autor tar für den Beitrag:
DeathAndPain
Moin Ralf,ralf.wenzel hat geschrieben: ↑07.09.2024 19:27Du sollst nicht die DB-Selektionsmethode testen, sondern die, die die Daten dann verarbeitet. Und Tests müssen systemunabh. sein, sonst funktioniert ein Programm auf einem, aber nicht auf dem anderen System. Weil zufällig eine bestimmte Datenkonstellation da ist oder nicht.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
DeathAndPain
Zweisystemlandschaften sind häufiger, als man denken sollte. Damit will ich nicht sagen, dass sowas ratsam ist, wohl aber, dass wir nicht entscheiden, wie viele Systeme sich der Kunde hinstellt.Du brauchst mindestens drei Systeme auf denen deine Anwendung funktioniert.
Deshalb gibt es eine breite Palette an Cloningtools, mit denen man Echtdaten ins Testsystem replizieren kann - ggf. mit passender Anonymisierung. Im HCM-Bereich ist es bei Unternehmen, die selber abrechnen, nicht unüblich, jeden Monat den ganzen Personalstamm ins Testsystem zu clonen, dort abzurechnen, sich anzuschauen, mit welchen Fehlern (Datenfehler, also Pflegefehler, keine Bugs) die Abrechnung auf die Nase gefallen ist, diese Fehler im Prod zu korrigieren und dann dort die richtige Abrechnung zu machen.Wenn du sagst "mir egal ob das im Testsystem funktioniert", kannst du da nicht zuverlässig testen.
Wenn es solche Abhängigkeiten gibt, dann ist das etwas, was ich für schlechtes Design halte. Ein Include sollte nicht von mehreren Programmen genutzt werden (außer in sehr speziellen und übersichtlichen Sonderfällen). Wenn ich einer globalen Methode Parameter hinzufüge, um ihre Funktionalität zu erweitern, dann sollte diese neuen Parameter optional sein, und ich sollte darauf achten, dass die Methode sich wie gewohnt verhält, wenn ich sie ohne diese Parameter aufrufe.selbst wenn ich durch Änderung meines Entwicklungsobjekt ein völlig anderes zerschieße, von dem ich gar nicht wusste, dass es existiert
Für sowas würde ich in meiner Naivität Betaversionen mit Pionierkunden machen. Diese bekommen die neue Version vor allen anderen, riskieren damit eher Bugs, haben im Gegenzug aber den Premiumsupport mit direkter Telefonnummer von jemand, der Ahnung hat und ihnen direkt helfen kann. So hat die SAP es z.B. auch gemacht, als sie S/4 HANA eingeführt haben (ich habe bei solch Pionierkunden gearbeitet, wenngleich nicht im FI-Modul, wo das zum Einsatz gekommen ist).Und mir als Entwickler gibt es die Sicherheit, dass nicht am Tag nach Releasewechsel (wir arbeiten mit fünf Releases pro Jahr) das Telefon nicht mehr stillsteht.
Genau. Dann ist man bei 200 Testfällen für EIN Formular. Und darum sollte man die automatisch durchführen, weil man da händisch nicht mehr nachkommt.DeathAndPain hat geschrieben: ↑08.09.2024 16:00Alles kann man sowieso nicht testen. Wenn aus irgendeinem Grund Dein Programm mit Belegen im Wert bis 864 € und dann wieder ab 866 € funktioniert und genau dann dumpt, wenn ein Beleg 865 € lautet, dann wirst Du das mit hoher Wahrscheinlichkeit auch mit Deinen automatisierten Tests nicht finden. Man muss einfach so viel testen, dass der Test als repräsentativ für alle typischen Anwendungsfälle gelten kann.
Abhängigkeiten hast du IMMER, das ist das Wesen des OO, dass Klassen wiederverwendet werden. Und ja: Der Mensch macht Fehler.DeathAndPain hat geschrieben: ↑08.09.2024 16:00Wenn es solche Abhängigkeiten gibt, dann ist das etwas, was ich für schlechtes Design halte. Ein Include sollte nicht von mehreren Programmen genutzt werden (außer in sehr speziellen und übersichtlichen Sonderfällen).
Eh Alter. Hier arbeiten 20, 25 Leute zum Teil seit 20 Jahren an einem SAP-System mit hohem Individualanteil am Coding. Natürlich kann das keiner mehr überblicken. Da gehen Leute in Rente, Angestellte und Freiberufler kommen und gehen, etc.DeathAndPain hat geschrieben: ↑08.09.2024 16:00
Was Du hier beschreibst, klingt wie ein Kartenhaus, wo man nirgends anfassen darf, sonst bricht alles zusammen, weil es überall Abhängigkeiten und Verzahnungen Deiner Codes gibt, die niemand mehr überblickt. Ich will man hoffen, dass Deine Software nicht so gestrickt ist.
Genau. Ich führe einen neuen Rententarif ein. Da wird monatelang (!) programmiert und gecustmized.DeathAndPain hat geschrieben: ↑08.09.2024 16:00Für sowas würde ich in meiner Naivität Betaversionen mit Pionierkunden machen.
Und wenn sie nur für Endkunden arbeiten. Gerade die wollen ja wissen, ob Änderungen am Coding zu nebeneffekten führen. Ich baue für einen Kunden gerade eine Schnittstelle. Ein bestimmter Dateninput soll einen bestimmten Datenoutput liefert. Genau dafür mache ich nach und nach auch Testfälle. Leider hat der Kunde keine Beispieldaten bereit gestellt. Diese trudeln erst beim Echttest aktuell ein. Kommt es da zum Fehler, so bilde ich das als Unit-Test nach. Am Ende müssen bei einer Korrektur immer noch alle vorherigen Tests laufen - wenn es keine Neuanforderungen gab.ich fürchte, dass gaaaanz viele Leser in diesem Forum für SAP Endkunden arbeiten. Diese haben im Allgemeinen aber genau 1 System auf dem die Programme funktionieren müssen.
Nein. Auch bei kleinen Projekten sind Unit-Test sinnvoll - insbesondere, wenn man es lernen will. Wenn man da etwas Übung hat, hat man schnell mal drei vier Test angelegt, um wenigstens ein Grundgerüst zu haben. Ich ärgere mich jedesmal, wenn es heißt: "Mach mal schnell, das muss doch NUR". Am Ende wird da ein riesen Report draus, ohne Unit-Test, schlecht strukturiert etc. Strukturierung ist hier das A und O. Wenn man nicht mit DAO und Interfaces arbeiten will, um mal die Datenzugriffschicht gehen eine MOCK-Schicht tauschen zu können, dann schreibe ich wenigsten die Methoden (oder FORM-Routinen) so, dass sie ohne DB-Zugriff auskommen. Wenn es dann zu einen Unit-Test gibt, schreibe ich das groß als Kommentar dran: "Kein DB-Zugriff, Unit-Tests beachten".Dann würde ich das als mittelschweres Großprojekt einstufen, bei dem Interfaces, Unit-Tests und Mockingdödelingen offenbar sinnvoll wäre.
Sag du mir, wieviel Zeit die menschlichen Tester brauchen um alle Konstellationen bei jeder Codekorrektur manuell zu testen. Nehmen wir hier nur die SAP-Beleg, das sind sehr breite Tabellen. Kein menschlicher Tester kann korrekt prüfen, ob wirklich alle Werte beim Test in diesen Tabellen richtig sind. Das kann man nur maschinell machen. Genau solche manuellen Test hat früher in der alten Firma unsere Sekretärin gemacht. Die musste dann aber ganz genau dokumentiert bekommen, was sie drücken muss und welche Werte sie per Auge! vergleichen muss. Dauerte ca. 1 Woche und da war noch nicht einmal alles abgedeckt. Ich hab mich dann hingesetzt und daraus Unit-Test gemacht. Die liefen dann 2min durch und man konnte auch mal zwischendurch einfach die Tests durchlaufen lassen und nicht vor jeder Produktauslieferung.Aber sag mir bitte mal grob, wieviel Zeit für den ganzen Firlefanz draufgeht,
Dafür gibt es eben das DAO. Du willst an der Stelle nicht wissen, welche Daten auf der Datenbank laden. Du willst der Stelle wissen, ob die Daten bis dort hin korrekt angekommen sind. Bsp. - Methode INSERT_INTO_BUT000(). Im realen DAO schreibt die Methode die Daten in die BUT000. Im TestDAO prüft sie nur, ob die Daten wie gewünscht ankamen. Aber diese Art der Programmierung mit dem umfangreichen DAO ist laut CleanCode ABAP (bei Github) nicht so empflohlen, weil schwierig wartbar. Schlecht wartbar aber nur, wenn alles in eine Klasse stopft und dann 'zig KonstellationsKombinationen testen muss.Was ich nicht verstehe: wenn meine Methode DB-Daten abruft (und sei es über 5 verschachtelte Aufrufe über 3 andere Klassen), dann will ich beim Prüfen ja nicht verhindern, dass sie das tut, sondern im Gegenteil: genau sehen, dass sie es tut und wie sie damit weiter hantiert.
Folgende Benutzer bedankten sich beim Autor msfox für den Beitrag:
ralf.wenzel
Du würdest in meinem Beispiel also einen Testfall für jeden nur denkbaren Betrag machen. Unter Berücksichtigung des Umstands, dass es auch Centbeträge gibt, wärst Du für den Bereich zwischen 0,01 € und 1000 € schon bei 100.000 "Testfällen".Ralf hat geschrieben:Genau. Dann ist man bei 200 Testfällen für EIN Formular. Und darum sollte man die automatisch durchführen, weil man da händisch nicht mehr nachkommt.DeathAndPain hat geschrieben:Wenn aus irgendeinem Grund Dein Programm mit Belegen im Wert bis 864 € und dann wieder ab 866 € funktioniert und genau dann dumpt, wenn ein Beleg 865 € lautet, dann wirst Du das mit hoher Wahrscheinlichkeit auch mit Deinen automatisierten Tests nicht finden. Man muss einfach so viel testen, dass der Test als repräsentativ für alle typischen Anwendungsfälle gelten kann.
Einer Klasse, die wiederverwendet wird, sollte es egal sein, von wem. Beispielsweise habe ich mir eine globale Methode gebaut, der ich eine Tabelle von Personalnummern übergeben kann, und die Klasse sucht und liefert mir performant für alle Personalnummern den Personalbereich nebst der textuellen Bezeichnung desselben. Das kann man immer wieder in allen möglichen Reports brauchen.Ralf hat geschrieben:Abhängigkeiten hast du IMMER, das ist das Wesen des OO, dass Klassen wiederverwendet werden.
Ich will behaupten, dass jede Klasse ein klar definiertes (und dokumentiertes) Verhalten haben sollte. Jeder Aufrufer muss sich überlegen, ob er für seine Zwecke diese Funktionalität brauchen kann oder doch lieber einen eigenen Code für seinen Anwendungsfall programmieren sollte. Da kann es nicht sein, dass eine Korrektur an solch Klasse wie die Dominosteine alle möglichen und unmöglichen Aufrufer zum Umfallen bringt und Deine Software ins Chaos stürzt, weil die Klasse irgendwie aufruferspezifisch unterschiedliche Verhaltensweisen an den Tag legt.Ralf hat geschrieben:Da willst du ernsthaft behaupten, einer hätte da ÜBERBLICK über das Gesamtsystem???
Ganz genau. Wenn Du das als professionelle Lösung verkaufen willst, sollte es eine erfolgreiche Betaphase durchlaufen haben. Theoretische Tests zu machen und dann zu beten, dass es im praktischen Alltag genauso gut laufen wird und Deine theoretisch erdachten Testfälle alles abdecken, halte ich für naiv. Das endet so wie diverse Windowsupdates der letzten Zeit...Ralf hat geschrieben:Ich führe einen neuen Rententarif ein. Da wird monatelang (!) programmiert und gecustmized.
Aber erstmal nur für 50 Rentner und dann gucke ich mir ein paar Monate an, ob das produktiv reibungslos läuft und DANN biete ich das den anderen an?
Der Gesetzgeber räumt immer längere Umstellungszeiträume ein. Bei der eAU (elektronische Arbeitsunfähigkeitsbescheinigung, also das papierlose Attest) war es nach meiner Erinnerung ein Jahr zwischen Aktivschaltung des GKV-Servers (so dass man mit diesem kommunizieren und Atteste abfragen konnte) und dem Verbindlich-Werden dieser Lösung für alle Arbeitgeber.Ralf hat geschrieben:Abgesehen davon dass das gesetzlich nicht geht. Wenn die Politik bestimmt, dass bestimmte Rentenmodelle ab Tag X verfügbar sind, kann ich die nicht für Pilotrentner früher oder für andere später einführen.
Tatsächlich glaube ich das nicht. Wenn solch ein Ansinnen an Dich gestellt wird, obgleich Du nicht Anbieter einer Software von der Stange dafür bist, dann wird von Dir eine Individuallösung erwartet. Da wird ein Projektplan aufgestellt mit einem Zeitplan für Spezifikation, Implementierung (ggf. als Zyklus) usw.. Dieser Zeitplan kann durchaus so aussehen, dass man sagt: "Bis Dezember entsteht ein Prototyp, den wir mit einen Monat lang mit einer Anzahl Testmitarbeiter fahren. Wenn alles rund läuft, bieten wir das ab Januar allen an."Ralf hat geschrieben:Oder wenn eine Firma kommt und sagt „Wir brauchen einen Rententarif für unsere Mitarbeiter, weil wir denen Betriebsrente anbieten wollen. Der unterschreibt bei dir, wenn du denen mit Pilotrentnern kommst? Die sagen „oh, sorry, wir dachten Sie hätten das schon einmal gemacht — OK, dann wenden wir uns lieber an Profis mit Erfahrung“.
Für eine Übergangsphase ist das einfach notwendig. Einen komplett neu entwickelten Prozess mit einem Schlag ohne praktische (!) Erfahrung für den ganzen Konzern live zu nehmen, wäre grob fahrlässig. Sicherlich ist es sinnvoll und notwendig, ordentlich zu testen. Aber dazu gehört eben auch eine Beta-Phase im Produktivsystem unter "Hyper-Care"-Bedingungen.Ralf hat geschrieben:Weil das ja so billig ist, zwei Prozesse parallel zu unterhalten.