2012-03-15 9 views
6

Sto creando una libreria statica per iOS e sto cercando di ottenere i dati di copertura del codice per i suoi test unitari. Sto usando CoverStory per visualizzare i file di copertura del codice generato.Risultati di copertura del codice errati su XCode durante il test delle eccezioni

Ottengo informazioni corrette per la maggior parte dei test.

Tuttavia, qualsiasi test che verifica la presenza di un'eccezione non viene contrassegnato come testato.

Ad esempio il metodo

- (void)shouldThrow:(BOOL)throw { 

    if (throw) 
     @throw [NSException exception...]; 

    NSLog(@"not thrown"); 

} 

testata con il test

- (void)testShouldThrow { 
    STAssertThrows([myObject shouldThrow:YES], @"Should have thrown an exception"); 

    STAssertNoThrow([myObject shouldThrow:NO], @"Should not have thrown an exception"); 
} 

supera tutti i test (cioè l'eccezione viene gettata correttamente). Tuttavia, la copertura del codice non mostra il 100%: la riga con @throw non viene contrassegnata come verificata.

Qualche idea?

risposta

3

La riga con @throw su di esso non viene completata (perché l'eccezione è generata), quindi non viene contrassegnata come coperta. È possibile presentare un bug, ma è probabile che sia abbastanza difficile risolverli. Se si tratta di una singola riga in un'istruzione branch, può essere molto difficile dire se è stata testata, ma se ci sono linee prima che siano state eseguite, devi solo supporre che lo sia anche.

La cosa brutta è che non sarai mai in grado di arrivare al 100%.

+0

Questo è ciò di cui avevo paura :((Ho impostato i punti di interruzione sulla linea, quindi so che è in fase di test, ma sarebbe bello poter automatizzare il test!) – deanWombourne

0

Il problema ancora peggiore è che sembra che i contatori delle linee prima del @throw nello stesso blocco di condizioni non siano anche coperti. Pertanto, sempliy scrive il codice prima di @throw come un indicatore non aiuterà il problema.

Tuttavia, ho trovato che le condizioni comprese le variabili ("if (YES)", "if (1 == 1)" non sono nei casi) sono sempre copribili. Pertanto, una cosa difficile che potremmo fare è prima definire una variabile di condizione banale e poi aggiungere un test di condizione che includa quella variabile prima di @throw.

static BOOL __trivialYES = YES; //for cover @throw, and never use 'const' 

poi

if(__trivialYES) @throw ...; 

Questo dovrebbe aiuta il problema e per il vostro comodo, si può definire il proprio macro per fare queste cose.

#define #throw if (__trivialYES) 

e quindi l'istruzione throw:

#throw ...; 

e questo probabilmente fa l'opera di prova migliore copertura.

PS: il '#throw' è solo una macro di esempio. È lo stesso di altre macro. Il '#' è solo un valido charactor (per alcuni precompilatori), che lo rende speciale.

Problemi correlati