Qual é o equilíbrio certo entre a unidade vs. teste funcional em um aplicativo web típico?

StackOverflow https://stackoverflow.com/questions/312904

  •  10-07-2019
  •  | 
  •  

Pergunta

testes

Unidade são mais baratos para escrever e manter, mas eles não cobrem todos os cenários. Qual é o equilíbrio certo entre eles?

Foi útil?

Solução

Eu gosto de quadrante do Brian Marick em testes automatizados, onde as distinções são tecnologia vs. negócio enfrentando e suporte de programação do produto vs. crítica.

Com esse quadro, a questão do equilíbrio torna-se, o que eu preciso agora?

Outras dicas

É importante distinguir entre a intenção eo alcance desses dois tipos de testes:

  • teste de unidade normalmente testar uma característica específica no nível de módulo / classe , por exemplo criar-X, actualizar-Y, foo-a-BAR, compacta-a-whizbang, etc. Uma classe podem ter vários testes unitários

  • funcional teste , também chamado de 'teste de aceitação' normalmente testa uma cenário de caso de uso da interface mais exterior até ao fim do processamento, por exemplo, a partir da interface de utilizador para o banco de dados e de volta novamente, a partir do processo de entrada para o utilitário de notificação, etc.

estes dois tipos de testes são não interchangable , e são, em geral, disjuntos . Assim, a noção de encontrar um 'equilíbrio' entre eles não faz sentido. Você nem precisa deles ou não.

Se você está se referindo a facilidade de codificação de cada tipo de ensaio em sua estrutura de teste, que é uma questão diferente - mas o uso do quadro (digamos, NUnit vs. um usuário-bot) não alterar o tipo / natureza do teste.

o melhor "equilíbrio", em geral, seria a unidade-teste para a confiança e integridade, e funcional-teste para a aceitação do cliente

Eu concordo com Steven Lowe que não há trade-off entre testes unitários e testes funcionais, como eles são usados ??para fins muito diferentes.

Os testes unitários são sobre o método eo tipo de verificação, e também testes de regressão. Testes funcionais são cerca funcional, cenário, e teste de viabilidade. Na minha opinião, não há quase nenhuma sobreposição,

Se ajudar, aqui estão as minhas categorias de teste.

Os desenvolvedores começar de dentro e de trabalho para o exterior, com foco em código:

  • As afirmações - verificar o fluxo de dados e as estruturas
  • Debugger - verificar o fluxo de código e dados
  • Teste Unitário - verificar cada função
  • Integração testando - verificar sub-sistemas
  • Testing System - verificar a funcionalidade
  • testes de regressão - verificar defeitos ficar fixo
  • testes
  • Segurança - verificar o sistema não pode ser penetrado facilmente.

Testers começar do lado de fora e trabalhar para dentro, enfocando aspectos:

  • Testes de Aceitação - verificar os requisitos do usuário final
  • testes de cenários - verificar situações do mundo real
  • testes globais - verificar entradas viáveis ??
  • testes de regressão - verificar defeitos ficar fixo
  • testes de usabilidade - verificar se o sistema é fácil de usar
  • testes de segurança - verificar o sistema não pode ser penetrado facilmente
  • A cobertura de código - testar código intocado
  • Compatibilidade - com versões anteriores
  • Procurando por peculiaridades e arestas.

utilizadores finais trabalhar do lado de fora, e geralmente têm pouca atenção:

  • Testes de Aceitação - verificar os requisitos do usuário final
  • testes de cenários - verificar situações do mundo real
  • testes de usabilidade - verificar se o sistema é fácil de usar
  • Procurando por peculiaridades e arestas.

Na aplicação que estou trabalhando no momento, há provavelmente 10: 1 unidade para testes funcionais. O trabalho de teste de unidade simplesmente coisas como recuperar entidades de DB, os testes de tratamento de erros para conectividade db / rede etc. Essas coisas correm rápida -. Minutos ou menos e são geridos pelos devs diária

testes funcionais enquanto menos tendem a ser cozinha abordagem pia - lata usuário ordem completa etc. tendem a cobrir o fim do domínio do negócio das coisas são geridos pelos analsyts de negócios e operações - infelizmente para nós, muitas vezes com a mão. Essas coisas levam semanas para ser executado e, geralmente, para finalizar um ciclo de lançamento.

Meu projeto atual é a cobertura de teste de unidade cerca de 60% e todas as histórias de usuários têm happy-dia de cobertura de histórias de usuários em testes de selênio, alguns têm cobertura adicional.

Estamos discutindo continuamente esta: Existe realmente qualquer ponto de empurrar a cobertura-teste de unidade de cenários cada vez mais absurdas para a cobertura muito maior?

O argumento é que a expansão testes de selênio aumenta a cobertura de teste em coisas que não têm valor comercial. Será que o cliente realmente se preocupam com casos de canto de teste de unidade que podem falhar?

Quando você ficar bom em testes de selênio, o custo de escrever novos testes com valor de negócios diminui. Para nós, eles são tão simples como testes de unidade.

O custo de tempo de execução é outra questão. Temos um pequeno conjunto de caixas que executam estes testes o tempo todo.

Por isso, tende a favorecer web-testes mais, provavelmente porque temos obtido bom em escrever-los e eles fornecem valor de negócio inegável.

Inicialmente eu inclinou-se fortemente para preferindo testes unitários mais testes funcionais / aceitação devido ao fator custo inicial de testes de aceitação. No entanto, ao longo do tempo eu mudei a minha filosofia e sou agora um forte defensor de escolher os testes de aceitação, sempre que possível e só usando testes de unidade quando os testes de aceitação não pode atender minhas necessidades.

O racional básica por trás escolhendo aceitação sobre testes de unidade é o mesmo que o racional básica para código SOLID. Sua implementação deve ser capaz de mudar drasticamente com refatoração etc, mas todos os casos de negócios - aceitação tests- deve ser capaz de permanecer mudou-un e provar o comportamento do sistema aceitável (testes passam). Com testes de unidade muitas vezes há uma forte acoplamento natural de teste para código de implementação. Mesmo que seja o código de teste, ainda é código e acoplamento forte como o conhecemos deve ser evitado. Por testes de aceitação que escolhem muitas vezes você é levado para baixo a espiral de sucesso para criar bem planejada, deixando mudança a implementação de api consumível de-acoplada nos bastidores, sem forçar seus testes para a mudança. Além disso, seus pensamentos implementação desenvolvedor estão em linha com o negócio pensamentos sistema de comportamento. No final, eu acho que tudo isso é melhor para o negócio e para a satisfação do codificador.

Do ponto de vista teoria muitas vezes eu perguntar ao meu eu-se um pedaço de código não pode ser testado através de um teste de aceitação por esse pedaço de código deve existir? IE? - se não é parte de um cenário de negócios válido, então faz esse valor de código add ou está actualmente e vai permanecer unicamente custo

Além disso, se você comentar / documentar seus testes de aceitação bem, esses comentários / documentos geralmente são a linguagem mais atual e precisa do sistema - que geralmente lhe permitirá evitar outra documentação menos valioso se aproxima. Os testes de unidade não se prestam a essa forma de "business-termo" comunicação.

Por fim, eu não formou este ponto vista apenas o meu desenvolvimento pessoal, está provado bem sucedido com um par de diferentes equipes de projeto em meu ambiente de trabalho "muito corporativa".

JB http://jb-brown.blogspot.com

Os testes devem executar rapidamente e problemas ajudar a localizar. Os testes de unidade permitirá que você faça isso em apenas testar o módulo em questão. No entanto testes funcionais / integração / aceitação pode ser feito para funcionar de forma suficientemente rápida na maioria dos cenários web.

Uma vez eu li que um teste de unidade é uma "exigência executável", que faz todo o sentido para mim. Se o teste não é focado em provar um requisito de negócio então é realmente de nenhum uso. Se você tiver requisitos detalhados (e que é o teste ácido), então você vai escrever uma série de testes de unidade para exercer cada cenário possível, que por sua vez irá garantir a integridade de seus algoritmos de estrutura de dados e lógica. Se você estiver testando algo que não é um requisito, mas você sabe que deve ser verdadeira para o teste passar, então é mais do que provável que você está requisitos ausentes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top