The reasoning at the base of Test Driven Development

Sau mai pe intelesul tuturor, testele trebuie sa testeze atat ca functia (sau metoda, sau clasa) sa faca ce trebuie, cat si sa refuze orice input invalid.

Un lucru am observat, insa, pe forumul asta, discutiile sunt teoretice, dar de multe ori nu se da nici un exemplu in cod, desi de multe ori s-ar scuti multe discutii pe langa subiect daca s-ar introduce cod, in argument. Orice cod, inclusiv pseudo-cod… Asa ca m-am decis sa fiu primul care sa incerce asta.

<?php
// functia de testare
function test($function_name, $function_input, $desired_output){
    $function_call = $function_name.'('.$function_input.');';
    $function_output = exec($function_call);
    if($function_output != $desired_output)
        echo 'Failed: '.$function_name.
             '<br/>-want: '.$desired_output.
             '<br/>-got : '.$function_output.
             ' :<br/>-input:<br/>'.$function_input;
    else
        echo Passed: '.$function_name.
             '<br/>-got: '.$desired_output.
             '<br/>-input: <br/>'.$function_input;
}

Vom folosi functia de testare de mai sus, in exemplele de mai jos. Stiu ca poate nu este facuta profesional, insa consider necesar a se explica si motorasele din spatele testingului, nu doar “how to use”…

<?php
// funtia pe care sa o testam
function division($dempartit,$impartitor){
    $rezultat=$dempartit / $impartitor;
    return $rezultat;
}

// testele propriuzise
test('division', '3,1',3);       // 3/1 = 3
test('division', '3,2','1.5');   // 3/2 = 1.5
test('division', '3,0',null);    // 3/0 = null

In exemplul dat, am testat impartirea a doua numere. Dupa cum puteti vedea, functia data a esuat sa evite cazul impartirii la zero, asa ca vom rescrie functia si rulam aceleasi teste, adaugand un nou test, pentru a ne asigura ca returnam ce trebuie.

<?php

/* functia pe care sa o testam, dupa ce am gasit un caz in care nu functioneaza 
 * si am reparat-o. Testele raman neschimbate. Nu funcita decide ce teste 
 * scriem, ci testele decid ce functie scriem, deci functia decide datele de 
 * intrare si datele de iesire pe care le dorim.
 */
function division($dempartit,$impartitor){
    if($impartitor==0)
        return null;
    $rezultat=$dempartit / $impartitor;
    return $rezultat;
}

// testele propriuzise
test('division', '3,1',3);       // 3/1 = 3
test('division', '3,2','1.5');   // 3/2 = 1.5
test('division', '3,0',null);    // 3/0 = null
test('division', '3,0','null');  // null != String(null)

Acum toate testele ar trebui sa treaca. Daca am facut vre-o greseala, va rog s-o corectati!

1 Like