Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução
Um projeto com execução automática de testes (ex. a cada novo código submetido a um
servidor) pode sofrer com a demora na execução e análise de resultados desses testes. O
ideal é que o tempo para cada rodada de execução e análise fique entre cinco e dez
minutos [1].
Vamos apresentar como foi feita a redução de trinta/quarenta para dez/vinte minutos
usando o agrupamento e execução paralela de testes.
Contexto
Desenvolvimento
Inicialmente identificamos quais são os testes mais lentos. Para isso adicionamos
johnkary/phpunit-speedtrap [9] na dependência de desenvolvimento da aplicação e
adicionamos o seguinte trecho ao arquivo phpunit.xml.dist.
<listeners>
<listener class="JohnKary\PHPUnit\Listener\SpeedTrapListener">
<arguments>
<array>
<element key="slowThreshold">
<integer>500</integer>
</element>
<element key="reportLength">
<integer>500</integer>
</element>
</array>
</arguments>
</listener>
</listeners>
O parâmetros são:
● slowThreshold: número de milissegundos para um teste ser considerado lento
● reportLength: número de testes lentos a serem incluídos no relatório
Em seguida, separamos os testes em diferentes grupos, de forma que a soma dos tempos
de execução de cada grupo não fosse superior a dez minutos. A opção escolhida foi o uso
de comentários de classe no estilo do phpDocumentor [10] com @group.
<?php
namespace MyApp\Tests;
use PHPUnit\Framework\TestCase;
/**
* @group g1
*/
class MyTest extends TestCase
{
// ...
}
bin/phpunit --group g1
A efetiva execução dos testes em paralelo foi conseguida usando uma lista de estágios de
execução e a diretiva parallel [11] no Jenkinsfile. Onde cada estágio guarda os logs dos
testes usando a diretiva stash e o nome do grupo.
#!groovy
def groups = ['g1', 'g2']
def stages = [:]
groups.each { group ->
stages["Backend: ${group}"] = {
stage("Tests ${group}") {
// phpunit execution with:
// --group ${group}
// --coverage-php build-logs/clover/${group}.cov
// --log-junit build-logs/junit/${group}.xml
stash includes: 'build-logs/', name: group
}
}
}
parallel stages
groups.each { unstash it }
mkdir -p coverage
bin/phpjunitmerge build-logs/junit coverage/junit.xml
bin/phpcov merge --clover coverage/clover.xml build-logs/clover
sonar.php.tests.reportPath=coverage/junit.xml
sonar.php.coverage.reportPaths=coverage/clover.xml
Podemos executar o sonar-scanner [14] para realizar a análise e enviar para o serviço
SonarQube, de forma a disponibilizar um relatório que apresenta os pontos de cobertura de
código que devem ser melhorados.
Conclusão
Referências