Testes, TDD, Unit Test, QA e assemelhados. Qual a diferença dos conceitos sobre testes?

Pergunta :


Na pergunta do meta 5 tags diferentes para “testes” eu notei que tenho alguma dificuldade para entender todos estes termos sobre testes.

Certamente testes passaram ser muito importantes ao longo da trajetória do desenvolvimento de software. Com isto proliferam conceitos e a sopa de letrinhas está cada vez maior.

O que diferencia os conceitos envolvidos em testes? As siglas e as definições formais são fácil de descobrir.

Teste de software, testes unitários ou unidade de testes (há diferença?), testes funcionais, TDD, quality assurance, acceptance testing. Existe algum outro termo relacionado que seja muito importante para ser destacado?

Autor da pergunta: Maniero

Resposta Comunidade:

Teste de Software

Usando os termos da Wikipédia:

É a investigação do software a fim de fornecer informações sobre sua qualidade em relação ao contexto em que ele deve operar. Isso inclui o processo de utilizar o produto para encontrar seus defeitos.

Teste é o termo mais geral para ver se um determinado software funciona. Pode ser um produto inteiro, parte dele, um método, etc.

O teste pode ser realizado pelo próprio desenvolvedor, por um testador especializado ou por um usuário do sistema. Isso pode ocorrer em qualquer fase do projeto, dependendo do modelo adotado (cascata, iterativo, evolutivo).

Na maioria dos projetos existe uma fase de testes, quando geralmente as funcionalidades da versão estão fechadas o foco maior da equipe é descobrir e corrigir defeitos ainda ocultos.

Os testes podem se dividir em diversos tipos e classificações.

Quanto ao conhecimento sobre o software

  • Teste de caixa branca: quando se avalia o funcionamento interno do software. Por exemplo, se determinados métodos executam corretamente.
  • Teste de caixa preta: quando se avalia o comportamento do software, através de suas interfaces. Por exemplo, quando o usuário usa o sistema para ver se ele retorna valores esperados após um cálculo.

Quanto à natureza do teste

Testes podem ser realizados em vários níveis e para diversos fins:

  • Teste Unitário: testa partes específicas do sistema, como classes e métodos.
  • Teste de Integração: testa vários componentes de um sistema funcionando de uma só vez.
  • Teste de Sistema ou Homologação ou SIT (System Integration Testing): execução do sistema do ponto de vista do usuário, embora não realizado pelo usuário final.
  • Teste de Aceitação ou UAT (User Acceptance Testing): teste realizado pelo usuário para verificar se o software está de acordo com o que foi contratado.
  • Teste de Regressão: testes já realizados são executados novamente após modificações no software para garantir que não houve um efeito colateral inesperado.

Testes não-funcionais

Além de verificar se as implementações de sistema estão corretas, determinados tipos de teste verificam aspectos não-funcionais do mesmo. Por exemplo:

  • Teste de Desempenho (Performance): verifica o desempenho do sistema com uma carga normal de usuários. Por exemplo, o tempo de resposta médio é de 2 segundos com até mil usuários.
  • Testes de Carga (Volume): verifica a capacidade máxima do sistema, ou seja, o ponto onde ele trava ou deixa de responder em tempo adequado.
  • Teste de Resiliência (Stress): verifica o comportamento do sistema e sua capacidade de se recuperar de falhas inesperadas, como queda de energia, falha em banco de dados, picos de acesso.

Automação de testes

É possível realizar todos os tipos de teste sem automação. Por outro lado, há grande vantagem em automatizar alguns deles para a repetição sem esforço do mesmo.

Um Teste Unitário pode ser executado criando-se uma classe ou script independente para testar métodos e classes. Em Java, seria um método main.

Mas se usado num framework de automação, o mesmo Teste Unitário pode ser executado quantas vezes necessário. Seria um Teste de Regressão sem custo adicional. Em Java isso pode ser feito com JUnit.

Test Driven Development (TDD)

O TDD é uma metodologia de desenvolvimento baseada em testes. A ideia principal é inverter a sequência “tradicional” de desenvolvimento colocando o teste em primeiro lugar, antes da implementação.

Você escreve cada teste conforme o respectivo requisito. Então dá para acompanhar o progresso na medida em que cada teste deixa de falhar e obtém sucesso.

Muitas pessoas escrevem Testes Unitários e acham que estão fazendo TDD. Não é a mesma coisa. Ocorre que as equipes que adotam TDD geralmente se utilizam de Testes Unitários automatizados para agilizar o processo.

Tem um pouquinho mais de informações sobre testes e TDD nesta minha outra resposta.

Garantia de Qualidade ou Quality Assurance (QA)

QA não é diretamente relacionada a software. É uma área que tenta garantir a qualidade em todos os aspectos de um projeto ou serviço através de processos de auditorias.

Ela possui suas próprias técnicas, certificações e processos. Tudo isso é independente do ciclo de desenvolvimento de software.

Eu tenho que discordar em partes do colega acima.

Sobre a metodologia SQA – Software Quality Assurance, que consiste em monitorar os processos de engenharia de software e desenvolvimento. Este princípio se baseia buscar uma forte definição de requerimentos, codificação, refatoração de código, testes, gerenciamento de versões, dentre outros.

Está clara a ideia de que SQA está diretamente ligada com as ideias de comprometimento de Desempenho e Qualidade. Sendo estes mesmo ideais que o TDD busca atingir, estando diretamente ligados segundo minha opinião.

O processo de realizar desenvolvimento de sistemas a partir a testes apareceu inicialmente em meados dos anos 2000 junto a pratica do extreme programming, com a ideia de começar o desenvolvimento pela rotina de testes.

Com manifesto ágil, que trouxe a cultura LEAN para desenvolvimento de software e pratica do extreme programming, vínhamos a tomar uma nova mentalidade para realização do nosso trabalho como desenvolvedores. Viemos a absorver os 5 princípios da mentalidade LEAN:

  1. VALOR;
  2. FLUXO DE VALOR;
  3. FLUXO CONTÍNUO;
  4. PRODUÇÃO PUXADA;
  5. PERFEIÇÃO.

Mary Poppendieck, que aperfeiçoou a metodologia LEAN para o desenvolvimento de software nos trouxe 8 princípios:

  1. Eliminar desperdício;
  2. Amplificar conhecimento;
  3. Desenvolver com qualidade;
  4. Postergar decisões;
  5. Entregas rápidas
  6. Respeitar as pessoas
  7. Melhoria continua;
  8. Otimizar como um todo.

Se formos analisar, tanto o pensamento LEAN, quando as praticas do XP, veremos que eles buscam a perfeição do software e entregar um produto de qualidade para o cliente.Sempre se focando na prevenção de falhas, por isso a utilização do TDD.

A utilização do TDD visa justamente desenvolver um software com uma codificação limpa, se baseando na pratica do YAGNI (você não vai precisar disto) e um sistema sem erros, baseado na metodologia LEAN, para entregar um produto de qualidade para o cliente.

Uma boa maneira de se preparar para realizar o TDD, através do assert, é adicionar um critério de aceite nas User Story que dará origem ao código. Ex.

COMO UM … EU QUERO … PARA QUE SEJA POSSIVEL …

Os … finais irão te ajudar a entender o que deve ser escrito no assert do teu teste, para que a partir dele tu comece a codificar e por fim chegar no resultado esperado.

ps. Escrevi sobre o assunto em meu blogue.

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *