Gerência e Qualidade de Software
Semana 1 8
Durante o desenvolvimento de uma aplicação colaborativa, os desenvolvedores A e B estão trabalhando em branches distintas, feature-a e feature-b, respectivamente. O desenvolvedor A realiza alterações no arquivo config.py, enquanto o desenvolvedor B faz modificações no mesmo arquivo, mas em um trecho diferente de código. Quando ambos tentam realizar o git merge de suas branches na branch main, ocorre um conflito, pois ambos alteraram a mesma linha de código no arquivo config.py.
Com relação a este contexto e sobre o conteúdo estudado, avalie as asserções a seguir e a relação proposta entre elas:
I. Quando um conflito é detectado após um comando git merge, o desenvolvedor deve realizar o comando git reset --hard para voltar ao estado anterior ao merge e recomeçar o processo de resolução do conflito.
PORQUE
II. O comando git diff pode ser utilizado durante a resolução de um conflito para visualizar as diferenças entre a versão atual do arquivo e a versão que será integrada, permitindo que o desenvolvedor veja claramente as modificações feitas por outros colaboradores.
A respeito dessas asserções, assinale a alternativa correta:
Qual comando da ferramenta Git é usado para copiar os commits mais recentes do repositório local para o repositório remoto?
Qual comando da ferramenta Git é usado para criar snapshots (ou fotografias) dos arquivos de um sistema e armazená-las no sistema de controle de versões?
Com base neste cenário, sobre a sequência correta de comandos para resolver os problemas e retomar o desenvolvimento da maneira mais adequada, analise as afirmativas a seguir:
- Retornar para a branch feature/login para corrigir a área de stage e retirar os arquivos indesejados.
- Utilizar o comando git restore --staged <arquivo> para remover os arquivos da área de stage.
- Após limpar a área de stage, retornar à branch main utilizando git checkout main.
- Com a branch main ativa, executar git merge feature/login para integrar as alterações.
Está correto o que se afirma em:
Qual é o nome do comando que representa uma solicitação para que um desenvolvedor revise e, se for o caso, realize o merge de um branch que outro desenvolvedor criou?
Durante a validação de uma função criada para automatizar uma rotina comum no sistema, foram definidos alguns testes com base em diferentes combinações de entrada. O trecho de código abaixo representa a lógica usada para atualizar o status de um pedido: def processar_pedido(pedido): if pedido["pago"]: if pedido["estoque"] > 0: pedido["status"] = "Confirmado" else: pedido["status"] = "Aguardando Estoque" else: pedido["status"] = "Pagamento Pendente" Foram aplicados os seguintes testes: • Teste 1: ("pago": True, "estoque": 5) • Teste 2: ("pago": True, "estoque":0} Com base nesses testes e no código apresentado, avalie as afirmativas a seguir: I. A linha pedido["status"] = "Pagamento Pendente" não foi executada em nenhum dos testes. II. O bloco if pedido["pago"]: foi testado tanto com o resultado verdadeiro quanto falso. III. A cobertura de declaração ainda não é total, pois nem todas as instruções foram executadas. IV. A adição de um teste com ("pago": False) permitiria alcançar 100% de statement coverage. Está correto o que se afirma em:
Durante o desenvolvimento de um projeto colaborativo em equipe, Mariana foi encarregada de iniciar o controle de versão utilizando o Git. No terminal, ela criou o repositório com o comando [Preencher 1], adicionou os arquivos necessários com o comando [Preencher 2] e, por fim, registrou as mudanças com o comando [Preencher 3]. Ao concluir, comunicou a equipe que o projeto já estava versionado e pronto para receber contribuições por meio de push e pull. Neste contexto, identifique os termos de [preencher 1], [preencher 2] e [preencher 3] que são substituídos por:
Durante o desenvolvimento de um sistema para uma pequena empresa de logística, a equipe identificou que o cálculo de prazo de entrega estava implementado de formas diferentes em diversos pontos do código. Algumas variações causavam resultados inconsistentes. Para resolver isso, o time decidiu aplicar refatoração: extraiu a lógica repetida para uma única função reutilizável, reorganizou os arquivos por responsabilidade e criou testes automatizados. Com relação a este contexto e sobre o conteúdo estudado, analise as asserções a seguir e a relação proposta entre elas: I. A decisão de centralizar a lógica de cálculo de prazo em uma única função refatorada melhora a qualidade do sistema, pois evita comportamentos divergentes e facilita futuras atualizações, PORQUE II. ao aplicar refatoração com base na identificação de código duplicado em pontos críticos, a equipe melhora a previsibilidade do sistema e reduz o tempo necessário para localizar e corrigir erros. A respeito dessas asserções, assinale a alternativa correta:
Semana 2 10
Qual é o objetivo do arquivo CMakeLists.txt?
Qual alternativa a seguir mostra apenas diretórios usados pela estrutura padrão de projetos criado pela ferramenta Maven?
No desenvolvimento de aplicações Java, é comum recorrer a ferramentas que auxiliam na automação da configuração do projeto e no gerenciamento de bibliotecas externas. Uma das soluções mais utilizadas para isso é o Maven, que facilita a inclusão automática de dependências, padroniza a estrutura dos projetos, permite a realização de builds e oferece suporte ao controle de versões.
Com base no uso do Maven no contexto de desenvolvimento de projetos Java, observe as afirmativas a seguir:
- O Maven permite automatizar o processo de build de aplicações, definindo fases como compilação, teste e empacotamento.
- Com o Maven, todas as dependências de um projeto precisam ser adicionadas manualmente ao diretório de bibliotecas da aplicação.
- A configuração principal de um projeto Maven é feita no arquivo pom.xml, que define dependências, plugins e outras configurações.
Está correto o que se afirma em:
Qual o nome do arquivo que contém as configurações básicas para o projeto Gradle a serem usadas na compilação automática?
Qual é o comando usado para criar e inicializar um novo build do Gradle?
Durante o desenvolvimento de projetos em Java, especialmente em ambientes colaborativos, é fundamental contar com ferramentas que automatizem o processo de construção e gerenciem dependências. O Gradle é uma dessas ferramentas modernas que se destaca por sua flexibilidade e desempenho. Ele utiliza uma abordagem baseada em [preencher 1] para definir e organizar tarefas de construção, permitindo automações personalizadas. Além disso, o Gradle possui integração nativa com repositórios [preencher 2], facilitando a resolução automática de bibliotecas externas e otimizando o fluxo de trabalho. Neste contexto, identifique os termos de [preencher 1] e [preencher 2] que são substituídos por:
Durante a configuração de um projeto C++ com múltiplos arquivos-fonte e diretórios, o uso de CMake tornou-se essencial para automatizar a geração do projeto e controlar o processo de compilação de forma eficiente. O desenvolvedor deseja compilar um executável principal, organizar os arquivos em subdiretórios e incluir bibliotecas externas de forma modular, mantendo clareza e reutilização no projeto. Considerando práticas reais de uso do CMake nesse contexto, analise as afirmativas a seguir: I. O comando add_subdirectory() permite incluir subdiretórios que contenham seus próprios arquivos CMakeLists.txt, possibilitando a organização modular de bibliotecas ou partes da aplicação. II. A instrução target_include_directories() pode ser usada para especificar diretórios de cabeçalhos para um alvo específico, evitando que os includes precisem ser definidos globalmente. III. A função find_package() permite localizar bibliotecas externas instaladas no sistema, mas seu uso depende da existência de módulos de configuração apropriados para cada biblioteca. IV. O comando add_executable() deve ser utilizado apenas dentro de subdiretórios, e não no diretório principal do projeto, onde apenas configurações globais devem ser declaradas. Está correto o que se afirma em:
Durante o desenvolvimento de projetos em linguagens como Java, torna-se fundamental adotar práticas que facilitem o gerenciamento de dependências externas, além de organizar e automatizar tarefas recorrentes, como compilação, empacotamento e execução de testes. Para isso, é comum a utilização de ferramentas que padronizam o ciclo de construção do software e centralizam a configuração desses processos. Com base nisso, assinale a alternativa que identifica a principal função do Maven em um projeto Java:
Durante a configuração de um projeto corporativo Java com múltiplos módulos, a equipe de desenvolvimento percebeu que o tempo de build estava excessivamente alto e que cada alteração em um módulo disparava a recompilação completa de todos os módulos dependentes, mesmo sem necessidade. O projeto usava Gradle, mas não havia uma configuração otimizada para builds incrementais. Com relação a este contexto e sobre o conteúdo estudado, avalie as asserções a seguir e a relação proposta entre elas: I. A estrutura modular de um projeto Gradle, quando mal configurada, pode causar recompilações desnecessárias, impactando diretamente a performance do build. PORQUE II. A ausência de declaração explícita de dependências entre módulos impede que o Gradle execute builds incrementais com eficiência, pois ele não consegue identificar o que mudou de fato. A respeito dessas asserções, assinale a alternativa correta:
Joana está desenvolvendo um sistema em C++ que será utilizado em diferentes sistemas operacionais. Para facilitar a portabilidade e automatizar a criação dos arquivos de compilação, ela decide usar o CMake. No diretório raiz do projeto, ela cria um arquivo chamado CMakeLists.txt e, a partir dele, gera os arquivos de build para diferentes ambientes, utilizando, em seguida, comandos específicos para compilação e execução. Com base na situação descrita e nos conhecimentos sobre o funcionamento do CMake, observe as afirmativas abaixo: I. O uso do CMakeLists.txt permite que Joana defina quais arquivos-fonte serão incluídos na compilação, bem como o nome do executável resultante. II. A execução do comando make após o CMake é possível porque o CMake gerou um Makefile compatível com o sistema da Joana. III. O CMake substitui o compilador, realizando a compilação do projeto de forma independente, sem precisar do make ou do gcc. Está correto o que se afirma em:
Semana 4 12
Em um sistema de software, o desenvolvedor deseja garantir que todas as declarações do código estejam sendo testadas adequadamente. A ideia é identificar trechos de código que não estão sendo testados, para garantir que todo o comportamento esperado do sistema seja validado.
Com relação à aplicação da cobertura de declaração em testes automatizados, observe as afirmativas a seguir:
- A cobertura de declaração assegura que todas as linhas de código foram executadas, mas não garante que a lógica do código foi testada corretamente.
- A cobertura de declaração é suficiente para garantir que todas as possíveis condições e caminhos lógicos do código foram testados.
- Para garantir uma validação completa do comportamento do código, a cobertura de declaração deve ser complementada com a cobertura de ramo e de caminho, que avaliam a lógica e os diferentes cenários do código.
Está correto o que se afirma em:
Com base nesse conceito, observe e associe os tipos de cobertura de testes às suas respectivas descrições.
| Tipos de cobertura de testes | Descrições |
| I. Cobertura de Declaração | A. Mede a execução de todas as linhas de código, sem considerar as condições lógicas ou ramificações. |
| II. Cobertura de Ramo | B. Avalia a execução de todos os caminhos possíveis no código, levando em consideração as várias combinações de decisões e ramificações. |
| III. Cobertura de Caminho | C. Mede a execução de todos os ramos de uma estrutura de decisão, como instruções if e switch, considerando se todas as possibilidades foram verificadas. |
| IV. Cobertura de Condição | D. Verifica se todas as condições dentro das expressões lógicas foram avaliadas para todos os seus valores possíveis (verdadeiro ou falso). |
Assinale a alternativa que apresenta a associação correta:
Que tipo de análise de cobertura pode ser realizada com a ferramenta Coverage.py?
Qual é o objetivo da refatoração “extrair método”?
Sobre a situação em destaque, assinale a alternativa que reconhece uma abordagem adequada de refatoração:
Marque a alternativa que contém uma afirmação correta em relação ao uso de JaCoCo.
Sobre limiares (thresholds) dos valores de cobertura de teste, é correto afirmar que:
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 que é cobertura de condição (condition coverage)?
Com base nesse cenário, assinale a alternativa que identifica o uso do Coverage.py:
Com o uso de ferramentas como o JaCoCo, torna-se possível avaliar aspectos importantes do teste de software, como a parte do código que ainda não foi verificada e o nível com que os testes percorrem diferentes possibilidades. Esses recursos facilitam a identificação de [preencher 1] não testados e oferecem uma visão mais clara sobre a [preencher 2] alcançada pelos testes.
Neste contexto, reconheça os termos de [preencher 1] e [preencher 2] que são substituídos por:
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”?
Semana 5 8
Pelas boas práticas de “clean code”, o ideal é que nossas funções recebam no máximo quantos parâmetros?
Com base nessa situação, assinale a alternativa que reconhece a prática adotada pela equipe:
Qual alternativa a seguir apresenta corretamente uma boa prática de “clean code”?
Com base na situação apresentada, observe as afirmativas a seguir:
- O problema poderia ter sido evitado se houvesse testes de integração mais completos na pipeline, validando a interação entre os módulos afetados.
- Os testes unitários, por si só, são suficientes para garantir que não ocorram erros em produção quando todos passam corretamente.
- A eficácia da integração contínua depende da qualidade dos testes; se forem superficiais, falhas críticas ainda podem passar despercebidas.
Está correto o que se afirma em:
Neste contexto, identifique os termos de [preencher 1] e [preencher 2] que são substituídos por:
"O desenvolvimento de software exige não só que o programa funcione, mas que seja compreensível e sustentável ao longo do tempo. O código limpo não é apenas uma escolha estética, mas uma prática que favorece a colaboração, a manutenção e a evolução de sistemas complexos."
DUARTE, Abraão. Clean Code: boas práticas. dev.to, 2021. Disponível em: https://dev.to/abraaoduarte/clean-code-boas-praticas-19n0. Acesso em: 14 mai. 2025.
No contexto do desenvolvimento de software, não basta que um sistema apenas funcione corretamente. À medida que projetos crescem em escala e complexidade, torna-se essencial que o código produzido seja claro, bem estruturado e de fácil manutenção. Essa preocupação vai além da funcionalidade imediata, refletindo um compromisso com a qualidade a longo prazo e com o trabalho colaborativo dentro das equipes de desenvolvimento.
Com base nesse contexto e no conteúdo estudado, avalie as asserções a seguir e a relação proposta entre elas:
I. Os métodos curtos, com nomes significativos e objetivos claros, facilitam a manutenção do código ao permitir que qualquer desenvolvedor entenda rapidamente o que está sendo feito, reduzindo a dependência de comentários.
PORQUE
II. Um dos pilares do código limpo é escrever métodos longos e detalhados, já que isso garante a explicação completa das regras de negócio e dispensa a necessidade de documentação externa.
A respeito dessas asserções, assinale a alternativa correta:
Com base nos princípios de código limpo, assinale a alternativa que reconhece a forma de melhorar a legibilidade desse código:
Com base nesse cenário e nos princípios éticos da engenharia de software, observe e associe as situações abaixo aos princípios éticos que as representam.
| Princípios Éticos | Situações |
| I. Confiabilidade e qualidade do produto. | A. Um engenheiro se recusa a implementar um mecanismo que permitiria ao gestor acessar históricos médicos dos pacientes sem o consentimento deles. |
| II. Privacidade e respeito às informações dos usuários. | B. Diante de um prazo apertado, a equipe opta por entregar uma versão do sistema sem testes mínimos, mesmo sabendo que há risco de falhas em prontuários. |
| III. Responsabilidade social e proteção do bem-estar público. | C. Uma desenvolvedora denuncia anonimamente um colega que modificava registros clínicos a pedido da administração para evitar processos legais. |
| IV. Lealdade à equipe e respeito à hierarquia da empresa. | D. Um engenheiro revisa cuidadosamente o código para evitar vulnerabilidades que poderiam expor dados sigilosos, mesmo isso levando mais tempo. |
Assinale a alternativa que apresenta a associação correta:
Semana 7 5
Durante o desenvolvimento de um sistema web, a equipe de testes automatizados decidiu utilizar o JaCoCo para acompanhar a cobertura de código em seus testes de unidade. Após configurar corretamente o plugin no arquivo pom.xml, foi gerado um relatório detalhado em HTML. No entanto, ao revisar o relatório, notaram que vários métodos estavam com cobertura zero, mesmo após a execução bem-sucedida dos testes. Um dos analistas, então, sugeriu que a equipe verificasse se os testes estavam [preencher 1] corretamente e se o relatório estava sendo [preencher 2] na pasta configurada no projeto.
Neste contexto, identifique os termos de [preencher 1] e [preencher 2] que são substituídos por:
Marque a alternativa abaixo que apresenta uma informação correta a respeito do “design centrado no usuário” de acordo com o autor Ricardo Dias.
Quais são as tags (@) JavaDoc?
Com base nesse cenário, observe as afirmativas a seguir:
I. A adoção do Javadoc permite que comentários estruturados nos métodos e classes sejam convertidos em documentação navegável, facilitando a leitura técnica do sistema.
II. Mesmo com o uso do Javadoc, a qualidade da documentação depende da clareza e completude dos comentários inseridos pelos desenvolvedores.
III. A automatização por meio do Javadoc torna desnecessária a verificação manual da consistência entre código e documentação, já que a ferramenta garante a fidelidade entre ambos.
Está correto o que se afirma em:
O que é correto afirmar sobre MVC?