Relatórios de cobertura de código unificado para testes de unidade e de interface do usuário

GOVIND DIXIT Segue 25 de junho · 4 min ler

Qual é o nosso objetivo, o que vamos fazer e por quê?

Como o título sugere, o objetivo é gerar os relatórios de cobertura de teste unificados de um projeto Android. Nós estaremos criando teste unitário e teste instrumentado para uma parte específica do código e, em seguida, geraremos os relatórios de cobertura para cada um deles. Nosso objetivo é mesclar os relatórios e produzir um relatório unificado.

Os relatórios de cobertura de teste são uma ferramenta importante para medir o quanto nossos testes realmente exercitam nosso código e ajudam a determinar a área que precisa ser melhorada. Embora não tenha garantido um software livre de erros, mas uma alta porcentagem de cobertura pode evitar muitas dores de cabeça no projeto.

Vamos começar a construir

Primeiro de tudo, crie um projeto Android, para mim é TestCoverage .

Inclua as seguintes dependências necessárias no seu nível de aplicativo build.gradle para executar testes e sincronizar novamente o gradle.

 // Para testes unitários 
testImplementation 'junit: junit: 4.12'
testImplementation 'org.mockito: mockito-inline: 2.27.0'

// Para testes de interface do usuário
androidTestImplementation 'com.android.support.test: runner: 1.0.2'
androidTestImplementation 'com.android.support.test: rules: 1.0.2'
androidTestImplementation 'com.android.support.test.espresso: espresso-core: 3.0.2'

Para gerar o relatório de cobertura, estaremos usando Jacoco ( Ja va Co de Co verage), uma das ferramentas mais utilizadas em Java para esse fim.

 aplicar plugin: 'buildTypes jacoco-android' { 
debug {
testCoverageEnabled true
}
lançamento {
minifyEnabled false
proguardFiles getDefaultProguardFile ('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
testOptions {
animationsDisabled true

unitTests {
includeAndroidResources = true
}
}

Nós criamos uma nova depuração de tipo de construção e fizemos testCoverageEnabled true. Isso fará com que nossos testes de IU sejam executados para o buildType de depuração. Além disso, desativamos as animações para executar corretamente nossos testes de interface do usuário.

MainActivity.kt

activity_main.xml

Além do conjunto principal de fontes, temos dois artefatos de teste diferentes em nosso projeto Android, geralmente representados pelas pastas de teste e androidTest. Nós estaremos armazenando nossos testes de unidade na pasta de teste e teste de interface do usuário na pasta androidTest.

Testes Unitários

Para executar os testes de unidade, podemos usar o comando abaixo mencionado

testes de gradlew

Testes Instrumentados

Nós usaremos a estrutura Espresso para escrever testes de interface do usuário. O teste abaixo irá verificar se o texto é alterado ao clicar no botão ou não.

Para executar os testes de interface do usuário, podemos usar o comando abaixo mencionado

gradlew connectedCheck

O comando abaixo gerará os relatórios de cobertura necessários para testes da interface do usuário

gradlew createCoverageReport

Agora, como mesclar os resultados de cobertura desses dois grupos de teste?

O problema aqui é que o Espresso gera. arquivo ec , Enquanto a unidade testa a execução gera o arquivo .exec . nós temos dois formatos diferentes!

Precisamos converter um formato para outro ou qualquer outra coisa?

Nós não precisamos converter um formato para outro, em vez disso, podemos configurar o Jacoco para mesclar os dois relatórios. Como não podemos configurar a tarefa de cobertura do Espresso, devemos garantir que ele seja executado primeiro, os testes de unidade mais tarde e, em seguida, criar os dados de cobertura com os dois arquivos ( ec e exec ).

Para habilitar isso, precisamos editar nossa tarefa mais uma vez e adicionar o arquivo .ec de cobertura como um parâmetro na propriedade executionData :

Adicione o seguinte arquivo jacoco.gradle no módulo do aplicativo.

jacoco.gradle

Agora você pode usar o comando abaixo para gerar um relatório de cobertura unificado.

gradlew connectedAndroidTest jacocoTestReport

Se você está enfrentando dificuldades em conectar as coisas.

aqui está o repositório demonstrando o mesmo trabalho. ?

GOVINDDIXIT / TestCoverage

Contribua para o desenvolvimento do GOVINDDIXIT / TestCoverage criando uma conta no GitHub.

github.com