Frage

Was ist der beste Weg, um Unit-Test großer Datenmengen? Einige Legacy-Code, die ich beibehalten hat Strukturen von hundert Mitgliedern oder mehr; andere Teile des Codes, die wir erstellen oder analysieren Datensätze von Hunderten von Proben arbeiten.

Der beste Ansatz, den ich bisher gefunden habe ist es, die Strukturen oder Datensätze von der Festplatte serialisiert, die Operationen unter Test durchzuführen, serialisiert werden die Ergebnisse auf der Festplatte, dann diff Dateien die serialisierten Ergebnisse gegen Dateien mit erwarteten Ergebnisse enthält. Das ist nicht sehr schnell, und es verletzt das „nicht berührt die Platte“ Prinzip der Unit-Tests. die einzige Alternative, die ich mir vorstellen kann jedoch (Code schreiben Hunderte von Mitgliedern und Datenpunkte zu initialisieren und testen) scheint unerträglich langweilig.

Gibt es bessere Lösungen?

Keine korrekte Lösung

Andere Tipps

Wenn das, was Sie versuchen zu erreichen, in der Tat, ein Gerät zu testen, sollten Sie die zugrunde liegenden Datenstrukturen verspotten und die Daten simulieren. Diese Technik gibt Ihnen die vollständige Kontrolle über die Eingänge. Zum Beispiel kann jeder Test, den Sie einen einzelnen Datenpunkt schreiben kann handhaben und Sie werden für jede Bedingung eine sehr prägnante Reihe von Tests haben. Es gibt mehrere Open-Source-spöttischen Frameworks gibt, ich persönlich Rhino Mocks empfehlen ( http: // ayende.com/projects/rhino-mocks/downloads.aspx ) oder NMock ( http: //www.nmock .org ).

Wenn es nicht möglich ist, für Sie die Datenstrukturen verspotten ich Refactoring empfehlen, so Sie in der Lage sind :-) Es lohnt sich! Oder Sie können auch versuchen TypeMock ( http://www.typemock.com/ ), die ermöglicht spöttischen von konkreten Klassen.

Wenn jedoch, wenn Sie Tests gegen große Daten tun setzt Sie wirklich Funktionstests nicht Unit-Tests laufen. In diesem Fall Laden von Daten in eine Datenbank oder von der Festplatte ist ein typischer Betrieb. Anstatt es vermeiden Sie arbeiten sollte es parallel immer läuft mit dem Rest Ihres automatisierten Build-Prozess, so dass die Auswirkungen auf die Leistung ist nicht auf alle Ihre Entwickler halten.

Dies ist immer noch ein gangbarer Weg. Obwohl, ich würde das als Funktionstest klassifizieren oder nur kein reines Gerät zu testen. Eine gute Unit-Test wäre eine Auswahl von diesen Aufzeichnungen zu nehmen, die auf eine gute Verteilung der Grenzfälle gibt, die auftreten können, und schreiben Sie diejenigen auf. Dann haben Sie Ihre letzte „Annahme“ oder „funktional“ Test mit Ihrem Bulk-Test auf allen Daten.

Ich habe diesen Ansatz verwenden, wenn große Datenmengen zu testen, und ich finde es gut genug funktioniert, weil die kleinen Einheiten verwaltbar sind, und ich weiß dann, dass die Bulk-Test funktioniert, und es ist alles automatisch.

  

Der beste Ansatz, den ich bisher gefunden habe ist es, die Strukturen oder Datensätze von der Festplatte serialisiert, die Operationen unter Test durchzuführen, serialisiert werden die Ergebnisse auf der Festplatte, dann diff Dateien die serialisierten Ergebnisse gegen Dateien mit erwarteten Ergebnisse enthält.

Ich habe Code geschrieben, die die obige Technik verwendet, außer, statt von der Festplatte im Test Serialisierung, habe ich serialisierten Daten in einen Byte-Array umgewandelt, die die Compiler in die ausführbaren Datei für Sie platzieren können.

Zum Beispiel können Sie Ihre serialisierten Daten in umgewandelt werden:

unsigned char mySerialisedData[] = { 0xFF, 0xFF, 0xFF, 0xFF, ... };

test()
{
    MyStruct* s = (MyStruct*) mySerialisedData;

}

Für eine ausführlichere Beispiel (in C #) sehen diese Unit-Test . Sie zeigt ein Beispiel für einige fest codierte serialisierten Daten als Eingabe für Tests unter Verwendung Montage Signierung testen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top