TDD für die Stapelverarbeitung: Wie geht das?

14

Ich mag "rot / grün / refactor" für RoR, etc. ganz gut.

Mein Tagesjob umfasst die Stapelverarbeitung sehr großer Dateien von Drittanbietern in Python und anderen benutzerdefinierten Tools.

Die Attribute dieser Dateien sind hoch, daher gibt es eine Menge Korrekturen / Verbesserungen, die ziemlich häufig angewendet werden.

Regressionstests über bekannte Testdaten mit erwarteten Ergebnissen existieren nicht. Das Nächste läuft gegen die letzte Charge mit neuen Testfällen, die von Hand codiert wurden. Stellen Sie sicher, dass sie nicht explodieren. Führen Sie dann Stichprobenprüfungen und statistische Tests durch, um festzustellen, ob die Daten noch in Ordnung sind.

F >> Wie lassen sich TDD-Prinzipien in eine solche Umgebung integrieren?

tomPorter
quelle
1
Sind die Daten, der Quellcode oder beides abgehackt?
Rwong

Antworten:

5

Nur ein FYI: Unit Testing ist nicht gleichbedeutend mit TDD. TDD ist ein Prozess, bei dem Unit Testing ein Element ist.

Wenn Sie Unit-Tests implementieren möchten, gibt es eine Reihe von Möglichkeiten:

Alle neuen Codes / Erweiterungen werden getestet

Auf diese Weise müssen Sie nicht alles durchlaufen und Unit-Tests durchführen, was bereits vorhanden ist, sodass der anfängliche Aufwand für die Implementierung von Unit-Tests viel geringer ist.

Testen Sie einzelne Daten

Das Testen von Objekten, die große Datenmengen enthalten können, kann zu vielen Randfällen und Lücken in der Testabdeckung führen. Betrachten Sie stattdessen die Option 0, 1, many. Testen Sie einen Stapel mit 0 Elementen, 1 Element und vielen Elementen. Testen Sie im Fall von 1 Element die verschiedenen Permutationen, in denen sich die Daten für dieses Element befinden können.

Testen Sie von dort aus die Kantenfälle (Obergrenzen für die Größe einzelner Elemente und die Anzahl der Elemente im Stapel). Wenn Sie die Tests regelmäßig ausführen und lange Testläufe haben (große Stapel?), Lassen die meisten Testläufer eine Kategorisierung zu, damit Sie diese Testfälle separat ausführen können (nächtlich?).

Das sollte Ihnen eine starke Basis geben.

Aktuelle Daten verwenden

Es ist keine schlechte Idee, 'aktuelle' zuvor verwendete Daten wie jetzt einzugeben. Ergänzen Sie es einfach mit wohlgeformten Testdaten, damit Sie bestimmte Fehlerstellen sofort erkennen. Wenn Sie die tatsächlichen Daten nicht verarbeiten können, können Sie die Ergebnisse des Batch-Prozesses überprüfen, einen Komponententest erstellen, um den Fehler zu replizieren, und dann mit nützlichen Regressionsfällen wieder in Rot / Grün / Refaktor wechseln.

Steven Evers
quelle
3
Stellen Sie nur sicher, dass Sie die Testdaten bei Bedarf angemessen anonymisieren.
Frank Shearar
1

Es ist das gleiche wie in jeder anderen Umgebung.

Teilen Sie die Logik in die kleinste Granularität auf. Auf diese Weise erhalten Sie eine Reihe von Regeln für den Prozess. Jede Regel deckt einen für Ihren Prozess erforderlichen Logikpunkt ab.

Dann schreiben Sie einen Test für jede Regel. Diese Tests schlagen fehl. Schreiben Sie den Code, um den Test zu beheben.

Der Regressionstest mit bekannten Testdaten, von dem Sie sprechen, ist kein Komponententest. Das wäre ein Integrationstest, das ist anders als bei TDD. Mit TDD haben Sie möglicherweise einen einzelnen Test, um zu testen, ob Sie eine Datei laden können, aber im Allgemeinen würde kein anderer Test tatsächlich in die Nähe einer Datendatei mit Testdaten gelangen. Stattdessen simulieren Sie die Daten, die zum Ausführen einer bestimmten Regel erforderlich sind, mithilfe eines spöttischen Objekts.

Mongus Pong
quelle
1

Beginnen Sie mit einer guten Softwarestrategie und wenden Sie dann TDD an.

(Haftungsausschluss: Ich habe möglicherweise "Abwanderung" oder TDD oder beides falsch verstanden.)

Hier ist meine vorgeschlagene Strategie für die Stapelverarbeitung von "schmutzigen Daten": Specify-Triage-Execute.

  • Verfassen Sie eine Spezifikation der Daten streng und eng, decken Sie jedoch die Mehrheit (z. B. 80% oder mehr) der eingehenden Daten ab. Nennen Sie diese Spezifikation 1 .
  • Entwickeln Sie ein Triage- Modul (TDD, wenn Sie möchten), das entscheidet, ob ein Datensatz die Spezifikation 1 erfüllt.
    • Stellen Sie sicher, dass das Modul sehr schnell läuft.
    • Das Modul sollte true / false zurückgeben: Es erfüllt entweder alle Regeln oder nicht.
  • Entwickeln Sie ein Execute- Modul (TDD, wenn Sie möchten), das einen Datensatz analysiert, von dem bekannt ist, dass er die Spezifikation 1 erfüllt, und das alle von Ihren Kunden benötigten Aufgaben ausführt.
  • Wenden Sie Triage 1 auf alle eingehenden Daten an.
    • Das Ergebnis ist ein Boolescher Wert für jeden Datensatz. Dies unterteilt die eingehenden Daten grundsätzlich in: Spezifikation 1 oder Unbekannt.
    • Wenden Sie Execute 1 auf die Specification 1-Daten an, wann immer dies vom Kunden benötigt wird.
  • Lockern Sie die Regeln von Spezifikation 1, um 80% der verbleibenden Daten zuzulassen. Nennen Sie diese Spezifikation 2 .
  • Entwickle Triage 2 und führe 2 aus . Wenden Sie es auf alle Daten an, die nicht der Spezifikation 1 entsprechen.
  • Wiederholen Sie diesen Vorgang so oft, bis die verbleibenden Daten so klein sind, dass sie jeden Tag manuell verarbeitet werden können.

Der Effizienz-Leckerbissen:

Speichern Sie alle Triage-Ergebnisse (historisch oder aktuell), die einem Datensatz zugeordnet sind. Wenn seit der letzten Ausführung keine Triage-Module geändert wurden, müssen die alten Daten nicht erneut verarbeitet werden.

Das "Du musst wissen, was Du bauen willst, bevor Du TDD machst":

Das Specify-Triage-Execute ist eine Möglichkeit, die Anforderungen auf jeder Ebene überschaubar zu halten und zukünftiges Wachstum zu ermöglichen.

(Wenn jemand die korrekten Standardbegriffe für diese drei Schritte kennt, lass es mich wissen, ich bearbeite meine Antworten.)

rwong
quelle