Qual é o equilíbrio certo entre a unidade vs. teste funcional em um aplicativo web típico?
-
10-07-2019 - |
Pergunta
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?
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".
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.