Test unitario di metodi non atomici [duplicato]

6

Sono nuovo nel test delle unità. Negli ultimi due giorni sto pensando a testare i metodi non atomici con i test unitari. Quando ho bisogno di scrivere dei test per alcune semplici modalità di metodo atomico in modo abbastanza semplice - sto prendendo tutti gli scenari per questo metodo che posso immaginare, e rifare ognuno di essi in unit test.

E se avessi metodi che chiamano altri metodi? Devo testare ogni scenario per il metodo testato E ogni metodo sta chiamando?

Forse alcuni esempi saranno più facili da capire:

    public int makeSomeOperation(int a, int b)
    {
        if (a < 0)
            throw new ArgumentException("a must be greater that 0");
        if (b == 0)
            throw new ArgumentException("b cannot be 0");
        return a/b;
    }

    public bool SomeNonatomicMethod(int number)
    {
        if (number * number % 2 == 1)
            return false;
        int secondNumber = getNumberFromMordor();
        int result = makeSomeOperation(number, secondNumber);
        if (result == "123")
            return true;
        return false;
    }

In questo caso, makeSomeOperation è facile da testare: un test per ogni eccezione, uno per verificare che il risultato di ritorno sia uguale alle aspettative.

Ma che ne è di SomeNonatomicMethod? Ho dovuto scrivere non solo test per ogni caso in questo metodo (quindi: potenza del numero è dispari, il risultato è uguale a 123, e il risultato è diverso), ma anche ogni possibile flusso di cose che possono accadere in getNumberFromMordor e makeSomeOperation ?

Le cose che possono accadere in makeSomeOperation sono già testate, quindi dovrebbero essere testate la seconda volta?

    
posta Thaven 25.03.2014 - 12:21
fonte

2 risposte

13

Se getNumberFromMordor e makeSomeOperation sono pubblici, dovrebbero essere testati da soli, quindi il tuo test unitario non dovrebbe fare doppio controllo sul fatto che getNumberFromMordor funzioni correttamente.

Verifica solo cosa fa SomeNonatomicMethod . Non riesaminare i metodi pubblici su cui si basa.

Se getNumberFromMordor è privato, dovresti testare SomeNonatomicMethod rispetto alla possibilità che getNumberFromMordor non funzioni correttamente.

Se SomeNonatomicMethod stesso fa talmente tante cose che ti ritrovi con dozzine di asserzioni, è un segnale che non segue il principio della singola responsabilità e dovrebbe essere scomposto.

    
risposta data 25.03.2014 - 12:28
fonte
2

Di solito non testare il metodo "makeSomeOperation". Tuttavia , questa non è una regola universale. Perché? Poiché il tuo metodo composito potrebbe non fornire una combinazione adeguata di parametri per eseguire tutto il codice "makeSomeOperation".

Quindi, quello che stai veramente cercando è la copertura del codice. Quando si scrivono i test unitari e si dispone di un buon strumento di copertura del codice, una volta raggiunto un livello compreso tra l'80% e il 90% di copertura del codice per una libreria di grandi dimensioni, si sta andando piuttosto bene. Idealmente otterresti il 100%, ma è quasi impossibile mantenerlo su una base di codice di qualsiasi dimensione. Forse se il codice che stavi scrivendo stava funzionando con un dispositivo medico o qualcosa che avresti cercato di mantenere al 100%, ma per noi semplici mortali, proviamo a mirare e mantenere l'80% -90% di copertura del codice.

    
risposta data 26.03.2014 - 02:39
fonte

Leggi altre domande sui tag