Conceitos de teste de software

Você já testa software, mas testa direto em código por acreditar ser "mais rápido". Porém, nas rotinas de desenvolvimento que seguem processos e metodologias, é comum que o profissional crie scripts que, através de um comando, comprovem o funcionamento de seu código. Há documentação suficiente para que o próprio programador realize os testes unitários em qualquer linguagem. Teste de software acima de tudo é o que agrega segurança ao deploy. Não é atoa a popularidade de TDD, onde a idéia é construir pequenos protótipos que se completam como um todo em scripts isolados, função por função, com verificações assertivas e monitoramento dos resultados, passando o código produzido, sem erros, para o código fonte real da aplicação.

Testes de software examinam o comportamento do produto por meio de sua execução, e são formas de se garantir a qualidade. Verificação (no contexto de testes) é o conjunto de atividades que garante que o software implementa corretamente uma função específica, enquanto validação garante que o mesmo corresponde aos requisitos. Erros são cometidos pelos programadores, ocasionando inconsistências, deficiências e comportamentos inesperados (fora da especificação). Falhas são eventos notáveis originados por defeitos. O processo de testes é ineficiente. Por que?
  • Pelo custo alto por defeito encontrado e corrigido limitado;
  • Por jamais garantir que um programa está correto necessário;
  • Por não haver técnica que reduza defeitos a ponto de eliminar a necessidade de se testar; Testes em Caixa Branca e Caixa Preta

Por que um software deve ser testado?

Testes são executados com o intuito de simular determinados comportamentos da aplicação, geralmente antes de sua liberação "em produção". Se justificam pela necessidade de se verificar a correta execução de determinada atividade e correticidade frente aos requisitos, também identificando anomalias devido a erros.

Os 7 princípios de testes

  1. Testes mostram a presença de defeitos, mas não provam o contrário;
  2. Testes exaustivos são impossíveis, devido à infinidade de possibilidades, tornam-se inviáveis em termos de custo-benefício;
  3. Testar antes (TDD) devido à vantagem da identificação prévia;
  4. Agrupamento de defeitos onde poucos módulos contém os erros;
  5. Paradoxo do pesticida, que reforça a importância do teste constante, revisto e atualizado;
  6. Teste dependente do contexto com criticidade e impacto diferentes;
  7. Falácia da ausência de defeitos: Existem defeitos que não são encontrados, o que acaba levando a conclusões errôneas;

Quem deve executar os testes de software?

Nas grandes equipes das organizações que produzem software existem especialistas específicos para tal finalidade. No entanto, naqueles contextos de negócios em que existe uma pequena equipe sem o profissional dedicado para testes, é uma boa estratégia envolver não apenas o desenvolvedor, mas também acrescentar visões diferentes sobre o resultado esperado, assim como de outro indivíduo da equipe, da empresa ou mesmo um consultor em outsourcing.

5 atividades fundamentais de um processo de teste

  1. Planejamento e controle : Fase de elaboração da estratégia de testes, definindo objetivos e as atividades para alcançá-los, asim como também a definição da política de testes.
  2. Análise e modelagem : Análise de informações como os requisitos, códigos, processos e seus diagramas para produção dos testes. Itens em condição de teste (com fonte rastreável) devem ser organizados por prioridade.
  3. Implementação e execução : etapa onde dados são disponibilizados aos testadores, e ocorre a especificação dos procedimentos e scripts de teste (itens como a sequência e priorização, se automatizado ou manual, dependências).
  4. Avaliação dos critérios de saída e relatórios : Avaliação de cobertura especifica casos a serem incluídos, enquanto Aceitação diz respeito ao resultado e Processo diz respeito a execução de todas as atividades. Comparação Requisitos x Log de Teste, produzindo documentos:
    • Casos de testes (planejados, executados com sucesso e com fracasso);
    • Defeitos identificados (severidade, prioridade, status);
    • Solicitações de mudança (aceitas ou não, testadas ou não);
    • Custo x Esforço x Tempo (planejado versus realizado);
    • Riscos (mitigados e residuais);
    • Tempo perdido (com eventos blocantes);
    • Resultados nas regressões;
  5. Atividades de encerramento de teste : Envolve a verificação dos entregáveis, dos relatórios, arquivamento para reutilização dos artefatos e estrutura pela organização, e documentação das lições aprendidas.

