Teste de unidade para diferentes ambientes

5

Como alguém faz testes unitários para múltiplos ambientes que se comportam de maneira diferente?

Aqui está o meu problema. Eu tenho uma classe PHP para a qual gostaria de criar testes de unidade. A classe fornece atalhos para manipular pastas. No Linux, você pode definir as permissões de pasta sem nenhum problema, no Windows, você não pode de todo.

Sabendo disso, qual é a melhor prática para criar um teste de unidade para essa classe? O conjunto de testes pode ser executado no Windows ou no Linux, mas se você testar as configurações de pasta no Windows, o teste falhará. Você apenas vive com o teste em falha, torna-o condicional no sistema operacional, omite o teste completo ou algo mais?

    
por VirtuosiMedia 07.08.2011 / 04:14
fonte

3 respostas

4

Neste caso, eu ficaria condicionado ao sistema operacional e deixaria claro, no nome do teste, que ele deve ser executado apenas no Linux.

Eu não estou familiarizado com as estruturas de testes unitários do PHP, mas se eu estivesse fazendo isso no Python, eu configuraria o teste para ser ignorado quando executado no Windows, pois unittest suporta condicionais no "pular este teste" "marcação.

Se tudo o que você precisa fazer é configurar pastas com permissões específicas e ver como seu script reage, veja se você pode usar outro idioma (PowerShell? Python? Não tenho certeza.) para configurar seu ambiente primeiro. Então você poderia testar seu código PHP em pastas pré-criadas.

Se isso não for feito, configure "scripts" de teste interativos no Windows que precisarão ser executados manualmente. Por "scripts" aqui quero dizer os passos a serem seguidos em cada teste para verificar se o seu código PHP funciona como esperado. Não é um teste unitário neste momento, mas é definitivamente melhor do que não ter nenhum teste.

    
por 07.08.2011 / 06:41
fonte
3

Crie testes unitários para ambos! Você precisa saber que é código de trabalho!

O PHP tem uma ótima ferramenta de teste de unidade conhecida como PHPUnit, que oferece algumas maneiras de fazer isso. Minha recomendação seria agrupar os testes que são específicos do sistema operacional com esse nome de sistema operacional.

/**
 * @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
    }
}

Então, quando estiver no linux, execute todos os testes, exceto os testes em "windows" e vice-versa. Isso executará todos os testes que devem ser executados em ambas as plataformas e apenas excluirá aqueles para o grupo fornecido.

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

Além disso, você pode excluir vários grupos:

phpunit --exclude-group windows,mac
    
por 11.08.2011 / 19:59
fonte
0

Mova o algoritmo de criação de pastas para o método separado e, neste método, crie definições, como em cada sistema operacional.
Embora seu script deva funcionar apenas no Linux (com código específico do Linux), você deve testar esse script apenas no Linux. Eu duvido que você possa "simular" o linux-environment em um unuit-test.
Se o seu script deve funcionar no Windows também, ele deve ser codificado dentro do script e não no teste de unidade.

    
por 08.08.2011 / 10:15
fonte