Os testes de software são realmente necessários?


33

Sou estudante do meu BE (CS) e minha pergunta é a seguinte:

  1. É necessário testar no campo de software?
  2. Se criamos um software com muito cuidado, por que devemos testar?
  3. Após o teste, podemos ter certeza de que alcançamos esse objetivo (o produto / software funciona conforme o esperado) porque o testamos ? É possível?

Minha pergunta: É necessário testar o software ?


34
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.
sukhbir

6
@anto É muito provável que você seja de uma escola indiana? Eu não quero dizer mal, eu só pode ter uma idéia de seu fundo com a estar aqui ....
Gideon

7
Teste de software só é necessário se você não fornecer uma prova formal de correção :-)
RSP

13
@jwenting: Você aprenderá no futuro que a linguagem falada não se correlaciona bem com a habilidade de programação. Como um falante de inglês não nativo não pode falar inglês, isso não significa que ele não pode programar. Acho vergonhoso para a comunidade que você esteja tão disposto a dar uma facada em alguém que está procurando orientação.
21411 Chris

10
Claro que não. A oração é igualmente boa.
22712 gruszczy

Respostas:


79

Sim. Porque não importa o quão bom você seja, você não consegue pensar em tudo.

  • Você também será solicitado a fazer com que seu software faça coisas que você nunca pretendeu.
  • Você também nunca terá requisitos tão claros que poderá pensar em todas as possibilidades para garantir que o código não seja quebrado.
  • Você também trabalhará com o software e as APIs de outras pessoas que nem sempre funcionarão como planejado, mas presumirá que isso funcione ou deva levar a defeitos no seu caso "perfeito".

+1 Você faz pontos extremamente bons no mundo real !! Gostaria de poder votar duas vezes!
Gideon

8
+1 em "Você também nunca terá requisitos tão claros que poderá pensar em todas as possibilidades para garantir que o código não seja quebrado". Meu local de trabalho é muito menos disfuncional do que a maioria, e nossa equipe de gerenciamento de produtos cria requisitos muito bons. Eu ainda frequentemente tenho um punhado de "e esse caso?" perguntas antes de concluir um recurso. E, em seguida, o controle de qualidade e, ocasionalmente, os usuários finais ainda encontram bugs nos casos extremos que ninguém considerou.
Mason Wheeler

1
+1 para o ponto 3. Compiladores, bibliotecas de SO, componentes de terceiros - a menos que você esteja escrevendo corretamente, sempre terminará dependendo do código que está fora de seu controle.
TMN

78

sim

Pela mesma razão que um chef prova sua comida enquanto cozinha.


7
Mesmo os mestres não devem supor que seu trabalho nunca precise de correção.
gablin

26
Nunca comer um prato preparados por um chef fina
JBRWilkinson

5
@JBRWilkinson: Um chef magro pode ser um chef melhor se ele arrumar seus pratos com mais frequência e, portanto, não provar sua comida o tempo todo, do que um chef 'gordo' que tem que provar sua comida o tempo todo. : P
chiurox 22/03

8
@ gablin - Você pode dizer que os mestres sabem que seu trabalho precisa constantemente de correção.
Dan Ray

18

Eu trabalho com alguém que pensa assim, ele pensa que, por ser um programador sênior, não precisa mais testar seu código. A empresa não entende o quão perigosa é essa atitude e, em vez de demiti-lo, eles contrataram mais programadores para lidar com a lista de pendências de bugs. Sem saber de onde vem esse atraso, eles acham que faz parte do que é a programação. Basicamente, temos 3 programadores que trabalham nesse modo e uma equipe de 20 pessoas que nada mais faz do que testar e corrigir os erros que esses três criam.

AUSÊNCIA DE ADEQUADO TESTE MATA .

Então, a menos que você seja DEUS ou qualquer versão de algum ser que tudo saiba (agora é isso que eu gostaria de ver) ou a menos que você queira ativamente ser demitido muito rápido, sugiro fortemente que você comece a testar.


O Therac-25 não é realmente um bom exemplo, porque teria sido muito difícil expor isso nos testes.
Loren Pechtel

4
Mesmo "Deus" poderia ter usado alguns testadores (embora eu acho que ele resolve todos os erros como "by design"): P
Tester101

1
@Newtoplan, pensou em contar ao seu chefe?

