In che misura devo testare cosa non dovrebbe accadere

7

Nel caso del test delle unità, sto testando il maggior numero di casi possibile quando faccio X , Y succede.

In alcuni casi sono anche preoccupato che quando faccio X , Z non accade.

Ma per motivi di protezione, potrei anche verificare che A, B, C ... non accada neanche. E andando in quella direzione, potrei fondamentalmente testare un miliardo di cose che non dovrebbero accadere e, in molti casi, non accadrà mai.

La mia domanda è, a che punto pensi di essere troppo difensivo e quando è ancora considerato utile?

Usiamo questo bit di pseudo codice come esempio

void MyFunction()
{
    if (X)
    {
        A();
    }
    else
    {
        B();
    }

    C();
}

void AnotherFunction()
{
   //Irrelevant code
}

Ecco i test che posso avere:

  • A succede quando X è vero
  • A non succede quando X è falso
  • B non si verifica quando X è vero
  • B si verifica quando X è falso
  • C si verifica quando X è vero
  • C si verifica quando X è falso

Questo è quello che farei. Ma seguendo questo ragionamento potrei anche provare che AnotherFunction non viene chiamato quando X è vero e falso, proprio come sto testando che C viene chiamato quando X è vero e falso o che A / B non viene chiamato quando X è falso / true.

E percorrendo quella strada potrei letteralmente testare un milione di cose che non dovrebbero accadere per ogni caso di test che riesco a trovare. Solo per assicurarti che i prossimi sviluppatori non infrangeranno il codice.

Nel mio esempio potresti dire "questo è troppo ovvio per essere testato" ma sono sicuro che puoi immaginare un punto in cui il codice potrebbe essere così fragile / complesso da poter provare molte cose diverse che non dovrebbero accadere. La mia domanda è: dovrebbe essere testato, e quanto lontano?

C'è qualche tipo di regola? Mi manca qualcosa nell'unità di test delle conoscenze?

Da un lato sento che questo è più sicuro e offre una buona difesa contro praticamente qualsiasi cosa a cui possa pensare. D'altra parte questo è troppo difensivo e abominevole da mantenere, mentre richiede molto tempo dal momento che si arriva al codice 'qualsiasi cosa si possa pensare'.

Si noti che l'ho applicato alle chiamate alle funzioni, ma si estende a tutto ciò che segue la linea di "testare cose che non dovrebbero accadere".

Dove si dovrebbe smettere di testare in quella direzione?

    
posta Gil Sand 06.04.2017 - 15:24
fonte

1 risposta

5

I test servono a pochi scopi.

  1. Verifica che i requisiti siano soddisfatti.
  2. Assicurati che il codice si comporti come previsto.
  3. Descrive il comportamento previsto del codice.

Inoltre, i test che scrivi devono darti un valore. Il valore deriva dal soddisfare uno di questi scopi.

Ad esempio, scrivere un test per assicurarsi che 2 + 2 produca effettivamente 4 è qualcosa che potresti fare, sai, per assicurarti che il compilatore e la tua CPU funzionino come progettato. Ma questo non ti dà molto valore e non giustifica la scrittura del test. (Né soddisfa realmente uno scopo di un test.)

È possibile scrivere test per assicurarsi che RandomOtherFunction non venga chiamato, ma non è probabile che fornisca un valore. Non è (in genere) soddisfare uno di questi scopi. Sta descrivendo ciò che il codice non è. E sarebbe impossibile scrivere tutto ciò che il codice non è. Inoltre, non è importante sapere quale sia il codice e che nessun raggio solare o gramlima abbia modificato il codice in quello.

I test che specificano troppo di ciò che il tuo programma non è anche difficile da cambiare. Che cosa succede se, per qualche motivo in futuro, devi iniziare a utilizzare RandomOtherFunction in un luogo a cui non sei abituato? Ora devi refactoring un sacco di test oltre a fare il lavoro. I test non ti hanno aiutato a fare il cambiamento o farlo in modo sicuro, lo hanno reso ancora più difficile.

Smetti di scrivere test quando non ti danno un valore. Quanto valore giustifica la scrittura di un test spetta a te e alla tua organizzazione. Se la tua azienda vuole davvero pagarti per scrivere un milione di test su ciò che il software non è, va bene. Lascia che ti paghino per quel "valore". (Puoi anche cercare un nuovo lavoro perché non riesco a immaginare una società che paga quel tipo di valore che dura molto a lungo.)

    
risposta data 06.04.2017 - 15:51
fonte

Leggi altre domande sui tag