Prévia do material em texto
4 Análise de cobertura de teste e refatoração Olá, estudante! Nesta semana, continuaremos os estudos da disciplina Gerência e Qualidade de Software, avançando em seu objetivo de “conhecer e aplicar os conceitos práticos relacionados à qualidade de software e as diferentes métricas para a sua avaliação”. Para isso, nesta semana, continuaremos com o tema teste de software, porém com uma abordagem diferente, em que trataremos da análise de cobertura de teste, ainda com uma visão prática do assunto. Além disso, também trataremos do tema refatoração de software, com base em exemplos. Boa semana de estudo! Objetivos de aprendizagem Ao final dessa semana, você deverá ser capaz de: • Conhecer a análise de cobertura de teste via o uso de ferramenta; • Conhecer os principais tipos de refatoração de software. Revisitando Conhecimentos Esta videoaula apresenta uma visão geral dos princípios-chave da refatoração e algumas das questões que precisam ser consideradas ao usá-la. Engenharia de Software – Refatoração de software Uma alteração feita na estrutura interna do software para torna-lo mais fácil de ser entendido e menos custoso de ser modificado sem alterar seu comportamento observável. POR QUE REFATORAR? Melhorar o projeto do software. Torna o software mais fácil de entender. Ajuda a encontrar defeitos/ falhas. Ajuda a programar mais rapidamente. BENEFÍCIO DA REFATORAÇÃO Permite pensar em um projeto inicial que não representa a melhor solução, mas sim uma solução razoável. À medida que a solução é construída e o problema é melhor compreendido, uma solução melhor, diferente da original, pode ser percebida. QUANDO REFATORAR? Algo a ser feito o tempo todo, em pequenas quantidades. “Três vezes e você refatora!” Quando acrescentar funções. Quando precisar consertar um defeito. Quando estiver revisando o código. LIMITAÇÕES DA REFATORAÇÃO Difícil refatorar banco de dados. Difícil refatorar interfaces de objetos. Pode diminuir o desempenho do software. CATÁLOGO DE REFATORAÇÃO Compondo métodos Movendo recursos entre objetos Organizando dados Simplificando expressões condicionais Tornando as chamadas de métodos mais simples Lidando em generalização Refatorações grandes Compondo métodos: 1. Extrair método 2. Internalizar método 3. Internalizar variável temporária 4. Substituir variável temporária por consulta 5. Introduzir variável explicativa 6. Dividir variável temporária 7. Remover atribuições e a parâmetros 8. Substituir método por objeto método 9. Substituir o algoritmo Movendo recursos entre objetos: 1. Mover método 2. Mover campo 3. Extrair classe 4. Internalizar classe 5. Ocultar delegação 6. Remover intermediário 7. Introduzir método externo 8. Introduzir extensão local Organizando dados: 1. Autoencapsular campo 2. Substituir atributo por objeto 3. Mudar de valor para referência 4. Mudar de referência para valor 5. Substituir valor por objeto 6. Duplicar dados observados 7. Transformar associação unidirecional em bidirecional 8. Transformar associação bidirecional em unidirecional 9. Substituir números mágicos por constantes simbólicas 10. Encapsular campo Simplificando expressões condicionais: 1. Decompor condicional 2. Consolidar expressão condicional 3. Consolidar fragmentos condicionais duplicados 4. Remover flag de controle 5. Substituir condição aninhada por cláusulas guarda 6. Substituir comando condicional por polimorfismo 7. Introduzir objeto nulo 8. Introduzir asserção Tornando as chamadas de métodos mais simples 1. Renomear método 2. Acrescentar parâmetro 3. Remover parâmetro 4. Separar a pesquisa do modificador 5. Parametrizar método 6. Substituir parâmetro por métodos explícitos 7. Preservar o objeto inteiro 8. Substituir parâmetro por método 9. Introduzir objeto parâmetro 10. Remover método de gravação Lidando com generalização 1. Subir campo na hierarquia 2. Subir método na hierarquia 3. Subir o corpo do construtor na hierarquia 4. Descer método na hierarquia 5. Descer campo na hierarquia 6. Extrair subclasse 7. Extrair superclasse 8. Extrair interface 9. Condensar hierarquia 10. Criar um método padrão 11. Substituir herança por delegação 12. Substituir delegação por herança Refatorações grandes: 1. Desembaraçar herança 2. Converter projeto procedural em objetos 3. Separar o domínio de apresentação 4. Extrair hierarquia Orientação de estudos Nesta semana, há três videoaulas, sendo duas de demonstrações básicas do uso de duas ferramentas de análise de cobertura de teste – Coverage.py e JaCoCo – e uma com exemplos práticos de refatoração de código. Você pode assistir a elas nessa ordem. Há também materiais-base e materiais de apoio para ajudar você a usar as duas ferramentas, já que o objetivo é que você adquira uma visão prática delas e para aprender sobre outros exemplos de refatoração. Cobertura de testes – Coverage.py PERGUNTA 1 Qual foi o IDE usado para fazer a demonstração da ferramenta Coverage.py? o Pydev. o VS Code. o Atom. o Jupyter. o PyCharm. Você acertou! Essa é a alternativa correta. A demonstração da ferramenta Coverage.py foi realizada dentro da IDE PyCharm, embora a execução da ferramenta em si tenha sido realizada dentro do terminal da IDE. Cobertura de testes – JaCoCo PERGUNTA 1 A ferramenta JaCoCo possibilita análise de cobertura de teste para qual linguagem de programação? o C#. o Java. o Ruby. o JavaScript. o PHP. Você acertou! Essa é a alternativa correta. Como o próprio nome da ferramenta já indica, JaCoCo (Java Code Coverage) possibilita análise de cobertura de teste para a linguagem de programação Java. Refatoração O QUE É REFATORAÇÃO Uma alteração feita na estrutura interna do software para torná-lo mais fácil de ser entendido e menos custoso de ser modificado, sem alterar seu comportamento observável. BENEFÍCIOS DA REFATORAÇÃO • Melhora o projeto do software. • Torna o software mais fácil de entender. • Ajuda a encontrar defeitos/falhas. • Ajuda a programar mais rapidamente. TIPOS DE REFATORAÇÃO • Compondo métodos • Movendo recursos entre objetos • Organizando dados • Simplificando expressões condicionais • Tornando as chamas de métodos mais simples • Lidando com generalização • Refatorações grandes EXEMPLO –COMPONDO MÉTODOS EXEMPLO –ORGANIZANDO DADOS EXEMPLO –SIMPLIFICANDO EXPRESSÕES CONDICIONAIS EXEMPLO –SIMPLIFICANDO EXPRESSÕES CONDICIONAIS EXEMPLO –TORNANDO MAIS SIMPLES AS CHAMADAS DE MÉTODOS EXEMPLO –LIDANDO COM GENERALIZAÇÃO PERGUNTA 1 Qual é o primeiro exemplo de refatoração apresentado na videoaula? o Subir campo na hierarquia. o Renomear método. o Decompor condicional. o Extrair método. o Extrair classe. Você acertou! Essa é a alternativa correta. “Extrair método” é o primeiro exemplo de refatoração apresentado na videoaula. PERGUNTA 1 Questão relacionada a: Texto-base 1: Improve Code Quality Using Test Coverage e Texto-base 2: Measuring the Coverage of your Tests Para que serve a ferramenta JaCoCo e Coverage.py? o Para realizar integração contínua automatizado. o Para realizar compilação e integração automatizadas. o Para realizar análise de cobertura de código durante teste de unidade. o Para realizar teste de sistema/aceitação automatizado. o Para realizar teste de unidade automatizado. Você acertou! Essa é a alternativa correta. JaCoCo e Coverage.py são ferramentas usadas para realizar análise de cobertura de código durante teste de unidade para código implementado em Java e Python, respectivamente. PERGUNTA 1 Questão referente a Texto-base 3: Refatoração: Aperfeiçoando o projeto de código existente (Leia o capítulo 6, páginas97-123) | M. Fowler Qual alternativa abaixo apresenta um exemplo de refatoração do tipo “compondo métodos”? o Externalizar método. o Substituir consulta por variável temporária. o Extrair métodos. o Internalizar variável permanente. o Remover variável explicativa. Você acertou! Essa é a alternativa correta. “Extrair métodos” é o primeiro exemplo de refatoração do tipo “compondo métodos”, e todas as demais alternativas apresentam exemplos com nomes trocados. ATIVIDADE AVALIATIVA PERGUNTA 1 Qual refatoração possui o objetivo de “extrair uma expressão, cujo resultado está sendo armazenado em uma variável temporária, para um método e substituir todas as referências à variável temporária pela expressão, para que este novo método possa então ser usado em outros métodos”? o Substituir variável temporária por consulta. o Remover atribuições a parâmetros. o Extrair método. o Dividir variável temporária. o Introduzir variável explicativa. PERGUNTA 2 Qual refatoração possui o objetivo de “criar uma variável temporária separada para cada atribuição quando você tem uma variável temporária que mais de uma vez recebe uma atribuição, mas não é uma variável de laço nem um acumulador temporário”? o Extrair método. o Dividir variável temporária. o Substituir variável temporária por consulta. o Introduzir variável explicativa. o Remover atribuições a parâmetros. PERGUNTA 3 Que tipo de análise de cobertura pode ser realizada com a ferramenta Coverage.py? o statement (comando), function (função), branch (ramo), condition (condição). o apenas statement (comando), branch (ramo). o apenas statement (comando), branch (ramo), condition (condição). o apenas statement (comando), function (função), branch (ramo). o apenas function (função), condition (condição). PERGUNTA 4 Sobre limiares (thresholds) dos valores de cobertura de teste, é correto afirmar que: o com Gradle, é possível informar classes a serem excluídas da verificação dos limiares. o limiares são fixados a 90% de cobertura. o counter significa o tipo de cobertura, sendo line e branch, tanto para Maven quanto para Gradle. o apenas um limiar deve ser informado para todos os tipos de cobertura, por exemplo, statement e branch. o esse limiar significa o valor máximo de cobertura esperado que um teste deve obter. PERGUNTA 5 Qual é o objetivo da refatoração “extrair método”? o Transformar um fragmento de código que pode ser agrupado em um método cujo nome explique o seu propósito. o Usar uma variável temporária no lugar de uma atribuição a um parâmetro. o Substituir o corpo de um método por novo algoritmo que seja mais claro. o Colocar o corpo de um método cujo nome é tão claro quanto seu corpo dentro do corpo do que o chama e remover o método. o Colocar o resultado de uma expressão complicada, ou partes da expressão, em uma variável temporária cujo nome explique o seu propósito. PERGUNTA 6 Marque a alternativa que contém uma afirmação correta em relação ao uso de JaCoCo. o Pode ser usado em conjunto com Maven e com Gradle. o Precisa ser necessariamente usado em conjunto com a ferramenta Quarkus CLI. o Não pode ser usado para testes de integração. o Deve ser usado apenas para testes de sistema/aceitação. o Não pode ter valores limiares de cobertura atribuídos. PERGUNTA 7 Marque a alternativa que apresenta apenas tipos de itens apresentados no relatório de cobertura da ferramenta Coverage.py. o o statements (comandos), missing (ausentes), included (incluídas), total (total). o o statements (comandos), lacking (faltantes), excluded (excluídas), total (total). o o statements (comandos), lacking (faltantes), included (incluídas), total (total). o o statements (comandos), missing (ausentes), excluded (excluídas), partial (parcial). o o statements (comandos), lacking (faltantes), included (incluídas), partial (parcial). PERGUNTA 8 O que é cobertura de condição (condition coverage)? o o o Medida que informa se cada ramificação de uma instrução de controle foi executada. o o o Medida que informa se cada subexpressão booleana em um programa foi avaliada como verdadeira e falsa durante a execução de um conjunto de testes. o o o Medida que informa quantas linhas de código foram executadas pelo conjunto de testes e quantas linhas de código não foram executadas. o o o Medida que informa quantas variáveis definidas foram usadas. o o o Medida que informa quais funções foram chamadas e quais funções não foram chamadas. Aprofundando o tema Para aprofundar o tema, recomendo que você acesse o material a seguir: Material de apoio 1: The Ultimate List of Code Coverage Tools: 25 Code Coverage Tools for C, C++, Java, .NET, and More Material de apoio 2: Increase Test Coverage Material de apoio 3: An Intro to coverage.py Material de apoio 4: Intro to JaCoCo Material de apoio 5: JaCoCo Code Coverage of a Java Application from Remote Test Execution Material de apoio 6: JaCoCo Code Coverage with Maven Material de apoio 7: Refatoração: aperfeiçoando o projeto de código existente (Leia o capítulo 7, páginas 124-147) | M. Fowler Material de apoio 8: Refatoração: aperfeiçoando o projeto de código existente (Leia o capítulo 8, páginas 148-202) | M. Fowler Material de apoio 9: Refatoração: aperfeiçoando o projeto de código existente (Leia o capítulo 9, páginas 203-230) | M. Fowler Material de apoio 10: Refatoração: aperfeiçoando o projeto de código existente (Leia o capítulo 10, páginas 231-271) | M. Fowler Material de apoio 11: Refatoração: aperfeiçoando o projeto de código existente (Leia o capítulo 11, páginas 272-303) | M. Fowler https://stackify.com/code-coverage-tools/ https://stackify.com/code-coverage-tools/ https://devguide.python.org/testing/coverage/index.html https://www.blog.pythonlibrary.org/2016/07/20/an-intro-to-coverage-py/ https://www.baeldung.com/jacoco https://towardsdev.com/code-coverage-of-your-java-rest-application-using-jacoco-9c809a380711 https://towardsdev.com/code-coverage-of-your-java-rest-application-using-jacoco-9c809a380711 https://howtodoinjava.com/junit5/jacoco-test-coverage/ https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/123 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/123 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/147 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/147 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/202 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/202 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/230 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/230 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/271 https://integrada.minhabiblioteca.com.br/reader/books/9788577804153/pageid/271