Testes e Qualidade de Software
Testes e Qualidade de Software
Código: INF1935 | Carga horária: 72h (4 créditos)
Horário e local: – UNICAP
Esta disciplina aborda os fundamentos de testes de software, garantia da qualidade e processos de verificação e validação. Os alunos aprenderão técnicas de teste manual e automatizado, métricas de qualidade e integração contínua.
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
Este material complementar oferece recursos adicionais para aprofundar seus estudos em cada tópico abordado na disciplina.
Bibliografia e Recursos
Nesta seção, você encontrará uma compilação de materiais essenciais e complementares para aprofundar seus conhecimentos em Testes e Qualidade de Software, incluindo livros, artigos e recursos online.
Bibliografia Obrigatória
DELAMARO, Márcio E. (2007). Fundamentos de Teste de Software. Pearson Education do Brasil.
PRESSMAN, Roger S. (2010). Engenharia de Software: Uma Abordagem Profissional. McGraw-Hill.
MYERS, Glenford J.; et al. (2011). The Art of Software Testing. Wiley.
Bibliografia Complementar
BEIZER, Boris. (1990). Software Testing Techniques. Van Nostrand Reinhold.
BECK, Kent. (2000). Extreme Programming Explained: Embrace Change. Addison-Wesley.
GRAHAM, Dorothy; VAN VEENENDAAL, Erik; EVANS, Isabel. (2007). Foundations of Software Testing: ISTQB Certification. Cengage Learning.
Artigos Científicos Relevantes
  • 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
Nesta seção, exploraremos as principais ferramentas utilizadas em testes e garantia da qualidade de software, categorizadas para facilitar o entendimento de suas aplicações no ciclo de desenvolvimento.
1
Frameworks de Teste Unitário
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
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
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)
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
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
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
A seguir, apresentamos um glossário dos principais termos utilizados na disciplina de testes e garantia da qualidade de software, organizados em ordem alfabética para facilitar a consulta.
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.
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.
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.
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) com a maioria dos testes sendo unitários para maior eficiência.
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.
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, exploraremos diversas estratégias e recursos para otimizar sua jornada de aprendizado na área de testes e garantia da qualidade de software. Desde a preparação para avaliações até técnicas de memorização e formação de grupos de estudo, estas dicas são projetadas para ajudá-lo a alcançar o sucesso acadêmico e profissional.
Como se preparar para as avaliações
Revisão de Conteúdo
Revise os materiais de aula, anotações e leituras recomendadas. Foque nos tópicos-chave e conceitos fundamentais.
Prática com Exercícios
Resolva exercícios e questões de provas anteriores para familiarizar-se com o formato e o tipo de perguntas.
Cronograma de Estudo
Crie um cronograma de estudo realista, distribuindo o conteúdo ao longo dos dias que antecedem a avaliação.
Tire Dúvidas
Não hesite em procurar professores ou colegas para esclarecer dúvidas antes das avaliações.
Estratégias de aprendizado prático (hands-on)
Aprender Fazendo
A melhor forma de aprender é colocando a mão na massa. Implemente os conceitos aprendidos em projetos práticos.
Experimentação Contínua
Não tenha medo de experimentar novas ferramentas e técnicas. A prática leva à familiaridade e ao domínio.
Construção de Portfólio
Desenvolva pequenos projetos que demonstrem suas habilidades e conhecimentos na área de testes.
Desafios de Codificação
Participe de plataformas com desafios de codificação e resolução de problemas relacionados a testes.
Recursos para prática individual (laboratórios virtuais, projetos pessoais)
Laboratórios Virtuais
Utilize ambientes de laboratório virtuais para praticar testes sem impactar sistemas reais.
Projetos Pessoais
Crie seus próprios projetos de software para aplicar os conhecimentos de teste em cenários reais.
Plataformas Online
Explore plataformas como GitHub, GitLab ou Bitbucket para encontrar projetos open source e contribuir com testes.
Comunidades e Fóruns
Participe de comunidades online e fóruns para trocar experiências e encontrar recursos de prática.
Como organizar o tempo de estudo
01
Defina Metas Claras
Estabeleça o que você quer aprender em cada sessão de estudo 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, definições e conceitos de forma eficiente e espaçada.
Associações Visuais
Associe novos conceitos a imagens ou histórias para facilitar a recordação e a fixação na memória.
Ensine a Outros
Explicar um conceito para outra pessoa é uma das melhores formas de solidificar seu próprio entendimento.
Como formar grupos de estudo eficazes
Defina Objetivos Claros
Antes de iniciar, estabeleçam juntos o que o grupo pretende alcançar em cada sessão de estudo.
Estabeleça uma Agenda
Organize os tópicos a serem discutidos e o tempo dedicado a cada um para otimizar o encontro.
Estimule a Participação
Incentive todos os membros a contribuir, fazer perguntas e compartilhar seus conhecimentos.
Feedback Construtivo
Pratiquem a discussão e a revisão mútua, oferecendo feedback construtivo uns aos outros.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.