Testes e Qualidade de Software
Testes e Qualidade de Software
Código: INF1935 | Turma: MINF-0005
Carga horária: 60h (4 créditos)
Horário e local: Segundas e Quintas às 11:10 - 12:50 | Bloco B – Laboratório 202 - UNICAP
Esta disciplina desenvolve raciocínio técnico, análise de problemas e tomada de decisão em cenários reais de teste e qualidade de software. O foco está em interpretar contextos, avaliar alternativas e escolher a melhor abordagem técnica com base em evidências. Esta disciplina não é baseada em memorização, mas na capacidade de analisar cenários e tomar decisões técnicas fundamentadas.
Como Você Será Avaliado
  • Questões baseadas em situações-problema reais ou simuladas
  • Alternativas plausíveis que exigem interpretação e análise, não decoreba
  • Foco em decisão técnica: identificar a melhor abordagem diante de um cenário
  • Formato inspirado em avaliações de mercado e no ENADE
  • Não é prova de definições literais
Tópicos Principais:
Introdução aos Testes e Qualidade de Software
Planejamento de Testes e Estratégias de V&V
Testes Manuais e Exploratórios
Testes Automatizados e Frameworks
Testes de Unidade, Integração e Sistema
Qualidade de Software e Métricas
Integração e Entrega Contínua
Material das Aulas
Os conteúdos são apresentados de forma progressiva e aprofundados ao longo da disciplina, conectando teoria e prática em cada etapa para preparar o aluno a aplicar o conhecimento em situações reais — incluindo o Projeto Integrador, que é o eixo central da disciplina. O projeto conecta teoria e prática, simulando um ambiente real de desenvolvimento de software, com evolução contínua ao longo do semestre.
Bibliografia e Recursos
Nesta seção, você encontrará referências consolidadas da área para desenvolver repertório técnico. A leitura não precisa ser exaustiva: o objetivo é ampliar a capacidade de analisar cenários, comparar abordagens e tomar decisões técnicas fundamentadas.
Bibliografia Obrigatória
DELAMARO, Márcio E. Fundamentos de Teste de Software. São Paulo: Pearson Education do Brasil, 2007.
PRESSMAN, Roger S. Engenharia de Software: Uma Abordagem Profissional. 7. ed. Porto Alegre: McGraw-Hill, 2010.
MYERS, Glenford J. et al. The Art of Software Testing. 3. ed. Hoboken: Wiley, 2011.
Bibliografia Complementar
BEIZER, Boris. Software Testing Techniques. 2. ed. New York: Van Nostrand Reinhold, 1990.
BECK, Kent. Extreme Programming Explained: Embrace Change. Boston: Addison-Wesley, 2000.
GRAHAM, Dorothy; VAN VEENENDAAL, Erik; EVANS, Isabel. Foundations of Software Testing: ISTQB Certification. Cengage Learning, 2007.
Recursos Online
Esses recursos são especialmente úteis durante o desenvolvimento do Projeto Integrador, onde teoria e prática se encontram.
Artigos Científicos Relevantes
Leitura recomendada para aprofundar o raciocínio crítico sobre tendências e limitações das técnicas de teste.
  • The Impact of Agile Methodologies on Software Quality: A Systematic Review.
  • Automated Test Case Generation for GUI Applications: A Survey.
  • Machine Learning in Software Testing: A State-of-the-Art Review.
