2016-07-14 81 views
11

Mi piacerebbe che il test fallisse se funziona a una velocità inferiore a 0,5 secondi ma il tempo medio viene semplicemente stampato nella console e non riesco a trovare un modo per accedervi. C'è un modo per accedere a questi dati?Come fare un test delle prestazioni fallire se è troppo lento?

Codice

//Measures the time it takes to parse the participant codes from the first 100 events in our test data. 
func testParticipantCodeParsingPerformance() 
{ 
    var increment = 0 
    self.measureBlock 
    { 
     increment = 0 
     while increment < 100 
     { 
      Parser.parseParticipantCode(self.fields[increment], hostCodes: MasterCalendarArray.getHostCodeArray()[increment]) 
      increment++ 
     } 
    } 
    print("Events measured: \(increment)") 
} 

Test Data

[Tests.ParserTest testParticipantCodeParsingPerformance]' misurati [ora, i secondi] media: 0.203, relativa deviazione standard: 19,951%, valori: [0.186405, 0.182292, 0.179966, 0.177797, 0.175820, 0.205763, 0.315636, 0.223014, 0.200362, 0.178165]

risposta

8

È necessario impostare una linea di base per il test delle prestazioni. Dirigetevi verso il Navigatore Rapporto:

Report Navigator

e selezionare il recente test eseguito. Vedrai una lista di tutti i tuoi test, ma quelli della performance avranno tempi associati con loro. Clicca il momento di portare il popover prestazioni Risultato:

Performance Result

Il valore "base" è quello che stai cercando - impostarlo a 0.5s e che informerà Xcode che questo test dovrebbe completare in mezzo secondo. Se il test è più lento del 10% rispetto alla linea di base, fallirà!

+1

Questi hanno lavorato bene ma funzionano solo a livello locale sulla mia macchina, sto usando git per il mio progetto e tutti gli altri utenti non hanno impostato le loro linee di base. C'è un modo per includere questa linea di base all'interno di un progetto git? – Deco

+0

Ho trovato questo che ha funzionato https://stackoverflow.com/a/46563991/957245 – Deco

2

L'unico modo per fare qualcosa di simile a quello che descrivi è impostare un limite di tempo graficamente come @ eyvn22 consiglia.

Ma, se si desidera eseguire completamente il codice, l'unica cosa che si può fare è estendere XCTestCase con un nuovo metodo che misura il tempo di esecuzione della chiusura e lo restituisce per essere usato in un assertiong, ecco un esempio di quello che si potrebbe fare:

extension XCTestCase{ 
    /// Executes the block and return the execution time in millis 
    public func timeBlock(closure:()->()) -> Int{ 
     var info = mach_timebase_info(numer: 0, denom: 0) 
     mach_timebase_info(&info) 
     let begin = mach_absolute_time() 

     closure() 

     let diff = Double(mach_absolute_time() - begin) * Double(info.numer)/Double(1_000_000 * info.denom) 
     return Int(diff) 
    } 
} 

e utilizzarlo con:

func testExample() { 
    XCTAssertTrue(500 < self.timeBlock{ 
     doSomethingLong() 
    }) 
} 
Problemi correlati