Test dell'unità per ambienti diversi

5

Come si fa un test unitario per più ambienti che si comportano diversamente?

Ecco il mio problema. Ho una classe PHP per cui mi piacerebbe creare test unitari. La classe fornisce scorciatoie per manipolare le cartelle. Su Linux, puoi impostare le autorizzazioni della cartella senza problemi, su Windows, non puoi affatto.

Sapendo questo, qual è la migliore pratica per creare un test unitario per questa classe? La suite di test può essere eseguita su Windows o Linux, ma se si testano le impostazioni della cartella su Windows, il test avrà esito negativo. Vivi semplicemente con il test in errore, lo fai condizionale sul sistema operativo, ometti di testarlo del tutto o qualcos'altro?

    
posta VirtuosiMedia 07.08.2011 - 04:14
fonte

3 risposte

4

In questo caso, lo renderei condizionale al sistema operativo e chiarire nel nome del test che è destinato esclusivamente all'esecuzione su Linux.

Non ho familiarità con i framework di testing unitari di PHP, ma se lo facessi in Python, avrei impostato il test da saltare durante l'esecuzione in Windows, dal momento che unittest supporta condizionali nel "salta questo test" "markup.

Se tutto ciò che devi fare è impostare le cartelle con permessi particolari e poi vedere come reagisce il tuo script, vedi se puoi usare un altro linguaggio (PowerShell? Python? Non sono sicuro.) per impostare prima il tuo ambiente. Quindi puoi testare il tuo codice PHP su cartelle pre-create.

In caso contrario, imposta "script" di test interattivo su Windows che dovranno essere eseguiti manualmente. Per "script" qui intendo i passaggi da seguire in ciascun test per verificare che il codice PHP funzioni come previsto. A questo punto non è un test unitario, ma è decisamente meglio che non avere alcun test.

    
risposta data 07.08.2011 - 06:41
fonte
3

Crea test unitari per entrambi! Devi sapere che sta funzionando il codice!

PHP ha un ottimo strumento di test delle unità noto come PHPUnit, che offre alcuni modi per farlo. La mia raccomandazione sarebbe quella di raggruppare i test che sono specifici per il sistema operativo con quel nome del sistema operativo.

/**
 * @group linux
 */
class LinuxTest extends PHPUnit_Framework_TestCase {
    // all tests within this class will be in the group, linux 
}


class MixedTests extends PHPUnit_Framework_TestCase
{
    public function testSomeTestThatAlwaysRuns()
    {
        // this test is not in a group
    }

    /**
     * @group windows
     */
    public function testWindowsOnlyCase()
    {
        // this test is in the group, windows
    }
}

Quindi, quando in Linux, esegui tutti i test tranne i test in "windows" e viceversa. Questo eseguirà tutti i test che dovrebbero essere eseguiti su entrambe le piattaforme e escluderà solo quelli per il gruppo specificato.

phpunit --exclude-group windows
phpunit --exclude-group linux

Inoltre, puoi escludere più gruppi:

phpunit --exclude-group windows,mac
    
risposta data 11.08.2011 - 19:59
fonte
0

Spostare l'algoritmo di creazione di cartelle su un metodo separato e, in questo metodo, creare definizioni, su cosa fare in ogni sistema operativo.
Mentre il tuo script dovrebbe funzionare solo su Linux (con codice specifico per linux), dovresti testare questo script solo su Linux. Dubito che tu possa "simulare" linux-environment in unuit-test.
Se il tuo script dovrebbe funzionare anche in Windows, allora dovrebbe essere codificato all'interno dello script, non in unit test.

    
risposta data 08.08.2011 - 10:15
fonte

Leggi altre domande sui tag