La logica piccola dovrebbe essere testata?

0

Ho diverse classi che assomigliano a: (alcune hanno dozzine di casi)

function __construct($value) {
    switch ($value){
        case "1":
            $value = Values::One;
            break;
        case "2":
            $value = Values::Two;
            break;
        case "3":
            $value = Values::Three;
            break;
        case "4":
            $value = Values::Four;
            break;
        default:
            $value = null;
    }

    parent::__construct($value);
}

E sto già testando la classe genitore, dovrei provare anche questa lezione? dovrei testare ogni possibile percorso? cioè:

assertEquals(Values::One, new Clazz(1));
assertEquals(Values::Two, new Clazz(2));
assertEquals(Values::Three, new Clazz(3));
assertEquals(Values::Four, new Clazz(4));

o fai una sola affermazione? assertEquals(Values::One, new Clazz(1)); solo

    
posta Michael 09.08.2017 - 15:50
fonte

2 risposte

4

Questo tipo di logica di mappatura è molto facile da commettere errori quando lo scrivi inizialmente o quando viene eseguito un aggiornamento.

Dovresti avere qualche test che verifichi che venga eseguita la mappatura corretta, compreso ciò che accade se un valore che non può essere mappato viene passato. Se lo hai come parte dei test per la classe genitore, allora va bene. Altrimenti, dovresti crearlo per la classe corrente.

Se hai solo pochi valori, come nell'esempio che hai presentato, potresti farla franca semplicemente facendo una revisione che tutti i valori sono mappati correttamente, ma se hai una dozzina o più valori in una mappatura, quindi diventa molto facile trascurare un errore.

    
risposta data 09.08.2017 - 16:27
fonte
2

Se fai uno sviluppo testdriven, un esempio di lavoro e un axample non funzionante sono sufficienti.

Se vuoi un test automatico (con copertura completa) scrivere il test è molto più lavoro dell'implementazione reale e non puoi mai essere sicuro se il tuo test copre tutti gli aspetti: cioè se in seguito si introduce un Values::Fifteen hai un test fallito che ti ricorda che __construct(...) è incompleto?

Per questo tipo di problema può essere più semplice scrivere un test di integrazione se hai una funzione inversa come questa

foreach(int id : allIds) assertThat(id).equals(name2id(id2Name(id))

in questo modo non sai se id e nome hanno la giusta rappresentazione, ma puoi essere sicuro che per ogni id c'è una conversione funzionante.

Uso questa tecnica per verificare che la serializzazione dell'oggetto (de) sia completa:

String jsonString = aTestJsonWhereEveryPropertyHasAVaule;
MyComplexObject myObject = json2MyComplexObject(jsonSting);
String  result = myComplexObject2Json(myObject);
assertThat(jsonString ).equals(result);
    
risposta data 09.08.2017 - 17:16
fonte

Leggi altre domande sui tag