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


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.');

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>

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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.