Como pular testes no PHPunit?

89

Estou usando phpunit em conexão com jenkins e quero pular alguns testes definindo a configuração no arquivo XML phpunit.xml

Eu sei que posso usar na linha de comando:

phpunit --filter testStuffThatBrokeAndIOnlyWantToRunThatOneSingleTest

como faço para traduzir isso para o arquivo XML, uma vez que a <filters>tag é apenas para cobertura de código?

Eu gostaria de executar todos os testes, exceto testStuffThatAlwaysBreaks

Filype
fonte
1
KO: que tal corrigir o teste? a propósito, oi de welly ;-)
zerkms de
Eu não escrevi os testes, é algo irrelevante, e também não quero alterar os arquivos principais
Filype
Sem dúvida, você pode fazer isso. É um requisito muito estranho
zerkms de
PS: você mencionou filtros - mas não pode ajudar, porque exclui todo o caminho. Caso contrário <exclude>- faria o trabalho por você
zerkms de
você pode postar o arquivo phpunit.xml.dist proposto?
Filype de

Respostas:

170

A maneira mais rápida e fácil de pular os testes que estão interrompidos ou que você precisa continuar trabalhando mais tarde é simplesmente adicionar o seguinte no início do seu teste de unidade individual:

$this->markTestSkipped('must be revisited.');
Jsteinmann
fonte
você sempre pode adicionar diretórios ou testes ao arquivo de configuração xml; no entanto, se este for um controlador ou similar, isso não é muito prático porque você provavelmente tem dezenas de outros testes naquele arquivo. Acho que se você não tem acesso aos testes de unidade, não tenho certeza se entendi o porquê, então você não tem outra escolha a não ser excluir.
jsteinmann
6
Como é um método estático (pelo menos no PHPUnit 3), e algumas classes usam a ligação estática tardia afaik, você deve usar em static::markTestSkipped('');vez de $this->. Ele irá gerar um aviso nas versões mais recentes do PHP. Assinatura: public static function markTestSkipped($message = '')
Daniel W.
Precisa de um exemplo melhor do arquivo de teste de unidade completo. Não apenas um fragmento.
Ligemer 05 de
@DanielW. o manual oficial do phpunit tem exemplos mostrando$this->markTestSkipped()
nulll 01 de
@nulll que você pode ver no código-fonte do 6.5 , markTestSkipped()ainda é um método estático.
Daniel W.
31

Se você puder ignorar todo o arquivo, então

<?xml version="1.0" encoding="UTF-8"?>

<phpunit>

    <testsuites>
        <testsuite name="foo">
            <directory>./tests/</directory>
            <exclude>./tests/path/to/excluded/test.php</exclude>
                ^-------------
        </testsuite>
    </testsuites>

</phpunit>
zerkms
fonte
Isso é o que eu tentei, ainda diz 893 testes sem o <exclude>e 893 testes com o<exclude>
Filype
1
Os testes demoram cerca de 20 minutos para serem executados. Existe uma maneira fácil de ver quantos testes serão executados? atualmente, tenho que esperar até que a primeira linha seja concluída....... 63 / 893 ( 7%)
Filype
5
@Filype: então você provavelmente especificou o caminho errado. Funciona bem para mim. Não tenho certeza se é possível obter a contagem de testes. PS: os testes de unidade não devem ser executados por tanto tempo. Eu recomendaria usar @groupanotações e testes de divisão por natureza
zerkms de
21

Às vezes é útil pular todos os testes de um arquivo específico com base em condições personalizadas definidas como código php. Você pode fazer isso facilmente usando a função setUp na qual makeTestSkipped também funciona.

protected function setUp()
{
    if (your_custom_condition) {
        $this->markTestSkipped('all tests in this file are invactive for this server configuration!');
    }
}

your_custom_condition pode ser passada através de algum método / propriedade de classe estática, uma constante definida no arquivo de inicialização phpunit ou até mesmo uma variável global.

Konrad Gałęzowski
fonte
O que é uma Configaula? Onde eu coloco?
cronfy
@cronfy pode ser qualquer classe acessível de escopo global (padrão de design Singleton / Register) ou até mesmo variável global definida no arquivo de bootstrap no phpunit. Basicamente, a lógica é: if ($ testsFromThisFileShouldBeSkipped) {$ this-> markTestSkipped (...); }
Konrad Gałęzowski,
remova a condicional e sua resposta seria direta ... "markTestSkipped dentro da configuração para pular o arquivo inteiro"
SparK
1
@SparK Eu entendo seu ponto, mas eu estava fornecendo uma forma de ignorar condicionalmente a classe de teste inteira. Eu mudei um pouco, removendo minha maneira personalizada de fazer isso em favor da regra geral.
Konrad Gałęzowski