ich habe ein neues hobby: testfälle schreiben. unsere php bibliothek, die wir in allen programmen verwenden heisst xorc. wir fügen regelmäßig funktionen hinzu oder schreiben welche um. ganz normal. eine der basisfunktionen ist unser OR mapper genannt xorcstore. ich hatte mir seit geraumer zeit vorgenommen die API zu überarbeiten: schoenere namen finden (zb: find() statt select(), create() statt insert()..), die parameterreihenfolge vereinheitlichen usw.
da ich ein fan von rails geworden bin, lag die idee nahe, sich bei den funktionsaufrufen an activerecord zu orientieren. also habe ich angefangen die funktionen anzugleichen. das führte dann dazu, dass ich immer größere teile komplett umgeschrieben habe. also nach anderthalb tagen sprach ich vor mich hin: ich arbeite jetzt an einem rails clone. genauer: ich portiere activerecord nach php.
ich fing an die fixtures und testfälle von activerecord zu kopieren, in php syntax zu setzen und das (häufig fehlende) feature in meine xorcstore_AR klasse einzubauen. so eine OR mapping bibliothek ist der klassische kandidat für unittests. wie oft ändert man eine kleinigkeit und fragt sich: welche auswirkung hat das jetzt auf die anderen anwendungen? das abfahren der automatischen tests gibt da schon eine recht hohe sicherheit, dass man sich nichts kaputtmacht. in meinem fall entwickelten sich die tests zu einem gradmesser: wieviel habe ich schon geschafft? ach, soviel!
… daraus folgt: es macht süchtig! nochein test und noch einer. juhu! gestern abend nach gut einer woche arbeit habe ich dann meinen 601. test erfolgreich durchgebracht. allerdings waren das dann nummerntests, die mir auf einen schlag über hundert testfälle bescherten.
dieses beispiel enthält 62 testfälle. das macht dann spaß:
function test_valid_num_of_with_int_only_and_nil_allowed(){
$NIL = array(null, "", " ", " \t \r \n");
$FLOAT_STRINGS = array(0.0, "+0.0", -0.0, "10.0", 10.5,
"-10.5", -0.0001, -090.1);
$INTEGER_STRINGS = array(0, +0, -0, 10,
+10, -10, 0090, -090);
$FLOATS = array_merge(array("0.0", "10.0", 10.5,
-10.5, -0.0001), $FLOAT_STRINGS);
$INTEGERS = array_merge(array(0, 10, -10),
$INTEGER_STRINGS);
$JUNK = array("not a number", "42 not a number",
"0xdeadbeef", "00-1", "--3", "+-3",
"+3-1", "-+019.0", "12.12.13.12");
$topic=new Topic;
$topic->validation->reload($topic);
$topic->validation->add(
'validates_numericality_of',
array(
'approved'=>array(
"allow_null"=>true,
'only_integer'=>true)
)
);
# print_r(localeconv());
foreach(array_merge($JUNK, $FLOATS) as $value){
var_dump($value);
$t = $topic->create(array(
"title" => "numeric test",
"content" => "whatever",
"approved" => $value));
$this->assertFalse($t->is_valid(),
"{$value} not rejected as a number");
$this->assertTrue($t->errors->on('approved'));
}
foreach(array_merge($NIL, $INTEGERS) as $value){
$t = $topic->create(array(
"title" => "numeric test",
"content" => "whatever",
"approved" => $value));
$this->assertTrue($t->is_valid(),
"{$value} not accepted as a number");
}
}