2
@ Thorbjorn: Eu contei a ele, mas eles (a gerência em geral) nem sequer percebem a verdadeira situação. Na verdade, eles o percebem como o deus da programação e culpam o resto da equipe por não encontrar e corrigir bugs como eles foram contratados para fazer ... além disso, ele cria um código esotérico às vezes que treina alguém para se familiarizar o suficiente para tentar as alterações podem levar mais de 2 anos; novamente, a gerência acha que isso é normal com uma base de código de 750k loc (na verdade, elas medem a 1,5m, mas metade é de comentários) (desculpe, eu não sei como obter o slashed o corretamente :-( )
Newtopian 22/03

1
Isso é para não mencionar Ariane-5 e Londres Ambulância Computer Aided Serviço de Despacho: lond.ambulance.freeuk.com/cad.html
StuperUser

9

O software é escrito por pessoas.

As pessoas são imperfeitas e cometem erros.

À medida que a complexidade de uma empresa aumenta, aumenta o número potencial (e o impacto) de erros, omissões ou coisas esquecidas - geralmente exponencialmente.

Então, sim, é necessário testar. Traz equilíbrio e perspectiva.


6

Você embarcará em um voo que executa um sistema operacional que você sabe que usou no seu laptop e lhe deu uma tela da morte na sua cor favorita? Pense nisso.

Nenhum codificador é perfeito. Muito, muito, muito longe disso realmente. Você precisa testar, e os testadores geralmente trazem uma perspectiva (também conhecida como casos de uso) que os desenvolvedores estavam ausentes.

Faça uma pesquisa nos bugs de software mais famosos do Google para saber o que quero dizer.

E no nível da faculdade, leia sobre desenvolvimento orientado a testes, testes de unidade e práticas ágeis para saber onde estão as coisas no momento.


obrigado. Você poderia me dizer alguns recursos para obter testes de unidade aprendidos, práticas ágeis, como você mencionou!
Ant

1
Definitivamente, assino o "não é perfeito", tenho um conhecimento bastante razoável de C ++ e várias de suas regras misteriosas ... e, no entanto, regularmente atrapalho ao reverter as condições booleanas: / Teste é necessário , pensei porque algo passa nos testes não significa (de forma alguma) que funcione;)
Matthieu M.

4

O teste é uma necessidade absoluta para qualquer aplicativo não trivial (em tamanho ou função) que deve ser realmente usado. Você não encontrará um único desenvolvedor que se preocupe com seu ofício (como evidenciado pela visita a este site) que responderá e dirá que o teste não é necessário.

Além do que já foi publicado, ter um conjunto completo de testes de unidade automatizados em qualquer aplicativo dará a você mais confiança em futuras alterações de código. Essa confiança mais alta (como os testes de unidade fornecem uma grande rede de segurança) resultará em alterações mais rápidas do código nos aplicativos existentes (devido a menos retorno / verificação dupla)


4

Errare humanum est

Não existe software livre de erros.

O desenvolvedor mais habilidoso escreve código com bugs. Mesmo se um desenvolvedor perfeito existisse, ainda haveria erros devido a discrepâncias entre:

  • documentos de necessidades e especificações do usuário
  • especificação e design
  • ambientes reais e esperados de hardware e software
  • ontem e hoje verdade: tudo listado acima está sujeito a alterações que não são perfeitamente relatadas em todas as etapas do processo de desenvolvimento.

O desenvolvedor perfeito é apenas uma parte de tudo. E desenvolvedores perfeitos não existem.


Você mostra um bom conhecimento sobre como o software falha. Mas a razão final pela qual o software falha não é porque o homem erra. Pelo contrário, é porque não existe nenhum método comprovado para criar um sistema de software livre de erros. Vou escrever sobre isso mais tarde.
CuongHuyTo

@CuongHuyTo - Você tem métodos formais em mente?
Mouviciel

3

A maioria dos programas da vida real:

a) contém centenas de linhas de código ou mais, espalhadas por vários arquivos;
b) são desenvolvidos por mais de um programador;
c) usado em ambientes diferentes do ambiente do desenvolvedor

Portanto, se você não verificar como o programa funciona na situação da vida real, a chance de que ele não funcione seria de quase 100%.


3

Além de todas as outras ótimas respostas, mesmo que você saiba que é perfeito e sem erros, pense nos outros programadores que precisam lidar com seu código no futuro. Eles não saberão como você e confiarão nos seus testes para garantir que não quebraram nada depois de fazer uma alteração. Isso também se aplica a você mesmo depois de não ter visto seu código há um ano!


