2010-03-31 12 views
6

SQLite Anspruch 679 Mal mehr Testcode als Produktion eins zu haben. http://www.sqlite.org/testing.htmlSQLite Testcode zu Produktionscode-Verhältnis

Weiß jemand, wie es möglich ist? Generieren sie automatisch Testcode? Was sind die Hauptbestandteile dieses "45678.3 KSLOC" Testcodes?

+1

Zum Vergleich: 45 MLOC ist ungefähr so ​​groß wie Windows XP. Natürlich, wie ich unten argumentiere, ist es einfacher, eine Zeile mit Testcode zu schreiben (und sie überlebt bis zum heutigen Tag), als eine Produktionscodezeile zu schreiben, und sie überlebt bis zum heutigen Tag. Wahrscheinlich enthält der "Testcode" für XP alle Codezeilen in Office 95, 98 und 2000 :-) –

Antwort

3

Vermutlich ist es möglich, dass die Entwickler 679 Mal so viel Zeit mit dem Schreiben von Testcode verbrachten wie mit dem Schreiben von Produktionscode. Denken Sie nur: Wenn sie sich stattdessen für 339 Mal so viel Testcode entschieden hätten, hätten sie zwei ganze Datenbank-Engines haben können, jede noch mit einer lächerlichen Menge an Testabdeckung.

Ich habe einmal einen Mitentwickler beobachtet, der versucht hat, einen wütenden Kunden wegen falscher Deadlines zu besänftigen, indem er ihnen mitteilte, dass er fünfmal so viel Testcode geschrieben habe wie der Produktionscode. Der Kunde war nicht beschwichtigt, wenn Sie sich vorstellen können. Zumindest glaube ich nicht, dass die 5X-Abdeckung mehr extrem ist.

+2

Es gibt wahrscheinlich mehr Leute, die Testcode schreiben als Produktionscode. Zum Beispiel beschreibt der Artikel ihre Richtlinie zu Regressionstests - Sie müssen den SQLite-Code überhaupt nicht verstehen, um einen Regressionstest für einen Fehler zu erstellen, den Sie gerade gefunden und gemeldet haben (obwohl jemand ihn in die Testumgebung einpassen muss). Trotzdem klingt 45 MLOC für mich unglaublich: Selbst wenn es alles in Repositories ist und daher "nicht automatisch generiert", könnte ein Großteil davon in erster Linie maschinell erzeugt worden sein, wenn auch nur durch Emacs-Makros ... –

+2

Ich vermute, dass viele der Tests (vor allem in TH3) von Handy-Herstellern beigetragen wurden. Sie haben ein gewisses Interesse an * sehr * gründlichem Testen der von ihnen ausgelieferten Datenbank-Engine ... –

+1

Sie entfernen und ersetzen auch alten Code aus dem Produkt, aber es sei denn, Sie haben eine Funktion entfernt Fälle. Also 679: 1 LOC übersetzt nicht zu etwas wie 679: 1 Mal. Sie können ganz einfach einen Tag verbringen * reduzieren * die Anzahl der LOC in dem Produkt und betrachten es Zeit gut ausgegeben, aber es lohnt sich selten, dies mit Testfällen zu tun. –

3

"Weiß jemand, wie es möglich ist?"

"Es ist möglich" 679-mal so viel Testcode zu haben, weil ein einzelnes Merkmal auf viele verschiedene Arten verwendet werden kann. Betrachten Sie nur eine einzelne Funktion, die zwei Parameter benötigt. Ich kann viel Testcode für diese eine Funktion erzeugen, die Randbedingungen und viele andere Kombinationen von Bedingungen testet. Wenn Sie das Setup/Teardown der Tests in Betracht ziehen, gibt es dort zusätzlichen Code. Abhängig von ihrem Test-Framework kann dieser Overhead die Menge an Code beim Testen signifikant erhöhen.

Worauf es wirklich ankommt, ist die Tatsache, dass ein Stück Software auf so viele verschiedene Arten verwendet werden kann, was bedeutet, dass Sie viele verschiedene Szenarien testen müssen. Dies ist das Schöne an eleganter Software, denn ein einfaches Programm kann auf zahlreiche Szenarien angewendet werden, aber das ist genau das Gleiche, was Software verifiziert und testet.

1

Es verwendet Tcl, um das Testframework zu betreiben, so dass es viel einfacher ist, Tests zu schreiben als die Implementierung zu schreiben. Dies ermutigt zu gründlichen Tests, die Sie in einer Datenbank haben wollen, ja? Darüber hinaus ist ein Großteil dieser Tests proprietär, um in eingebetteten Umgebungen zu testen. Ich stelle mir vor, dass einige Firmenbenutzer (oder Benutzer) für diese Art von Dingen bezahlt haben. Es ist auch gut möglich, dass die gleiche Funktion mehrmals getestet wird.

1

Blick auf Abschnitt 3.1 (OOM):

OOM Prüfung durch Simulation OOM Fehler erreicht wird. SQLite ermöglicht eine Anwendung anstelle einer Alternative malloc() Implementierung mit der sqlite3_config (SQLITE_CONFIG_MALLOC, ...) Schnittstelle. Die TCL und TH3 Test Kabelbäume sind beide in der Lage Einfügen einer modifizierten Version von malloc(), die nach einer bestimmten Anzahl von Zuweisungen manipuliert werden kann manipuliert werden. Diese instrumentierten mallocs können so eingestellt werden , nur einmal zu scheitern und dann wieder zu arbeiten, oder nach dem ersten Fehler weiterhin fehlgeschlagen. OOM-Tests werden in einer Schleife durchgeführt. Bei der ersten Iteration der Schleife ist das instrumentierte malloc auf der ersten -Zuordnung fehlgeschlagen.Dann wird eine SQLite-Operation durchgeführt und die Überprüfung erfolgt unter . Stellen Sie sicher, dass SQLite den OOM-Fehler korrekt verarbeitet hat. Dann wird der Zähler auf dem instrumentierten malloc um eins erhöht und der Test wird wiederholt. Die Schleife wird fortgesetzt, bis der gesamte Vorgang vollständig ausgeführt wird, ohne jemals auf einen simulierten OOM-Fehler zu stoßen. Tests wie dieser werden zweimal ausgeführt, einmal mit dem instrumentierten malloc, das nur einmal fehlschlägt, und erneut mit dem instrumentierten malloc-Set , um kontinuierlich nach dem ersten Fehler fehlzuschlagen.

Beachten Sie, dass Abschnitt 7 ausdrücklich 100% Kernabdeckung angibt, wie von GCOV bestimmt. Ich stimme mit Donal Fellows überein, dass das Testframework größtenteils für die Testabdeckung verantwortlich ist, die über das hinausgeht, was ein Anrufdiagramm vorschlagen würde. Es ist eine viel andere Sache zu sehen malloc() eingegeben nn mal und schreiben Sie einen Test dafür, als es ist Dutzende von Tests zu schreiben simuliert, um Umgebungen zu simulieren, wo malloc() wahrscheinlich fehlschlagen wird.

Ja, die resultierende Abdeckung ist ein Artefakt der Sorgfalt, jedoch ist auch die Auswahl eines Test-Frameworks, das diese Art von Sorgfalt ermöglicht.

Schließlich, wiederholen Sie die offensichtliche, nimmt malloc() nur einen einzigen void Zeiger. Dies legt nahe, dass die Tests, die um sie herum geschrieben wurden, durch bewusstes Design erstellt wurden und nicht automatisch generiert wurden.