Estratégias de testes dos modelos de ciclo de vida

Testes em no ciclo de vida em cascata
  • Ciclo de vida sequencial em cascata (V) : Estratégia de prevenção, baseada na análise dos requisitos. Equipe de testes independente, seguindo a sequência Definir » Implementar » Testar ao final.
  • Ciclo de vida iterativo por protótipo : requisitos são enregues no início de cada iteração e a prioridade são riscos de qualidade. Cada incremento significativo da iteração é testado.
  • Ciclo de vida incremental em espiral : protótipos são testados, redesenhados e retestados.
Desenvolvimento ágil : O cliente fornce feedback contínuo, e suas estórias geram funcionalidades. Ocorre a programação em par com testes prévios a implementações (ex: XP, SCRUM). Testes de integração são executados a cada pull-request.

Verificação estática e dinâmica.

  • Verificações estáticas ocorrem na inspeção de software e podem ser suportadas por ferramentas de análise de código (ex. Travis CI)
  • Verificações dinâmicas ocorrem em testes de software. O sistema é executado com dados de teste e seu comportamento operacional é observado.

Vantagens de se realizar os 3 (três) tipos de testes estáticos

  • Testes estáticos oferecem uma maneira de melhorar a produtividade e qualidade do desenvolvimento de software, através das ferramentas de análise, revisando e inspecionando suas variações. Podem iniciar muito cedo no ciclo de vida, produzem mais qualidade e reduzem custos com retrabalhos (nas fases finais).
  • Inspeção simples : detecção de defeitos na lógica e no código de maneira informal;
  • Revisão de apresentação (walkthrough) : Podem ocorrer a qualquer momento mediante planejamento. Líder, relator, autor e membros consideram implementações alternativas, além de avaliar a conformidade com padrões e especificações. Envolve treinamento da equipe e troca de idéias; Revisão técnica : uma equipe qualificada avalia formalmente o produto quanto a padrões e especificações. Líder, relator, leitor, autor e inspetores mantendo foco na simplicidade, são definidos itens relevantes, aplicados treinamentos e documentados os resultados.

Testes de caixa-preta e testes de caixa-branca (white-box tests)

Testes de caixa preta (black-box) : são baseados em especificação e consideram apenas entradas aceitas pelo componente(função) e saídas esperadas. Visa identificar anomalias de código, interfaces, fontes de dados e performance. Testes de caixa branca (white-box) testes baseados na estrutura do código que visam garantir que os caminhos independentes sejam executados pelo menos uma vez. Testa as possibilidades de afirmação e negação, as operações em loop e a validade das estruturas de dados. Testes de integração garantem que o novo código se adequa ao existente. São parte de um processo automatizado no controle de versões onde a cada pull-request as rotas da aplicação são executada s para verificar a presença de erros.

Estratégias de modelagem de testes de caixa-preta (black-box tests)

  • Testes exaustivos : Exploram n possibilidades de entrada e saída, e demandam muito tempo.
  • Testes aleatórios : Entradas dos casos são aleatórias dentro de uma margem. Eficácia considerada baixa. Conhecidos nos testes de stress.
  • Partição em classes de equivalência : Eleição de um número finito, representante da classe. Intervalo de valores válidos (criação das classes abaixo,na margem e acima dela), conjunto de valores válidos (uma classe com valores aceitos, outra com valores inválidos), valor e característica mandatórios (como validação do primeiro caractére), e elemento distinto (subdivisão da classe).
  • Análise dos valores de borda : Consideração de valores dentro da classe, abaixo da fronteira e acima da fronteira.
Enfim, temos a sorte de contar com uma infinidade de frameworks free de testes de todas as tribos e linguagens, que podem agregar integridade, confiabilidade e resiliência ao código, garantindo a satisfação do chefe, dos clientes e nosso tapinha nas costas :)
2 Anos de experiência em PHP são base sólida para assimilação de outras linguagens e busca de novos desafios. A criação de Sistemas Web e Websites responsivos são minha especialidade. Busco constantemente o aperfeiçoamento das técnicas utilizadas com foco em boas práticas através do conhecimento adquirido das metodologias. O conhecimento diferenciado da língua norte-americana proporciona segurança para programar na língua e entender manuais técnicos. Já em posse dos conceitos as metas perseguidas têm sido o aprofundamento em JavaScript serverside, ASP.NET e aplicações mobile híbridas.