Una suite di test dovrebbe sempre avere successo. Ma cosa succede se abbiamo test per funzionalità che non sono ancora state implementate, o test per bug noti che non possiamo correggere in questo momento?
Scriviamo un test xfail.
I test xfail codificano le nostre ipotesi. È soggetto al controllo del codice sorgente, deve comunque essere compilato e possiamo eseguirlo. Ciò impedisce alle nostre ipotesi di non essere più aggiornate con lo stato attuale del software. Ma durante il normale lavoro con la suite di test, questi test xfail non provocano il fallimento della suite di test. Questo è simile a un test saltato, tranne che quando un test saltato di solito viene eseguito e fallisce, ciò fallirebbe la suite di test completa. Il fallimento di un test xfail non ha esito negativo nella suite di test.
Nei test runner senza test xfail, dobbiamo invece fare affidamento sul numero di test superati o sulla percentuale di test superati. Ma questo è estremamente fragile. Innanzitutto, questi conteggi sono sbagliati se vengono aggiunti nuovi test, il che dovrebbe accadere in ogni momento. In secondo luogo, queste metriche accumulate non riescono a tenere conto del caso in cui un test inizia a passare ma un altro test inizia a non riuscire.
Al contrario, i test xfail assicurano che i test di passaggio continuino a passare e non nascondano regressioni accidentali. Funziona come un cricchetto: la nostra suite di test non può scivolare indietro e introdurre regressioni, ma può procedere in avanti rimuovendo l'annotazione xfail da un test non appena esso passa.
I test Xfail implementati in pytest sono diversi dai test che si prevede producano un errore. Il test xfail dovrebbe passare e ci si aspetta che passi in futuro, ma ci si aspetta che fallisca dato lo stato attuale del software. Al contrario, i test che si prevede producano un errore non riescono se non c'è un tale errore. Tali test di errore sono ad es. utile per affermare che la convalida dell'input ha esito positivo. La maggior parte dei framework di test ha annotazioni speciali per catturare un'eccezione prevista.