Views do Blade
Num projeto Laravel (um com artisan), as views do Blade entram na medição junto do <source>.
O que é medido
Cada .blade.php em resources/views, e nas pastas resources/views dos pacotes e módulos
mantidos dentro do projeto (fora de vendor, node_modules, storage, public, tests e
bootstrap), aparece nos relatórios com as linhas de diretiva e de echo (@if, @foreach,
{{ }}, <x-component>) cobertas ou não, e com os branches das decisões (@if, @unless,
@isset, @foreach, @forelse, @switch, ?? e ?-> nos echos), no mesmo modo estrito do PHP:
um @if sem @else precisa do caso falso testado. A linha do @endif não é executável.
Uma view entra no veredito do --changed inteira, como um método: uma linha alterada numa view
cobra as linhas e os branches da view toda.
--views=a,b acrescenta outras pastas de views; --no-blade deixa as views de fora. Só as pastas
resources/views do projeto são achadas sozinhas.
Como funciona
Na primeira vez que um teste sobe a aplicação, o Sonda compila todas as views com o compilador Blade
da própria aplicação (diretivas próprias incluídas), instrumenta o PHP compilado e grava o resultado
onde o Laravel vai incluí-lo, numa pasta de views compiladas só deste processo, apontada por
VIEW_COMPILED_PATH no ambiente (a configuração padrão do Laravel lê essa variável). O cache do
projeto em storage/framework/views não é tocado.
As linhas do PHP compilado mapeiam de volta para as linhas do template: um marcador inserido antes
de cada construção sobrevive à compilação e diz de que linha veio. A cópia instrumentada é mantida
mais nova que o template, para o Laravel não compilá-la de novo sem sondas; com --parallel, cada
worker tem a própria pasta, e a subpasta por token que o teste paralelo do Laravel usa é criada antes
da cópia.
Quando as views compiladas não vão parar nessa pasta (uma configuração que sobrescreve
VIEW_COMPILED_PATH), as views não são medidas e o processo avisa no stderr:
Sonda: the compiled views are not in <dir> (VIEW_COMPILED_PATH did not reach the configuration): views not measured.
Uma view que não compila fica de fora, com o erro dela: Sonda: the view <view> did not compile and is not measured: <error>.
O que não conta como decisão
O que o Blade e o Livewire escrevem em volta do template não conta como decisão, porque o desfecho depende de como a view é renderizada e nenhum teste controla isso:
- a guarda
if (ExtendBlade::isRenderingLivewireComponent())que o Livewire põe em todo@if,@unlesse@foreach; - o salvar e restaurar de
$component,$attributese$messageem volta de uma tag de componente e do@error; - o
$component->shouldRender(); - os laços,
ife??com que@props,@awaree@livewiretratam$__keye as outras variáveis com dois sublinhados.
As linhas desse código continuam medidas; as decisões do template (@error, @forelse, @if...)
também.
No relatório
Para o php-code-coverage, que só conta branches de funções declaradas, cada view é a função view:
a cópia do código compilado que o relatório analisa no lugar do template declara essa função em
volta do código (com os use removidos, que não cabem numa função), e as sondas da view levam esse
nome. É o que aparece na tabela de funções do HTML.