Ao executar um teste PHPUnit, gostaria de poder despejar a saída para poder depurar uma ou duas coisas.
Eu tentei o seguinte (semelhante ao exemplo do Manual do PHPUnit );
class theTest extends PHPUnit_Framework_TestCase
{
/**
* @outputBuffering disabled
*/
public function testOutput() {
print_r("Hello World");
print "Ping";
echo "Pong";
$out = "Foo";
var_dump($out);
}
}
Com o seguinte resultado:
PHPUnit @package_version@ by Sebastian Bergmann.
.
Time: 0 seconds, Memory: 3.00Mb
OK (1 test, 0 assertions)
Observe que não há saída esperada.
Estou usando as versões HEAD dos repositórios git a partir de 19 de setembro de 2011.
Saída de php -version
:
$ php -version
PHP 5.2.9 (cli) (built: Dec 8 2010 11:36:37)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.2.0, Copyright (c) 1998-2009 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
Existe algo que estou fazendo de errado ou isso é potencialmente um bug do PHPUnit?
php
unit-testing
phpunit
Jess Telford
fonte
fonte
testOutput()
método?phpunit /path/to/tests/theTest.php
(se a classe acima estiver no arquivotheTest.php
).ob_get_level()
retorna1
. No entanto, isso é contradito pelo seguinte código: comwhile (ob_get_level() > 0) { ob_end_flush(); }
que errosob_end_clean(): failed to delete buffer. No buffer to delete.
. Curioso e curioso.Respostas:
ATUALIZAR
Acabei de descobrir outra maneira de fazer isso que funciona muito melhor do que a
--verbose
opção da linha de comando:Isso permite que você despeje qualquer coisa no seu console a qualquer momento, sem toda a saída indesejada que acompanha a
--verbose
opção CLI.Como outras respostas observaram, é melhor testar a saída usando os métodos internos, como:
No entanto, às vezes é útil ser impertinente e ver a saída de depuração temporária / única dentro de seus casos de teste. Não há necessidade de
var_dump
hack / solução alternativa, no entanto. Isso pode ser feito facilmente, definindo a--verbose
opção de linha de comando ao executar seu conjunto de testes. Por exemplo:Isso exibirá a saída de dentro de seus métodos de teste ao executar no ambiente da CLI.
Veja: Escrevendo testes para o PHPUnit - Testing Output .
fonte
file_put_contents('php://stderr', $myDebugVar, FILE_APPEND);
, porque tinha uma mensagemUse of undefined constant STDERR - assumed 'STDERR'
com fwrite .STDOUT
em vez deSTERR
STDERR
. Eu estou usandoPHPUnit 4.5.0
na linha de cmd do windows. umaecho
declaração não fornece os mesmos resultados.echo
produz, mas somente após o resultado do teste ser exibido.fwrite(STDERR, 'string')
oufwrite(STDOUT,'string')
produza os mesmos resultados: Uma saída antes do resultado do teste ser exibido.Atualização: Veja a atualização de rdlowrey abaixo sobre o uso de
fwrite(STDERR, print_r($myDebugVar, TRUE));
uma solução muito mais simplesEsse comportamento é intencional (como jasonbar tem apontado ). O estado conflitante do manual foi relatado ao PHPUnit.
Uma solução alternativa é fazer com que o PHPUnit afirme que a saída esperada está vazia (quando na verdade há saída), o que acionará a saída inesperada a ser mostrada.
dá:
Certifique-se de desativar quaisquer outras asserções que você possui para o teste, pois elas podem falhar antes que a asserção de saída seja testada (e, portanto, você não verá a saída).
fonte
Tente usar
--debug
Útil se você estiver tentando encontrar o caminho certo para um arquivo de dados de inclusão ou origem.
fonte
Não é um bug, mas muito intencional. Sua melhor aposta é gravar em um arquivo de log de algum tipo e seguir o log para observar a saída.
Se você estiver tentando testar a saída, verifique isso .
Além disso:
fonte
Estou tendo alguma sorte com o VisualPHPUnit , e ele mostra resultados úteis, entre outras coisas.
fonte
Você realmente deve pensar em suas intenções: se precisar das informações agora ao depurar para corrigir o teste, precisará delas na próxima semana novamente quando os testes forem interrompidos.
Isso significa que você precisará das informações sempre que o teste falhar - e adicionar um
var_dump
para encontrar a causa é muito trabalhoso. Em vez disso, coloque os dados em suas afirmações.Se o seu código for muito complexo para isso, divida-o até atingir um nível em que uma asserção (com uma mensagem personalizada) diga o suficiente para saber onde ele quebrou, por que e como corrigi-lo.
fonte
No laravel 5, você pode usar dump (), despejar o conteúdo da última resposta.
dá
fonte
Basta usar a flag --verbose ao executar o phpunit .
A vantagem desse método é que você não precisa alterar o código de teste, pode imprimir strings, var_dump ou o que quiser sempre, e ele será mostrado no console apenas quando o modo detalhado estiver definido.
Eu espero que isso ajude.
fonte
Em alguns casos, pode-se usar algo parecido para gerar algo para o console
fonte
Hackish, mas funciona: Lance uma exceção com a saída de depuração como sua mensagem.
Rendimentos:
fonte
Isso foi retirado do PHPUnit Docs sobre acessórios .
Isso deve permitir que você despeje informações a qualquer momento durante o ciclo de vida do teste phpunit.
Basta substituir
__METHOD__
no código abaixo o que você deseja exibirExemplo 4.2: Exemplo mostrando todos os métodos de modelo disponíveis
fonte
Eu produzi meus resultados de teste baseados em HTML; nesse caso, foi útil liberar o conteúdo:
Existe um segundo método PHP
que eu não tentei.
fonte
O PHPUnit está ocultando a saída com
ob_start()
. Podemos desativá-lo temporariamente.fonte
Eu tive que modificar o código fonte para que esse código funcionasse, então você precisa adicionar o URL desses repositórios bifurcados ao compositor, pois isso funcionará
fonte
Aqui estão alguns métodos úteis para imprimir mensagens de depuração no PHPUnit 4.x:
syslog(LOG_DEBUG, "Debug: Message 1!");
Exemplo mais prático:
A chamada
syslog()
gerará uma mensagem de log do sistema (consulteman syslog.conf
:).Nota: Níveis possíveis:
LOG_DEBUG
,LOG_INFO
,LOG_NOTICE
,LOG_WARNING
,LOG_ERR
, etc.No macOS, para transmitir as mensagens syslog em tempo real, execute:
fwrite(STDERR, "LOG: Message 2!\n");
Nota: A
STDERR
constante não estará disponível se estiver lendo o script PHP em stdin . Aqui está a solução alternativa .Nota: em vez de
STDERR
, você também pode especificar um nome de arquivo.file_put_contents('php://stderr', "LOG: Message 3!\n", FILE_APPEND);
Nota: Use este método, se você não tiver
STDERR
constante definida.register_shutdown_function('file_put_contents', 'php://stderr', "LOG: Message 4!\n", FILE_APPEND);
Nota: Use esse método se desejar imprimir algo no final, sem afetar os testes.
Para despejar a variável, use
var_export()
, por exemplo"Value: " . var_export($some_var, TRUE) . "\n"
.Para imprimir as mensagens acima apenas durante o modo detalhado ou de depuração, consulte: Existe uma maneira de saber se --debug ou --verbose foi passado para o PHPUnit em um teste?
Embora se testar a saída faça parte do teste, verifique: Página de documentação Testando saída .
fonte
Se você usa o Laravel, pode usar funções de registro como info () para registrar no arquivo de log do Laravel em armazenamento / registros. Portanto, ele não aparecerá no seu terminal, mas no arquivo de log.
fonte