Ferramentas da Disciplina
Dominar ferramentas é consequência do raciocínio técnico. Conhecer uma ferramenta não basta: é preciso entender quando e por que utilizá-la. As ferramentas apresentadas aqui são as mesmas usadas no mercado e serão aplicadas no Projeto Integrador da disciplina.
1
Frameworks de Teste Unitário
Fundamentais para validar unidades isoladas de código. São a base da pirâmide de testes.
JUnit (Java): Um framework de testes de unidade amplamente utilizado para a linguagem de programação Java. Ele fornece uma arquitetura para escrever e executar testes. Documentação Oficial do JUnit
pytest (Python): Um framework de testes popular e fácil de usar para Python, que permite escrever testes simples e escaláveis. Documentação Oficial do pytest
Jest (JavaScript): Um framework de testes JavaScript com foco em simplicidade, usado para testar componentes React, Node.js e outras aplicações JavaScript. Documentação Oficial do Jest
2
Ferramentas de Análise de Código
Permitem identificar problemas antes da execução. Análise estática como primeira linha de defesa.
SonarQube: Uma plataforma de qualidade de código open-source que realiza análise estática para detectar bugs, vulnerabilidades e code smells em vários idiomas. Documentação Oficial do SonarQube
ESLint: Uma ferramenta de linting plugável para JavaScript e JSX que ajuda a encontrar e corrigir problemas em seu código JavaScript. Documentação Oficial do ESLint
PMD: Um analisador estático de código que reporta problemas encontrados em código Java, como possíveis bugs, código morto, código duplicado e complexidade excessiva. Documentação Oficial do PMD
3
Automação de Testes de Interface
Essenciais para validar o comportamento do sistema do ponto de vista do usuário.
Selenium: Um conjunto de ferramentas para automação de navegadores, amplamente utilizado para testes de aplicativos da web em diferentes browsers e plataformas. Documentação Oficial do Selenium
Cypress: Uma ferramenta de teste front-end que oferece uma experiência de desenvolvimento de teste rápida, fácil e confiável para aplicações web. Documentação Oficial do Cypress
Playwright: Uma biblioteca de automação de navegadores da web para end-to-end testing que suporta Chromium, Firefox e WebKit com uma única API. Documentação Oficial do Playwright
4
Integração Contínua/Entrega Contínua (CI/CD)
Integram testes ao fluxo de entrega. A qualidade passa a fazer parte do processo, não de uma etapa final.
Jenkins: Um servidor de automação open-source que ajuda a automatizar partes do processo de desenvolvimento de software relacionadas à construção, teste e implantação. Documentação Oficial do Jenkins
GitHub Actions: Uma plataforma de CI/CD que permite automatizar fluxos de trabalho de desenvolvimento de software diretamente no seu repositório GitHub. Documentação Oficial do GitHub Actions
GitLab CI/CD: Uma ferramenta poderosa de CI/CD que faz parte do GitLab, permitindo a automação completa do ciclo de vida de desenvolvimento de software. Documentação Oficial do GitLab CI/CD
5
Ferramentas de Cobertura de Código
Indicam o que foi testado. Mas lembre-se: cobertura alta não garante qualidade.
JaCoCo (Java): Uma biblioteca de código aberto para medir a cobertura de código de projetos Java, fornecendo relatórios detalhados sobre a execução do código. Documentação Oficial do JaCoCo
Coverage.py (Python): Uma ferramenta para medir a cobertura de código de programas Python, útil para garantir que seus testes exercitem todas as partes do seu código. Documentação Oficial do Coverage.py
Istanbul (JavaScript): Uma ferramenta de cobertura de código para JavaScript que gera relatórios visuais para identificar áreas não testadas do seu código. Documentação Oficial do Istanbul
6
Gerenciamento de Testes
Organizam o processo de teste. Garantem rastreabilidade e controle sobre o que foi validado.
TestRail: Um software baseado na web para gerenciamento de casos de teste, planos de teste e execução de testes. Documentação Oficial do TestRail
Zephyr: Uma ferramenta de gerenciamento de testes que se integra ao Jira, permitindo planejar, criar e executar testes diretamente no ambiente Jira. Documentação Oficial do Zephyr
qTest: Uma plataforma de gerenciamento de qualidade e testes que oferece recursos para gerenciar o ciclo de vida completo do teste. Documentação Oficial do qTest
Glossário de Termos
Este glossário não foi feito para memorização, mas para consulta. Dominar estes termos significa saber aplicá-los corretamente em contexto, e não apenas repetir definições. Nas avaliações, eles aparecem em situações práticas, não como definições isoladas.
Bug
Um defeito no software que causa um comportamento inesperado ou incorreto.
Caso de Teste
Um conjunto de condições, etapas e resultados esperados para verificar se uma funcionalidade específica está funcionando corretamente.
CI/CD
Acrônimo para Integração Contínua (Continuous Integration) e Entrega Contínua (Continuous Delivery), um conjunto de práticas que automatiza a integração de código, testes e entrega de software.
Cobertura de Código
Uma métrica que mede a quantidade de código-fonte que é executada por um conjunto de testes, indicando a abrangência dos testes. Alta cobertura não garante ausência de defeitos — é uma métrica, não um objetivo final.
Debug
O processo de identificar, analisar e remover bugs ou erros de um programa de computador.
Defeito
Qualquer imperfeição ou deficiência em um produto de software que impede que ele atenda aos requisitos ou expectativas.
DevOps
Um conjunto de práticas que combina desenvolvimento de software (Dev) e operações de TI (Ops) para encurtar o ciclo de vida de desenvolvimento do sistema e fornecer entrega contínua.
Erro
Uma ação humana que produz um resultado incorreto; a causa de um defeito.
Falha
O comportamento observado de um sistema ou componente quando ele não consegue executar suas funções exigidas dentro dos limites especificados.
Falso Negativo
Um teste que falha em detectar um defeito que realmente existe no software. Representa um risco crítico: o sistema parece correto, mas não está.
Falso Positivo
Um teste que relata um defeito ou falha onde não há nenhum, indicando um problema no teste ou nos dados de teste. Gera ruído no processo de teste e pode reduzir a confiança na suíte de testes.
Framework
Um esqueleto de suporte para construir software, fornecendo funcionalidades genéricas que podem ser estendidas ou modificadas.
Integração Contínua
A prática de integrar as alterações de código com frequência (geralmente várias vezes ao dia) em um repositório central, seguida por um build automatizado e testes.
ISTQB
Acrônimo para International Software Testing Qualifications Board, uma organização que certifica profissionais de teste de software.
Métrica
Uma medida quantitativa do grau em que um sistema, componente ou processo possui um dado atributo.
Mock
Um objeto simulado que imita o comportamento de um objeto real de forma controlada, usado principalmente em testes unitários para isolar componentes.
Pipeline
Uma sequência de etapas automatizadas para construir, testar e implantar software, geralmente associada a CI/CD.
Pirâmide de Testes
Um modelo que sugere a alocação de testes em diferentes níveis (unitário, integração, UI), priorizando testes unitários porque são mais rápidos e baratos. Testes de UI são mais lentos e frágeis, por isso devem ser menores em volume.
Refatoração
O processo de reestruturar o código existente sem alterar seu comportamento externo, a fim de melhorar sua legibilidade, desempenho ou manutenibilidade.
Regressão
Um bug ou defeito introduzido no software que faz com que uma funcionalidade que antes funcionava pare de funcionar, exigindo testes de regressão.
Stub
Um objeto que se comporta como um componente real para fins de teste, mas geralmente tem funcionalidade mínima para responder a chamadas, retornando dados pré-determinados.
SUT (System Under Test)
Acrônimo para System Under Test, refere-se ao sistema, componente ou aplicação que está sendo testado.
TDD (Test-Driven Development)
Acrônimo para Test-Driven Development, uma abordagem de desenvolvimento onde os testes são escritos antes do código de produção. Mais do que uma técnica de teste, é uma prática de design de software.
UAT (User Acceptance Testing)
Acrônimo para User Acceptance Testing, um tipo de teste onde os usuários finais verificam se o sistema atende aos requisitos do negócio.
Validação
O processo de avaliar se o sistema final atende às necessidades e expectativas do usuário ("Estamos construindo o produto certo?").
Verificação
O processo de avaliar se um produto de trabalho de software atende às condições impostas no início de uma fase de desenvolvimento ("Estamos construindo o produto corretamente?").
Dicas de Estudo
Nesta seção, o foco é desenvolver raciocínio analítico, não memorizar definições. Estudar testes e garantia da qualidade significa entender o porquê de cada técnica, reconhecer suas limitações e saber aplicá-las em cenários reais com critério técnico.
Como se preparar para as avaliações
Revisão de Conteúdo
Revise os materiais de aula com foco em comparar técnicas, entender suas limitações e analisar em que cenários cada abordagem faz mais sentido.
Prática com Exercícios
Resolva questões baseadas em situações-problema. Analise alternativas plausíveis e escolha a decisão técnica mais adequada ao contexto.
Cronograma de Estudo
Crie um cronograma realista, distribuindo o conteúdo ao longo dos dias que antecedem a avaliação. Os temas se conectam, então avance de forma progressiva.
Tire Dúvidas
Não hesite em procurar professores ou colegas para esclarecer dúvidas antes das avaliações e consolidar seu entendimento com mais segurança.
Estratégias de aprendizado prático (hands-on)
Aprender Fazendo
A melhor forma de aprender é colocar a mão na massa. O projeto integrador é o principal espaço para aplicar conceitos em problemas reais.
Experimentação Contínua
Teste novas ferramentas e técnicas dentro de projetos práticos. A experimentação ganha valor quando ajuda a resolver problemas concretos.
Construção de Portfólio
Desenvolva pequenos projetos que mostrem como você aplica critérios de teste, toma decisões técnicas e resolve cenários reais com clareza.
Desafios de Codificação
Participe de desafios que exijam análise de falhas, validação de hipóteses e aplicação prática de conceitos de testes.
Recursos para prática individual (laboratórios virtuais, projetos pessoais)
Laboratórios Virtuais
Utilize ambientes virtuais para praticar testes com segurança e observar o efeito de cada decisão técnica sem impactar sistemas reais.
Projetos Pessoais
Crie projetos próprios para aplicar conceitos de teste em cenários reais. É nesse espaço que o aprendizado se consolida de forma mais completa.
Plataformas Online
Explore plataformas como GitHub, GitLab ou Bitbucket para analisar projetos open source, identificar oportunidades de teste e contribuir com melhorias.
Comunidades e Fóruns
Participe de comunidades online e fóruns para trocar experiências, comparar abordagens e ampliar sua visão sobre situações práticas.
O que diferencia nota alta
Escolher a melhor decisão técnica
Não basta acertar a resposta. É preciso escolher a alternativa mais adequada ao contexto.
Identificar erros sutis
Perceba inconsistências que passam despercebidas em uma leitura superficial.
Entender o impacto das decisões
Avalie as consequências de cada escolha técnica no sistema como um todo.
Justificar implicitamente
Demonstre raciocínio estruturado, mesmo quando a justificativa não for solicitada explicitamente.
Exemplo de raciocínio esperado
Um sistema possui alta cobertura de testes, mas continua falhando em produção. Qual decisão técnica é mais adequada? A resposta esperada não é uma definição — é uma análise: identificar que cobertura não garante qualidade, avaliar o tipo de testes existentes, considerar testes de integração, sistema e monitoramento em produção.
Como organizar o tempo de estudo
01
Defina Metas Claras
Estabeleça o que você quer aprender em cada sessão e quais tópicos precisa cobrir.
02
Priorize Tarefas
Identifique as tarefas mais importantes e urgentes, dedicando tempo adequado a elas.
03
Técnica Pomodoro
Use a técnica Pomodoro (25 minutos de estudo focado, 5 minutos de pausa) para manter a concentração.
04
Evite Distrações
Crie um ambiente de estudo livre de distrações, desligando notificações e limitando o acesso a redes sociais.
05
Descanse Adequadamente
Garanta que você está descansando o suficiente. O sono é crucial para a consolidação do aprendizado.
Técnicas de memorização para conceitos-chave
Mapas Mentais
Crie mapas mentais para visualizar as conexões entre conceitos e organizar as informações de forma hierárquica.
Flashcards
Utilize flashcards para revisar termos e relações entre conceitos, sempre buscando entender quando cada ideia se aplica.
Associações Visuais
Associe novos conceitos a imagens ou histórias para facilitar a compreensão e a aplicação em contextos diferentes.
Ensine a Outros
Explicar um conceito para outra pessoa é uma das melhores formas de solidificar seu entendimento e testar seu raciocínio.
Como formar grupos de estudo eficazes
Defina Objetivos Claros
Antes de iniciar, estabeleçam o que o grupo pretende alcançar em cada sessão e quais problemas vai analisar.
Estabeleça uma Agenda
Organize os tópicos e o tempo de cada etapa para manter o encontro objetivo e produtivo.
Estimule a Participação
Incentive todos a contribuir, fazer perguntas e comparar argumentos para enriquecer a análise coletiva.
Feedback Construtivo
Pratiquem a discussão e a revisão mútua, oferecendo feedback construtivo para aprimorar o raciocínio de todos.
Preparação para certificações (ISTQB)
1
Material Oficial
Estude os syllabi e glossários oficiais do ISTQB, que são a base para as provas.
2
Cursos Preparatórios
Considere fazer cursos preparatórios oferecidos por instituições credenciadas para a certificação.
3
Simulados
Faça simulados e provas modelo para testar seus conhecimentos e gerenciar o tempo.
4
Comunidade ISTQB
Engaje-se com a comunidade ISTQB para dicas, discussões e materiais de estudo adicionais.
A base conceitual da disciplina está alinhada com o syllabus do ISTQB Foundation Level.
Esses casos de estudo não são apenas histórias marcantes: são cenários reais que mostram as consequências de decisões técnicas inadequadas. Ao analisá-los, o aluno desenvolve o raciocínio necessário para identificar riscos, avaliar estratégias e tomar decisões fundamentadas em contextos semelhantes.
Casos de Estudo Adicionais
Falhas Históricas de Software (além das já mencionadas na Aula 01)
Boeing 737 MAX (MCAS)
Contexto: O sistema de aumento de características de manobra (MCAS) foi projetado para auxiliar no manuseio do avião.
Problema: Falhas de software no MCAS resultaram em dois acidentes fatais.
Solução: Atualizações de software e treinamento aprimorado para pilotos.
Lições Aprendidas: A importância da validação rigorosa de software e da transparência regulatória. Reflita: quais tipos de teste poderiam ter detectado essa falha antes do deploy?
Heartbleed Bug (OpenSSL)
Contexto: Uma vulnerabilidade de segurança crítica na biblioteca OpenSSL.
Problema: Permitia que atacantes lessem a memória dos sistemas protegidos pela OpenSSL, comprometendo chaves secretas.
Solução: Lançamento de patches de segurança e revogação de certificados SSL.
Lições Aprendidas: A necessidade de revisão de código aberta e auditorias de segurança contínuas. Reflita: como revisão de código e testes de segurança se complementam?
Equifax Data Breach
Contexto: Uma das maiores violações de dados da história, afetando milhões de consumidores.
Problema: Falha em aplicar um patch de segurança conhecido para uma vulnerabilidade no Apache Struts.
Solução: Aumento dos investimentos em segurança cibernética e melhoria dos processos de gerenciamento de patches.
Lições Aprendidas: A vital importância da gestão de vulnerabilidades e da resposta a incidentes. Reflita: qual o papel do processo de gestão de mudanças na qualidade do software?
Toyota Unintended Acceleration
Contexto: Casos de veículos Toyota que aceleravam repentinamente sem a intervenção do motorista.
Problema: Inicialmente atribuído a problemas mecânicos, investigações posteriores apontaram para falhas no software.
Solução: Recalls massivos de veículos e revisão dos sistemas de controle eletrônico.
Lições Aprendidas: A complexidade do software embarcado e a necessidade de testes exaustivos em sistemas críticos. Reflita: como testes em sistemas embarcados diferem dos testes convencionais?
Casos de Sucesso em Qualidade
Netflix: Chaos Engineering
Contexto: A Netflix é líder em streaming de vídeo com uma infraestrutura complexa baseada em nuvem.
Problema: Manter a confiabilidade e disponibilidade do serviço em um ambiente distribuído.
Solução: Desenvolveu o Chaos Engineering para testar a resiliência do sistema, introduzindo falhas deliberadamente.
Lições Aprendidas: A proatividade na identificação de pontos fracos antes que causem interrupções reais. Reflita: o que o Chaos Engineering revela sobre os limites dos testes tradicionais?
Google: Test-Driven Development
Contexto: Uma empresa de tecnologia com vasta quantidade de código e equipes distribuídas.
Problema: Garantir a qualidade do software e a sustentabilidade do código em larga escala.
Solução: Adotou amplamente o TDD, escrevendo testes antes do código de produção para guiar o desenvolvimento.
Lições Aprendidas: O TDD melhora o design do código, reduz bugs e facilita a manutenção a longo prazo. Reflita: como o TDD influencia o design do software além da qualidade dos testes?
Microsoft: DevOps Transformation
Contexto: Uma gigante do software com um histórico de ciclos de lançamento longos e complexos.
Problema: Acelerar o tempo de lançamento, melhorar a qualidade e responder rapidamente às necessidades do cliente.
Solução: Implementou práticas DevOps, integrando desenvolvimento, testes e operações em um ciclo contínuo.
Lições Aprendidas: A colaboração e automação são fundamentais para entregas de software mais rápidas e confiáveis. Reflita: qual a relação entre cultura organizacional e qualidade de software?
Amazon: Continuous Deployment
Contexto: Um dos maiores varejistas online do mundo, com necessidade de inovar constantemente.
Problema: Entregar novas funcionalidades aos clientes de forma rápida e segura.
Solução: Pioneira na implantação contínua, fazendo milhares de implantações de código diariamente com alta automação de testes.
Lições Aprendidas: A implantação contínua, apoiada por testes robustos, permite agilidade e minimiza riscos. Reflita: como a automação de testes viabiliza entregas contínuas com segurança?
Estudos de Caso por Setor
Fintech: Segurança e Compliance
Contexto: Setor financeiro que lida com dados sensíveis e regulamentações rigorosas.
Problema: Proteger informações financeiras e garantir a conformidade com leis como GDPR e LGPD.
Solução: Testes de penetração, auditorias de segurança contínuas e validação de conformidade.
Lições Aprendidas: A segurança e a conformidade são não negociáveis e devem ser integradas desde o design. Reflita: como segurança e conformidade orientam as prioridades de teste?
Saúde: Sistemas Críticos
Contexto: Sistemas que impactam diretamente a vida humana, como dispositivos médicos e prontuários eletrônicos.
Problema: Garantir a precisão, confiabilidade e segurança para evitar erros que possam causar danos.
Solução: Testes exaustivos, validação clínica e certificações regulatórias rigorosas.
Lições Aprendidas: A tolerância a falhas é mínima; a qualidade deve ser a prioridade absoluta. Reflita: quais riscos aumentam quando a falha impacta a vida humana?
Automotivo: Software Embarcado
Contexto: Veículos modernos são dependentes de milhões de linhas de código em sistemas embarcados.
Problema: Assegurar o funcionamento correto de recursos críticos como assistência ao motorista e controle do motor.
Solução: Testes em ambiente simulado, hardware-in-the-loop (HIL) e testes de campo.
Lições Aprendidas: A complexidade do software automotivo exige metodologias de teste avançadas e certificações de segurança (ex: ISO 26262). Reflita: por que o contexto embarcado exige estratégias de teste específicas?
E-commerce: Performance e Escalabilidade
Contexto: Plataformas que precisam suportar picos de tráfego (Black Friday) e oferecer uma experiência de usuário rápida.
Problema: Lidar com alta carga de usuários sem degradação de performance ou falhas no sistema.
Solução: Testes de carga, testes de estresse e monitoramento de desempenho em tempo real.
Lições Aprendidas: A performance e a escalabilidade impactam diretamente a receita e a satisfação do cliente. Reflita: como testes de carga ajudam a antecipar falhas em picos de acesso?
Projetos Open Source
Apache Software Foundation
Contexto: Uma comunidade que desenvolve software open source amplamente utilizado, como o Apache HTTP Server.
Problema: Manter a qualidade e a segurança de projetos com contribuições de diversos desenvolvedores.
Solução: Revisão de código por pares, extensa bateria de testes automatizados e forte comunidade de usuários reportando bugs.
Lições Aprendidas: A colaboração da comunidade e a automação de testes são pilares da qualidade em open source. Reflita: esse caso ilustra a importância de testes automatizados e revisão contínua.
Linux Kernel Testing
Contexto: O coração do sistema operacional Linux, mantido por uma vasta rede global de desenvolvedores.
Problema: Garantir a estabilidade, desempenho e compatibilidade do kernel em uma infinidade de hardwares.
Solução: Uma combinação de testes automatizados (CI/CD), testes manuais, fuzzing e relatórios de bugs da comunidade.
Lições Aprendidas: A robustez de um software crítico pode ser alcançada através de uma abordagem de teste multifacetada e global. Reflita: esse caso mostra a força de uma estratégia de testes em camadas.
Mozilla Firefox QA
Contexto: Um navegador web open source com bilhões de usuários.
Problema: Assegurar a compatibilidade com padrões web, desempenho e segurança em constante evolução.
Solução: Equipe dedicada de QA, testes automatizados (unitários, integração, end-to-end), testes de comunidade e beta testing.
Lições Aprendidas: A participação da comunidade e uma estratégia de teste em camadas são essenciais para produtos de consumo de larga escala. Reflita: esse caso evidencia como testes variados ampliam a cobertura de qualidade.