Cheira como uma pergunta de lição de casa.
É necessário testar no campo de software?
Sim. Absolutamente. Em todos os níveis. Fora de alguns domínios especializados, ainda não estamos em um estágio em que possamos provar matematicamente que nosso código está correto em relação a erros específicos (pelo menos não em um período de tempo razoável); portanto, precisamos atirar pedras nele para ver se e onde quebra.
Se criamos um software com muito cuidado, por que devemos testar?
Testar não é apenas encontrar erros de codificação. É também garantir que você atendeu a todos os seus requisitos e que o sistema geral funcione conforme o esperado. Se eu tiver um requisito de que uma transação com falha retorne um código de erro específico, preciso escrever um teste para verificar se a funcionalidade existe e se funciona corretamente.
E tudo isso pressupõe que a especificação e o design sejam completos, corretos e consistentes internamente, o que geralmente não é o caso. Mesmo que você atenda às especificações conforme a letra e siga o design até o último ponto e ponto e vírgula, se a especificação ou o design estiver ruim, haverá problemas no momento da integração. Freqüentemente, o teste do sistema ou da integração ocorre quando você descobre que a especificação em si é defeituosa e precisa ser revisada (veja a história de guerra abaixo).
Após o teste, podemos ter certeza de que atingimos esse objetivo (o produto / software funciona conforme o esperado) porque o testamos? É possível?
Não, não para 100%. Não podemos testar todas as combinações concebíveis de entradas ou caminhos de execução, a não ser no código mais simples. Não podemos responder por todos os fatores ambientais. Não podemos imaginar todos os modos de falha possíveis.
Podemos testar a um ponto onde nós estamos razoavelmente certo de que não existem quaisquer grandes problemas. Novamente, é por isso que precisamos testar em todos os níveis. Escreva um conjunto de testes para garantir que seu código lide adequadamente com as condições de borda (entrada incorreta, resultados inesperados, exceções etc.). Teste de unidade para verificar se seu código atende aos requisitos. Teste do sistema para verificar o processamento de ponta a ponta. Teste de integração para verificar se todos os componentes se comunicam corretamente. Faça testes de usabilidade para garantir que tudo funcione de maneira que os clientes não queiram atirar em você.
Cenário do mundo real - Eu estava trabalhando em um sistema de back-end que ocasionalmente enviava atualizações para um serviço de GUI para exibição em uma tabela na tela. Durante o projeto, foi adicionado um requisito para adicionar filtragem à exibição (por exemplo, o operador pode escolher exibir um subconjunto das entradas na tabela). Erro de design # 1 - a filtragem deveria ter sido feita pelo serviço da GUI (eu tenho essa noção antiquária de que as funções de gerenciamento de exibição devem ser de responsabilidade do software de gerenciamento de exibição), mas devido à política e à minha incapacidade de reconhecer problemas antes que eles se tornem problemas , esse requisito foi colocado no serviço de back-end. Bem, tudo bem, não há problema, eu posso fazer isso. Filtre as alterações de estado, recebo uma mensagem e, em seguida, envio uma mensagem de criação ou exclusão paracada linha da tabela, porque é assim que a interface funciona (erro de design nº 2 - não há como enviar atualizações para várias linhas em uma única mensagem; não conseguimos enviar uma única mensagem "limpar" ou "excluir" para limpar a tabela inteira).
Bem, tudo funciona bem durante o desenvolvimento; os testes de unidade, sistema e integração mostram que eu envio as informações corretas e manejo as alterações de filtro corretamente. Em seguida, chegamos aos testes de usabilidade, e tudo fica mais difícil , porque o volume de dados era esmagador. A latência da rede entre o meu serviço de back-end e a GUI estava na ordem de 0,15 a 0,25 segundos. Nada mal se você precisar enviar atualizações para uma dúzia de linhas ou mais. Mortal quando você precisa enviar atualizações para várias centenas. Começamos a receber relatórios de erros de que a GUI estava congelando após alterar o estado do filtro; bem, não, o que estava acontecendo era que estava levando na ordem de vários minutos para atualizar a exibição porque o protocolo de mensagem de atualização de uma linha de cada vez não suporta um cenário do mundo real.
Observe que tudo isso poderia ter sido e deveria ter sido antecipado por todos, desde o contratante principal até a minha antiguidade, se tivéssemos nos dado o trabalho de fazer a análise mais básica antes. A única defesa que vou oferecer é que estávamos encerrando o segundo ano de um projeto de seis meses que seria descartado quase imediatamente após a entrega, e estávamos todos desesperados para ver o que estava por trás.
O que nos leva à razão final para testar - CYA. Projetos do mundo real falham por uma variedade de razões, muitas delas políticas, e nem todos agem de boa fé quando as coisas dão errado. Os dedos são pontudos, as acusações são feitas e, no final do dia, você precisa apontar para um registro que mostre que pelo menos as suas coisas funcionaram como deveria.
If we create a software with care in during its development period then why should we go for Test?
- porque não importa o quê, até o programador mais habilidoso comete erros.