Auf dem Prüfstand
Bei derart filigranen Problemen schleichen sich fast unweigerlich Bugs ein, deshalb ist eine Regressions-Testsuite unabdingbar. Listing 2 nutzt das Modul Sysadm::Install, um das Skript »bball-drop« wieder und wieder mit unterschiedlichen maximal erreichbaren Stockwerken von 0 bis 100 aufzurufen. Die Funktion »tap()« ruft das Skript auf und fängt praktischerweise Stdout und Stderr in verschiedenen Variablen ab. Die Ausgabe des Skripts sieht in etwa aus wie in Abbildung 4. Der reguläre Ausdruck in Zeile 12 von »suite« schnappt sich das ausgegebene Resultat mit dem höchsten erfolgreich absolvierten Stockwerk und der Gesamtzahl der notwendigen Schritte.
01 #!/usr/local/bin/perl -w
02 use strict;
03 use Sysadm::Install qw(:all);
04 use Test::More;
05
06 plan tests => 202;
07
08 for my $floor (0..100) {
09 my($stdout, $stderr, $rc) =
10 tap "bball-drop", $floor;
11
12 if($stderr =~ /floor: (d+) ((d+)/) {
13 my($result, $tries) = ($1, $2);
14
15 is($floor, $result,
16 "result: $result $tries");
17 ok($tries <= 15,
18 "result: $result $tries");
19 } else {
20 die "Unmatched: $stderr";
21 }
22 }
|

|
Abbildung 4: Im schlechtesten Fall benötigt der Algorithmus 15 Schritte.
|
Die zwei Test::More-Prüfkommandos in den Zeilen 15 und 17 verifizieren, ob das vom Skript ermittelte Resultat dem vorgegebenen Parameter entspricht. Das Modul Test::More vom CPAN liefert hierzu die bewährte Ausgabe im TAP-Format (»1 ok«). Das dem Modul beiliegende und generell mit neuen Perl-Distributionen verfügbare Skript »prove« wickelt eine Test-Harness darum, die bestätigt, dass alle 202 Tests erfolgreich abliefen (Abbildung 5). Das ist einfacher als die vom Testskript »suite« ausgegebenen 202 Zeilen manuell nach Fehlern zu durchsuchen. Alle Tests bestanden, der Kandidat hat 100 Punkte, einer erfolgreichen Karriere im IT-Sektor steht nun nichts mehr im Wege! (jcb)

|
Abbildung 5: Die Testsuite bestätigt, dass das Skript für alle möglichen Stockwerk-Kombinationen das richtige Ergebnis liefert und nie mehr als 15 Versuche benötigt.
|
|
Michael Schilli arbeitet als Software-Engineer bei Yahoo in Sunnyvale, Kalifornien. Er hat die Bücher "Goto Perl 5" (deutsch) und "Perl Power" (englisch) für Addison-Wesley geschrieben und ist unter [mschilli@perlmeister.com] zu erreichen.
|
| Whitepaper |
|
Usage Landscape Enterprise Open Source Data Integration
Die Nachfrage nach Datenintegrationslösungen für Unternehmen ist zunehmend gestiegen und vor allem das Interesse an Open Source Technologien wird immer größer. Doch wie und von wem werden Open Source Datenintegrationslösungen genutzt und welches Nutzungsverhalten lässt sich daraus ableiten? Das vorliegende White Paper präsentiert die Erfahrungswerte von über 1000 Open Source Nutzern und liefert fundierte Antworten auf diese Fragen.
Download PDF (Registrierung erforderlich)
|
|
Daten Migration - Eine Publikation von Bloor Research
Datenmigrationsprojekte überschreiten häufig das Budget, neigen zu Verzögerung und werden unter Umständen komplett abgebrochen. Bloor Research ist eines der weltweit führenden IT-Forschungs-, Analyse- und Beratungsunternehmen und wird in dem vorliegenden White Paper die wichtigsten Aspekte dieser Problematik näher beleuchten. Ferner werden praktische Empfehlungen für erfolgreiche Migrationsprojekte gegeben, die Sie auf Ihr nächstes Projekt übertragen können.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|
squirrel,
10.02.2010 10:53
;; bowl
(defun floorlist (&key (mxfloor 100))
"build 1st list for iteration"
(let ((steps (ceiling (- (sqrt (+ 1 (* 8 mxfloor))) 1) 2)))
(loop for x from steps downto 1
for y = steps then (+ x y)
while (< y mxfloor) collect y)))
(defun thrower (flist smash &key (ball 2) (ok 0))
"start throwing balls and watch what happens"
(let ((tfl (first flist)) (ret 'bang!))
(unless (or (null flist) (zerop ball))
(when (< tfl smash) (pop flist) (setf ok tfl ret 'ok))
(when (>= tfl smash) (decf ball)
(setf flist (loop for i from (1+ ok) to (1- tfl) collect i)))
(cons (list ret tfl) (thrower flist smash :ball ball
(loop for i from 1 to 101 do
(print i) (princ (thrower (floorlist :mxfloor 100) i)))
Die erste Kugel wird gleich aus dem 14. Stock abgeworfen.
Toralf Förster,
16.11.2009 11:21
$sum += $n;
push @stops, $sum;
die kostbare eingesparte CPU Zeit kann man ja dann an den eigenen BOINC Client verfüttern
R. Schmidt,
07.11.2009 16:57
#! /usr/bin/perl -w
# s. Linux Magazin Nr. 12 2009 S. 116
$n = 13;
for($i = $n + 1, $inc = $n, $k = 1; $i <= 100 && $inc > 0; $i += $inc, $inc -= 1, $k++)
{
print "Kugel: $k: Stock: $i\n";
}
print "\n";
Man möge mich bitte korrigiern, wenns falsch ist.