Scrittura di un test unitario per un'unità dipendente dalla piattaforma

5

Ho un metodo da testare che dipende dal sistema operativo, qual è l'approccio migliore per testare il metodo a seconda del sistema operativo? E 'per testare su ogni sistema operativo che ho bisogno? C'è un approccio migliore per eseguire i test su un solo sistema?

Alcune informazioni più specifiche sono che ho un metodo che dipende dal sistema operativo usando il metodo platform.system di Python in un'istruzione if-else e ho bisogno di testare ciò che tutti i possibili risultati da questo metodo.

Questo metodo assomiglia a:

def updateString():
    if platform.system() == 'Darwin':
        return "http://download.com/to/OSX/version"
    elif platform.system() == 'Linux':
        return "http://download.com/to/Linux/version"
    elif platform.system() == 'Windows':
        return "http://download.com/to/Windows/version"
    else: 
        return "Seek advice on how to update."
    
posta Dean 26.12.2013 - 21:36
fonte

2 risposte

5

Se scegli come target più SO, probabilmente dovrai testare il tuo programma su ognuno di essi. Questi test dovrebbero in genere includere l'esecuzione della suite di test sul sistema operativo desiderato. Quindi la soluzione semplice per testare il metodo sopra descritto è di adattare il risultato previsto su platform.system() esattamente nello stesso modo mostrato sopra:

def testUpdateString():
    var expectedResult=""
    if platform.system() == 'Darwin':
        expectedResult="http://download.com/to/OSX/version"
    elif platform.system() == 'Linux':
        expectedResult="http://download.com/to/Linux/version"
    elif platform.system() == 'Windows':
        expectedResult="http://download.com/to/Windows/version"
    else: 
        expectedResult="Seek advice on how to update."
    assertEqual(expectedResult,updateString())

Naturalmente, lo svantaggio è che non è possibile ottenere una copertura completa del test del codice quando si eseguono i test su un solo sistema operativo. In questo esempio, questo è probabilmente accettabile, ma se i metodi "reali" che vuoi testare sono più complicati, potrebbe diventare più pratico testare le diverse parti senza realmente cambiare il sistema operativo. In questo caso, rifatta la parte principale in un metodo separato che ottiene platform.system() come parametro:

def updateStringPerSystem(opSys):
    if opSys == 'Darwin':
        return "http://download.com/to/OSX/version"
    elif opSys == 'Linux':
        return "http://download.com/to/Linux/version"
    elif opSys == 'Windows':
        return "http://download.com/to/Windows/version"
    else: 
        return "Seek advice on how to update."

def updateString():
     return updateStringPerSystem(platform.system())

Ora puoi scrivere unit test per updateStringPerSystem , passando tutte le stringhe di OS che ti piacciono per test diversi, permettendo di testare i diversi rami per OS1, OS2, OS3, ecc. anche quando stai usando la tua suite di test solo su OS1 .

Si noti che questo funziona solo per i test unitari di base. Non appena si desidera testare una funzione che in realtà utilizza il valore di ritorno per updateString in modo dipendente dal sistema operativo, non è possibile prevedere di testare la funzionalità di Windows quando si esegue la suite su Linux o viceversa.

    
risposta data 26.12.2013 - 22:06
fonte
5

Usando il framework mock, puoi applicare patch platform.system() .

def testUpdateStringWithDarwin():
    with patch('platform.system', MagicMock(return_value="Darwin")):
        result = updateString()

        assert result == "http://download.com/to/OSX/version", "should be Darwin!"
    
risposta data 26.12.2013 - 22:43
fonte

Leggi altre domande sui tag