Testes de software Conceitos e práticas para conquistar e manter a qualidade de software
Thiago Leite e Carvalho, João Frederico Roldan Viana
Prefácio
Em uma era em que a tecnologia permeia cada faceta de nossas vidas, a dependência de softwares robustos, confiáveis e seguros é inegável e cresce exponencialmente a cada dia. Imagine o seu dia a dia: desde o momento em que você desperta e verifica as notificações em seu smartphone, passando pelas inúmeras interações com aplicativos para comunicação, entretenimento, trabalho e serviços bancários, até a hora em que você se deita e utiliza um aplicativo para monitorar seu sono, o software está presente. E essa onipresença não se limita aos dispositivos móveis: sistemas complexos e sofisticados controlam infraestruturas críticas como usinas nucleares, redes elétricas, hospitais, instituições financeiras, sistemas de transporte e veículos autônomos, impactando diretamente a vida de milhões de pessoas.
Nesse cenário, onde a sociedade moderna se apoia cada vez mais em softwares para funcionar, a qualidade, a confiabilidade e a segurança desses se tornam não apenas desejáveis, mas absolutamente essenciais. Falhas em softwares podem gerar consequências que variam de meros inconvenientes, como a perda de dados em um aplicativo de notas, a interrupção temporária de um serviço online ou a exibição incorreta de informações, as perdas financeiras catastróficas, como a quebra de um sistema bancário, o vazamento de dados confidenciais de clientes ou até mesmo a interrupção de serviços essenciais, os quais colocam vidas em risco, como sistemas de controle de tráfego aéreo, equipamentos médicos, veículos autônomos e sistemas de controle industrial.
Um exemplo que ilustra o impacto devastador de falhas de software foi a atualização defeituosa do software Falcon, da empresa de cibersegurança CrowdStrike, em julho de 2024. Essa falha causou travamentos generalizados em sistemas Windows, resultando em interrupções significativas em serviços essenciais ao redor do mundo. Empresas aéreas tiveram voos cancelados, instituições financeiras enfrentaram paralisações e sistemas hospitalares foram afetados, demonstrando como a ausência de testes rigorosos pode gerar consequências globais. O incidente, que não foi fruto de um ataque cibernético, mas de um erro em uma única atualização, evidência a necessidade urgente de processos robustos de testes e validação em todas as fases do desenvolvimento de software.
O setor de saúde é um outro excelente exemplo de onde a tolerância para erros em softwares é cada vez menor. Softwares controlam equipamentos médicos como marcapassos, bombas de insulina, sistemas de radioterapia e cirurgias robóticas, e gerenciam informações críticas de pacientes em sistemas de prontuário eletrônico, diagnóstico por imagem e telemedicina. Falhas nesses sistemas podem ter consequências graves, como diagnósticos errados, dosagens incorretas de medicamentos, mau funcionamento de equipamentos e até mesmo a morte de pacientes. Todas as áreas já citadas possuem softwares cada vez mais complexos e essenciais, onde falhas podem causar interrupções nos serviços e riscos aos setores. Isso aumenta a necessidade de testes rigorosos.
Os testes de software são atividades que visam identificar falhas e garantir que o software atenda aos requisitos especificados, incluindo requisitos funcionais e não funcionais, como desempenho, segurança e usabilidade. Eles são essenciais para garantir a qualidade, a confiabilidade, a segurança e o desempenho dos softwares, e devem ser realizados em todas as fases do desenvolvimento, desde a concepção até a implantação e manutenção.
Ao longo deste livro, Thiago e Fred exploram em detalhes os diferentes tipos de testes de software, como testes unitários, testes de integração, testes de sistema e testes de aceitação. Cada um desses tipos é abordado com explicações teóricas e práticas, complementados por exemplos detalhados que facilitarão a compreensão e aplicação em projetos reais. Dessa forma, você aprenderá a identificar os cenários ideais para cada tipo de teste e como integrá-los eficientemente no ciclo de desenvolvimento. Os autores abordam as melhores práticas para cada tipo de teste, como técnicas de caixa branca e caixa preta, além de ferramentas amplamente utilizadas no mercado, como Selenium, JUnit, Jasmine e Rest-Assured. O livro também apresenta técnicas avançadas de teste, como regressão, desempenho, segurança, acessibilidade e usabilidade.
Outro conteúdo relevante é a apresentação de técnicas de testes focadas em metodologias ágeis, como TDD (Test-Driven Development), BDD (Behavior-Driven Development) e ATDD (Acceptance Test-Driven Development), que ajudam a integrar os testes nos ciclos rápidos de desenvolvimento, alinhando-os aos objetivos de negócio e às expectativas dos usuários.
Para auxiliar no entendimento de tudo isso, alguns capítulos incluem exemplos práticos, como criação de cenários de teste, desenvolvimento de scripts automatizados e análise de resultados. Para facilitar, os códigos estarão disponíveis em um repositório GitHub, permitindo adaptação e reutilização nos seus projetos.
Enfim, explora-se como desenvolver estratégias de teste eficientes para projetos complexos, desde o planejamento inicial até a execução e o monitoramento contínuo. Exemplos de planos e cronogramas de testes estarão disponíveis, ajudando a personalizar e implementar estratégias para atender às necessidades específicas de cada projeto.
Este livro não apenas ensina os fundamentos dos testes de software, mas também capacita você a aplicá-los de forma prática e estratégica, promovendo o desenvolvimento de sistemas mais confiáveis, seguros e de alta qualidade. Desejo a você uma leitura enriquecedora e transformadora!
— Francisco Nauber Bernardo Gois
Sobre o livro
Uma coisa é certa: em algum momento seu software vai falhar. Então o ponto-chave no desenvolvimento de software não é evitar todas as falhas possíveis, mas, sim, diminuir ao máximo a possibilidade de ocorrências delas e reduzir os seus impactos caso ocorram. Como alcançar isso? Realizando testes de software.
Embora este assunto seja amplamente conhecido e com um vasto conteúdo disponível, infelizmente ele é pouco posto em prática. Os principais motivos disso são:
1. Falta de conhecimento sobre as teorias basilares de testes;
2. Falta de incentivo na prática de criação de testes e a disseminação do conhecimento necessário para a criação destes;
3. E finalmente o principal motivo: o custo alto de criá-los.
Sempre que um projeto entra em um ponto de criticidade de prazo ou custo, a primeira coisa a ser "cortada" é a criação de testes. Isso ocorre devido ao fato de que eles são menos palpáveis aos olhos do cliente, que é quem paga pelo software. Além disso, geralmente o cliente não quer "pagar a conta" dos testes e isso fica a cargo da empresa que está desenvolvendo o software, e que nem sempre tem capacidade de custeá-los.
Para demonstrar que vale a pena bancá-los — seja pelo lado de quem paga como pelo lado de quem desenvolve —, é que este livro foi escrito. Esta obra tem como principal intuito apresentar toda a teoria por detrás desta área, assim como suas práticas, para então consolidar a ideia de que testar software não é caro ou, pelo menos, é muito mais barato do que deixar a margem para o aparecimento de falhas em produção.
Este livro aborda desde assuntos iniciais como qualidade de software e outros conceitos que formam a base para avançarmos em testes, chegando até a apresentação de códigos em diversas APIs para a criação de testes. Todas as teorias e práticas apresentadas neste livro podem ser aplicadas em sua totalidade ou parcialidade em qualquer linguagem de programação e em qualquer projeto de software, bastando um estudo das necessidades a serem cobertas, para identificar o que pode ser aplicado e, com isso, obter o melhor retorno ao investido em tempo e dinheiro.
Um diferencial desta obra em relação a outras existentes é a apresentação tanto da teoria como a prática de testes. Estas estão aglutinadas e organizadas de forma que se possa entender e usufruir de ambas ao máximo. Além disso, alguns apêndices também são disponibilizados para acrescentar temas relevantes. É válido ressaltar que explorar todos os possíveis testes que pudessem ser aplicados, seja em diferentes linguagens ou diferentes cenários de testes de um determinado projeto, tornaria este livro uma "bíblia", o que não é nosso desejo e, mesmo que fosse, não teríamos como fazê-lo devido a ser uma atividade praticamente interminável. Assim sendo, focamos na linguagem Java e Angular e nas camadas de front e back e, ainda assim, conseguiremos exemplificar todas as teorias aqui abordadas de modo que seja proveitoso e abstraível para você conseguir aplicá-las no seu próprio contexto.
É importante frisar que este livro não é um curso de Java ou Angular, assim como não é um curso dos componentes que serão usados para criar os testes nestas linguagens e camadas. Todavia, tudo que aqui for apresentado será essencial e mínimo para a criação de testes de qualidade, que visam possibilitar a criação de softwares mais confiáveis. Além disso, também servirá de base teórica e prática para a criação de testes mais complexos.
Como ferramentas de desenvolvimento usaremos o Spring Tools e VSCode, para Java (back-end) e Angular (front-end), respectivamente. Muitos códigos serão expostos para viabilizar a disseminação das teorias e práticas de testes, e exercícios serão propostos para consolidar os assuntos aqui abordados. Todos os códigos criados para exemplificação estarão disponíveis no perfil do GitHub (em https://github.com/thiagoleiteecarvalho), nos repositórios que iniciam com "lt". Uma aplicação de exemplo também será disponibilizada para auxiliar o seu entendimento.
Esperamos que a leitura seja prazerosa e enriquecedora. Com a ajuda da Casa do Código, trabalhamos de forma árdua para explicar, da forma mais amigável e estimulante, todos os conceitos envolvidos pela teoria de testes de software. Este livro é a realização de um projeto que visa fornecer um ferramental completo para a aplicação de testes de software em qualquer projeto ou empresa. Nossa meta é ajudar na criação de softwares de sucesso. Agradecemos a escolha deste livro.
Sumário
- 1 Introdução
- 2 Um pouco de Engenharia de Software
- 2.1 O que é software?
- 2.2 O que é Engenharia de Software?
- 2.3 O que da Engenharia de Software será abordado neste livro?
- 2.4 Conclusão
- 3 Qualidade de software
- 3.1 O que é qualidade de software?
- 3.2 Como atingir qualidade de software?
- 3.3 Alcançando a qualidade
- 3.4 Conclusão
- 4 Conceitos de teste de software
- 4.1 O que é testar um software?
- 4.2 Erro vs. defeito vs. falha
- 4.3 Os pilares de um teste
- 4.4 Dimensões do teste
- 4.5 Conclusão
- 5 Aplicação de exemplo
- 5.1 Apresentação
- 5.2 Componentes para os testes
- 5.3 Conclusão
- 6 Técnicas de teste: Como
- 6.1 Teste de Caixa Branca (estrutural)
- 6.2 Teste de Caixa Preta (funcional)
- 6.3 Teste de Caixa Cinza
- 6.4 Conclusão
- 7 Níveis de teste: Quando
- 7.1 Unidade
- 7.2 Integração
- 7.3 Sistema
- 7.4 Aceitação
- 7.5 Conclusão
- 8 Tipos de teste: O quê
- 8.1 Funcional
- 8.2 Regressão
- 8.3 Performance
- 8.4 Usabilidade
- 8.5 Segurança
- 8.6 Acessibilidade
- 8.7 Portabilidade
- 8.8 Como + Quando + O que: como testes de fato são realizados
- 8.9 Fatores McCall e Atributos ISO 9126 vs. Tipos de Teste
- 8.10 Conclusão
- 9 Como realizar testes
- 9.1 Planejar
- 9.2 Projetar
- 9.3 Implementar
- 9.4 Executar
- 9.5 Avaliar
- 9.6 Conclusão
- 10 Testes ágeis
- 10.1 O manifesto ágil dos testes
- 10.2 Aplicando testes ágeis
- 10.3 Conclusão
- 11 Apêndice I: Padrões de validação de código
- 11.1 FindBugs
- 11.2 CheckStyle
- 11.3 Sonar
- 11.4 Conclusão
- 12 Apêndice II: Modelos de testes
- 12.1 TDD — Test Driven Development
- 12.2 BDD — Behavior Driven Development
- 12.3 ATDD — Acceptance Test-Driven Development
- 12.4 Conclusão
- 13 Apêndice III: Exemplo de Plano de Teste e Cronograma de Teste
- 13.1 Plano de Teste
- 13.2 Cronograma de teste
- 14 Apêndice IV: Exemplo de uso do Testlink e Mantis
- 14.1 Testlink
- 14.2 Mantis
- 14.3 Conclusão
- 15 Referências bibliográficas
Dados do produto
- Número de páginas:
- 308
- ISBN:
- 978-85-5519-397-2
- Data publicação:
- 03/2025