Pular para o conteúdo

Só os testes afetados

--affected transforma o veredito do --changed ou do --files numa rodada de segundos: rodam só os arquivos de teste que executam o código alterado.

--affected​

sonda test --changed=origin/master --affected

Cada rodada grava, fora do projeto, um mapa de quais arquivos do <source> os testes de cada arquivo de teste executaram. Com --affected, junto do --changed ou do --files, o Sonda roda só os arquivos de teste que executam o que mudou, mais os arquivos de teste que mudaram. Os testes que cobrem o código alterado são todos esses, então o veredito é o mesmo, em segundos em vez da suíte inteira. O comando diz o que está rodando:

Running only the affected tests: tests/Unit/Actions/PlaceOrderTest.php

Com muitos arquivos de teste, ele os conta: Running only the affected tests: 11 of 12 test files.

--affected precisa de --changed ou --files: são eles que dizem o que mudou. Sozinho, é recusado com The option --affected needs --changed or --files: they say what changed.

Quando a suíte inteira roda mesmo assim​

O mapa não responde por tudo, e aí a suíte inteira roda, medindo o projeto todo para o mapa aprender. O comando diz o motivo antes de rodar:

Running the whole suite and measuring the whole project: this project has no test map yet; this run creates it.

Os motivos:

Motivo impressoQuando
this project has no test map yet; this run creates ita primeira rodada, ou o arquivo do mapa sumiu
no known test runs <path>mudou um arquivo do <source> que nenhum teste conhecido executa: um arquivo novo, ou um nunca executado
<path> changed and is neither a <source> file nor a testmudou qualquer arquivo fora do <source> e dos testes (configuração, rotas, migrations, composer.lock, um helper de teste), porque qualquer teste pode lê-lo

Dois outros casos deixam o --affected de lado sem consultar o mapa:

  • Com piso de cobertura (--min-lines, --min-branches), a suíte inteira roda de qualquer jeito: --affected ignored: with a coverage floor, the whole suite runs.
  • Com os testes a rodar já dados ao runner (sonda test --changed=... --affected tests/Unit): --affected ignored: the tests to run were given.

Um mapa desatualizado nunca deixa um teste afetado de fora: cada rodada regrava o que os arquivos de teste que rodaram executam, e um arquivo do <source> que o mapa não conhece faz a suíte inteira rodar. O que ele pode fazer é rodar testes a mais.

--map=<arquivo>​

O mapa fica fora do projeto, no diretório de trabalho do Sonda, e é refeito a cada rodada. --map=<arquivo> o guarda em outro lugar, por exemplo dentro do projeto, para o cache do CI levá-lo de um job ao outro. O arquivo guarda caminhos relativos ao projeto, então serve a um checkout em outro diretório, e ele próprio não conta como mudança:

coverage:
cache:
key: sonda-test-map
paths: [.sonda/tests.map]
script:
- vendor/bin/sonda test --changed="$CI_MERGE_REQUEST_DIFF_BASE_SHA" --affected --map=.sonda/tests.map

--covered-by​

sonda test --html=coverage/html --covered-by

Cada linha e branch cobertos levam os nomes dos testes que os executaram, como no Xdebug; no HTML, aparecem ao passar o mouse na linha, e um teste que falhou aparece em vermelho. Pesa numa suíte grande: com 5.615 testes, o HTML foi de 123 MB para 1,3 GB e a memória do relatório de 300 MB para 870 MB.

Tanto --affected quanto --covered-by dependem de o Sonda ler o arquivo e o tamanho de cada teste. Quando ele não consegue para algum teste, a cobertura é a mesma, mas o comando avisa que esses dois podem sair incompletos:

Warning: Sonda could not read the file or the size of some test; the coverage is the same, but --affected and --covered-by may come out incomplete: <problem>