3

SIM.

Aqui está outra perspectiva um pouco mais sutil que ainda não foi totalmente abordada:

Nunca subestime a necessidade de "verificação independente" . É a mesma razão pela qual é bom ter alguns editores independentes revisando seu trabalho antes de enviar uma grande parte da redação para publicação. Não importa quão bom você seja um escritor, você ocasionalmente fará um peido cerebral - e escreverá algo como "no" no lugar de "it", ou algo assim. Se você reler você mesmo, mesmo com bastante cuidado, ainda assim sentirá falta, porque seu cérebro aceita automaticamente o fluxo do processo de pensamento como correto e encobre o erro. Para um novo conjunto de olhos, esse tipo de erro geralmente é bastante evidente.

Você obtém a mesma coisa na programação: é muito fácil entrar em um fluxo em que o seu código ou o seu "teste de desenvolvimento" básico do seu próprio código - parece correto, porque você está testando e usando uma determinada maneira. Mas então, quando outro par de mãos aparece e clica nas coisas de uma maneira ou ordem ligeiramente diferente, tudo desaba.

Agora, é claro, você poderia, em teoria, seguir o caminho de verificar formalmente todas as possibilidades e ramificações lógicas do seu código, mas para softwares não triviais, isso será muito mais caro e demorado do que fazer com que alguém se intrometa. código para você. E você provavelmente ainda sentirá falta de coisas nas quais nunca pensou.


2

O que ainda não foi tocado: mesmo que seu código seja perfeito, você ainda não está seguro. Os compiladores têm bugs que podem fazer com que o código perfeito se comporte incorretamente após a compilação. Os sistemas operacionais possuem bugs que podem fazer com que um binário perfeito se comporte incorretamente ao executar. O hardware possui bugs que podem causar problemas.

É também por isso que testar em uma máquina não é suficiente para produtos comerciais. Eles precisam ser testados com o maior número possível de combinações de hardware e software que puderem encontrar na natureza.


2

O líder da equipe que escreveu o software para o ônibus espacial voou antes de cada lançamento para assinar que o software não prejudicaria o ônibus espacial.

O que você acha que lhe deu confiança para fazer isso?


1

Você está constantemente testando o código apenas compilando e usando-o. Em alguns IDE, você recebe verificações de sanidade enquanto digita. A menos que você nunca execute seu código, você está realizando testes.

O quanto você testa é realmente a raiz desse tipo de pergunta e a resposta a ela se resume a risco. Você testa o quanto faz sentido do ponto de vista do gerenciamento de riscos. Testar tudo ou nada é geralmente impossível. Testar quase nada é geralmente uma má jogada. Tudo no meio é um jogo justo, dependendo do nível de risco e da exposição do seu produto final.


1

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.


0

Os testes sempre serão feitos e os erros sempre serão encontrados. É apenas que o teste será realizado internamente pela sua equipe ou o usuário final será o testador. O custo de um bug encontrado pelo usuário final é tremendamente mais alto do que se tivesse sido encontrado durante o teste.


0

Eu sugeriria fazer um bom curso de computação tolerante a falhas. O design cuidadoso do software é apenas um dos pilares para obter robustez no seu produto de software. Os outros dois pilares são testes suficientes e design redundante. A intenção básica é acomodar um número exponencial de condições de falha desconhecidas e priorizar o tratamento com alguns dos conhecidos:

1.) elimine o maior número possível de falhas através do design e implementação adequada 2.) elimine falhas imprevistas da fase de design e implementação incorreta através de várias formas de teste (unidade, integração, aleatória) 3.) lide com as falhas restantes por redundância ( temporal => recompute, tente novamente ou espacial => mantenha cópias, paridade)

Se você eliminar a fase de teste, ficará com apenas as fases de design e redundância para solucionar falhas.

Além disso, do ponto de vista do produto, suas partes interessadas (por exemplo, gerência, usuários, investidores) desejam algum tipo de garantia de que seu produto atende a determinadas especificações, critérios de qualidade e segurança, etc. Além de tudo isso, você não testou o software que você construiu apenas para ter um 'teste de sanidade'? Todos esses motivos tornam os testes de software mais atraentes.


0

Todos os programas têm erros, pelo menos para começar.

Houve alguns estudos que convergem em cerca de 1 bug a cada cinco linhas de código não testado.

Uma lição de história:

