PHP e SimpleTest - Running Runção RoupDown () Mesmo que haja uma exceção fatal
-
24-09-2019 - |
Pergunta
Uma pesquisa produz algumas perguntas sobre a captura de exceções fatais, mas essa é específica para usar o SimpleTest. (Eu sei que o SimpleTest está desatualizado, mas fazer com que o PHP-unidade funcione na minha configuração é outra pergunta).
Estou tentando fazer com que o método do desdobramento () funcione mesmo quando houver uma exceção fatal, pois crio algumas linhas de teste no banco de dados durante a configuração e removo-as durante a desmontagem. Mas quando o SimpleTestes chega a uma exceção fatal, o desmontagem () nunca é executado.
Existe uma maneira de fazer com que a desmontagem () corra apesar de uma execução fatal?
Solução
Existe um gancho "Register_shutdown_fuction" que pode ser usado:
register_shutdown_function(array($this, 'shutdownHandler'));
Em "ShutdownHandler", você pode escrever:
error_get_last() && $this->tearDown();
Outras dicas
Quando ocorre um erro fatal, o processo PHP é encerrado - o que significa que não há como ter o mesmo processo PHP executado qualquer tipo de código addionnal, pois não está mais lá.
Isso também significa que:
- Você provavelmente não receberá muitos relatórios
- os outros testes após o que acaba em um erro fatal não será executado
- Você tem um teste que está falhando - mal.
Você deve corrigir o problema: um erro fatal em seu aplicativo é mau ; É ótimo que você o detecte com seus testes automatizados, é claro-mas o próximo passo é fazê-lo desaparecer ;-)
Como você não pode mais executar o código PHP no mesmo processo que morreu, a única solução que vejo seria lançar outro processo, para executar seu código de limpeza.
A idéia básica seria:
- Inicie seus testes
- Use outro script, totalmente distinto, para executar as operações de limpeza
Obviamente, isso significa que a limpeza será feita apenas uma vez, depois que todos os testes tenham sido executados; Mas suponho que seja melhor do que nada.
Agora, como fazer isso de maneira automatizada?
A solução mais simples provavelmente seria usar um shell-script, que executa os dois comandos; algo assim, eu diria:
#!/bin/sh
php /.../launch-tests.php
php /.../cleanup.php
E execute seus testes lançando esse shell-script.