Ha senso misurare la copertura condizionale per il codice Java 8?

19

Mi chiedo se misurare la copertura del codice condizionale con gli attuali strumenti per Java non sia obsoleto da quando è uscito Java 8. Con Java 8's Optional e Stream possiamo spesso evitare code branch / loops, il che rende facile ottenere una copertura condizionale molto elevata senza testare tutti i possibili percorsi di esecuzione. Confrontiamo il vecchio codice Java con il codice Java 8:

Prima di Java 8:

public String getName(User user) {
    if (user != null) {
        if (user.getName() != null) {
            return user.getName();
        }
    }
    return "unknown";
}

Ci sono 3 possibili percorsi di esecuzione nel metodo sopra. Per ottenere il 100% di copertura condizionale, è necessario creare 3 test unitari.

Java 8:

public String getName(User user) {
    return Optional.ofNullable(user)
                   .map(User::getName)
                   .orElse("unknown");
}

In questo caso, i rami sono nascosti e abbiamo solo bisogno di 1 test per ottenere una copertura del 100% e non importa in quale caso verificheremo. Sebbene ci siano ancora gli stessi 3 rami logici che dovrebbero essere coperti, credo. Penso che rende le statistiche di copertura condizionale completamente non attendibili in questi giorni.

Ha senso misurare la copertura condizionale per il codice Java 8? Ci sono altri strumenti che individuano il codice sottovalutato?

    
posta Karol Lewandowski 01.12.2016 - 19:19
fonte

1 risposta

4

Are there any tools that measure logical branches that can be created in Java 8?

Non ne sono a conoscenza. Ho provato a eseguire il codice che hai tramite JaCoCo (alias EclEmma) per sicurezza, ma mostra 0 rami nella versione Optional . Non conosco alcun metodo per configurarlo in modo diverso. Se lo hai configurato per includere anche i file JDK, teoricamente mostrerebbe i rami in Optional , ma penso che sarebbe sciocco iniziare a verificare il codice JDK. Devi solo presupporre che sia corretto.

Penso che il problema principale, tuttavia, sta comprendendo che i rami aggiuntivi che avevate prima di Java 8 erano, in un certo senso, rami artificialmente creati. Il fatto che non esistano più in Java 8 significa che ora hai lo strumento giusto per il lavoro (in questo caso, Optional ). Nel codice pre-Java 8 dovevi scrivere test unitari extra in modo da avere la certezza che ogni ramo di codice si comporta in modo accettabile - e questo diventa un po 'più importante in sezioni di codice che non sono banali come la User / getName esempio.

Nel codice Java 8, stai invece confidando nel JDK che il codice funzioni correttamente. Com'è, dovresti trattare quella riga Optional proprio come trattano gli strumenti di copertura del codice: 3 linee con 0 rami. Che ci siano altre linee e rami nel codice qui sotto è qualcosa su cui non hai prestato attenzione prima, ma è esistito ogni volta che hai usato qualcosa come ArrayList o HashMap .

    
risposta data 01.12.2016 - 23:09
fonte

Leggi altre domande sui tag