Na década de 1960, a IBM precisava de um programa "NOP" para poder executar alguma funcionalidade na JCL sem realmente executar um programa. Os desenvolvedores criaram um programa assembler de uma linha no qual todo o código estava contido em seu nome "IEFBR14", sendo o código real:

       BR 14 * brach to return address in register 14

Durante seu longo período de espera, este programa de uma linha foi sujeito a 2 relatórios de bugs e cinco alterações.


-1

A refatoração de código é muito mais rápida quando você faz testes de unidade. Um teste de unidade também mostra o uso simples da função concreta, para que você tenha um pequeno "howto" que pode ser realmente útil em grandes projetos nos quais os programadores não conhecem exatamente todo o código.

Quando você está desenvolvendo com TDD (desenvolvimento orientado a teste), você não tem getter / setters desnecessários etc. Você apenas cria o que precisa.


-1

Para responder à terceira pergunta:

Sendo programador e testador de software, sim, você pode ter certeza de que está cumprindo os requisitos do software durante o teste.

{colocando o controle de qualidade}

Quão? Você pode fazer isso rastreando seus testes do código de teste aos critérios de aceitação, critérios de aceitação para recursos e recursos para requisitos. Se você rastrear todos os testes da cadeia de design e eles mapearem para um ou mais requisitos, pode ter certeza de que seus testes estão sendo usados ​​para garantir que o código atenda aos requisitos (embora isso traga a noção de cobertura de teste adequada, que é uma outro assunto). Se você não pode rastrear um teste na cadeia de design, provavelmente está testando coisas que não são necessárias, e isso é uma perda de tempo. Os critérios de aceitação também podem incluir a verificação de comportamentos indesejados - você também pode testá-los, o que o aproxima um passo da liberação de qualidade.

{Controle de qualidade}

Nenhum código é livre de bugs, apenas menos dispendioso ao longo do tempo, quando mais esforço é gasto na avaliação de sua qualidade durante o desenvolvimento.


-1

Sou testador de software há 3 anos. Inicialmente, eu próprio era cético em relação à necessidade de testar, pois pensei que se o departamento de desenvolvimento e o gerenciamento de projetos fizessem seu trabalho, nenhum erro de software deveria ocorrer.

MAS este não é o caso. ++++++++

Erros acontecem frequentemente, alguns deles críticos para a operação de um projeto. Também há testes entre navegadores (que significam testes em diferentes navegadores existentes, como SAFARI, FIREFOX, CHROME e Internet Explorer) e trabalhei no projeto em que botões simples da interface, como SIM e NÃO, em uma janela de pesquisa em que não funcionam apenas em todos os navegadores alguns deles.

Eu trabalhei no teste de páginas da internet, e estava testando simples TEXT CHANGES e pensei comigo mesmo que de maneira alguma poderia haver defeitos nesse trabalho simples, mas não acontece.

Também vi quando novos desenvolvedores ingressam na equipe e recebem uma atualização de um formulário de aplicativo de Internet complexo existente com várias ligações / chamadas para páginas externas. Ocorreu um erro devido à falta de comunicação entre antigos e novos desenvolvedores, por várias razões (sem tempo para educar, sem vontade de educar e assim por diante).


-3

SIM

Imagine que seu software é apenas uma função lógica AND (b1, b2) onde b1 e b2 são apenas bits. Com isso, você precisa de 4 casos de teste para garantir que seu software esteja livre de erros, se o ambiente ao redor fornecer exatamente o que eles foram especificados.

Agora, seu sistema é composto por muitas funções cuja mais simples é muito mais complicada do que essa função lógica. Como você se certifica de que está livre de erros?

(continua)


Dependendo da implementação de AND e de outras partes da especificação, você pode precisar de mais de quatro casos de teste: testes de estresse contra o ambiente (temperatura, radiações ...), testes de desempenho (por exemplo, frequência máxima de b1 e b2) ... mesmo no domínio lógico, você pode querer provar que a função sempre dá o resultado correto quaisquer que sejam as seqüências de b1 e b2 (por exemplo, imaginar uma porta traseira, onde uma seqüência específica sobre as mudanças B1 e para XOR)
mouviciel

este não parece oferecer nada substancial sobre anteriores 21 respostas
mosquito

@moviciel: você novamente argumenta muito bem, mas se o hardware no qual o sistema do seu software executa fornece exatamente o que foi especificado, não é necessário fazer teste de estresse para esta pequena função AND (). Voltarei ao seu comentário do teste de desempenho mais tarde.
informações
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.