O que é o teste funcional?
Nesta seção, você se junta à equipe do Tailspin à medida que eles definem testes funcionais para seu pipeline. Os testes funcionais verificam se cada função do software faz o que deveria.
A equipe primeiro define o que um teste funcional abrange. Eles exploram alguns tipos de testes funcionais. Em seguida, eles decidem sobre o primeiro teste a ser adicionado ao seu pipeline.
Reunião semanal
A equipa está a ter a sua reunião semanal. Andy está demonstrando o pipeline de lançamento. A equipe observa uma construção bem-sucedida passar pelo pipeline, de um estágio para outro. Finalmente, o aplicativo Web é promovido para Preparo.
Amita: Estou muito feliz com o pipeline. Torna a minha vida muito mais fácil. Por um lado, recebo automaticamente uma versão implantada no ambiente de teste . Isso significa que não preciso baixar e instalar manualmente artefatos de compilação em meus servidores de teste. Isso é uma economia de tempo significativa.
Além disso, os testes de unidade que Mara e Andy escreveram eliminam todos os bugs de regressão antes de eu obter o lançamento. Isso elimina uma grande fonte de frustração. Eu não gasto tempo encontrando e documentando bugs de regressão.
Mas estou preocupado que todos os meus testes ainda sejam manuais. O processo é lento e não podemos mostrar nada à gerência até terminar. É difícil porque testar é importante. Os testes garantem que os usuários tenham a experiência certa. Mas a pressão é para entregar mais rápido.
Andy: Tenho certeza de que podemos ajudá-lo. Que tipo de testes ocupam a maior parte do seu tempo?
Amita: Eu acho que os testes de interface do usuário fazem. Eu tenho que clicar em cada passo para ter certeza de que eu tenho o resultado correto, e eu tenho que fazer isso para cada navegador que suportamos. É muito demorado. E à medida que o site cresce em complexidade, os testes de interface do usuário não serão práticos a longo prazo.
Mara: Os testes de IU são considerados testes funcionais .
Tim: Ao contrário de quê, testes não funcionais ?
Mara: Exatamente. E os testes não funcionais são algo com que você, em particular, se preocupa.
Tim: Ok, estou confuso.
O que são testes funcionais e não funcionais?
Mara: Os testes funcionais verificam se cada função do software faz o que deveria. A forma como o software implementa cada função não é importante nestes testes. O importante é que o software se comporte corretamente. Você fornece entrada e verifica se a saída é o esperado. É assim que Amita testa a interface do usuário. Por exemplo, se ela selecionar o melhor jogador na tabela de classificação, ela espera ver o perfil desse jogador.
Os testes não funcionais verificam características como desempenho e confiabilidade. Um exemplo de um teste não funcional é verificar quantas pessoas podem se inscrever simultaneamente no aplicativo. O teste de carga é outro exemplo de teste não funcional. Essas preocupações de desempenho e confiabilidade são coisas com as quais você se importa, Tim.
Tim: São, de fato. Preciso pensar um pouco sobre isso. Posso querer adicionar alguma automação ao pipeline também, mas não tenho certeza do que quero fazer. Que tipos de testes automatizados posso executar?
Mara: Por enquanto, vamos nos concentrar nos testes funcionais. É o tipo de teste que Amita faz. E parece uma área onde queremos melhorar.
Que tipos de testes funcionais posso executar?
Existem muitos tipos de testes funcionais. Eles variam de acordo com a funcionalidade que você precisa testar e o tempo ou esforço que normalmente exigem para serem executados.
As seções a seguir apresentam alguns testes funcionais comumente usados.
Teste de fumaça
O teste de fumaça verifica a funcionalidade mais básica do seu aplicativo ou serviço. Estes testes são frequentemente executados antes de testes mais completos e exaustivos. Os testes de fumaça devem ser executados rapidamente.
Por exemplo, digamos que você esteja desenvolvendo um site. Seu teste de fumaça pode ser usado curl
para verificar se o site está acessível e se buscar a página inicial produz um status HTTP 200 (OK). Se buscar a página inicial produzir outro código de status, como 404 (Não encontrado) ou 500 (Erro interno do servidor), você saberá que o site não está funcionando. Você também sabe que não há razão para executar outros testes. Em vez disso, você diagnostica o erro, corrige-o e reinicia os testes.
Teste de unidades
Você trabalhou com testes de unidade no módulo Executar testes de qualidade em seu pipeline de compilação usando o módulo Pipelines do Azure.
Em resumo, o teste de unidade verifica os componentes mais fundamentais do seu programa ou biblioteca, como uma função ou método individual. Especifique uma ou mais entradas, juntamente com os resultados esperados. O corredor de teste executa cada teste e verifica se os resultados reais correspondem aos resultados esperados.
Como exemplo, digamos que você tenha uma função que executa uma operação aritmética que inclui divisão. Você pode especificar alguns valores que espera que os usuários insiram. Você também especifica valores de caso de borda, como 0 e -1. Se você espera que uma determinada entrada produza um erro ou exceção, você pode verificar se a função produz esse erro.
Os testes de interface do usuário que você executará posteriormente neste módulo são testes de unidade.
Testes de integração
O teste de integração verifica se vários componentes de software trabalham juntos para formar um sistema completo. Por exemplo, um sistema de comércio eletrônico pode incluir um site, um banco de dados de produtos e um sistema de pagamento. Você pode escrever um teste de integração que adiciona itens ao carrinho de compras e, em seguida, compra os itens. O teste verifica se o aplicativo Web pode se conectar ao banco de dados de produtos e, em seguida, atender ao pedido.
Você pode combinar testes de unidade e testes de integração para criar uma estratégia de teste em camadas. Por exemplo, você pode executar testes de unidade em cada um dos componentes antes de executar os testes de integração. Se todos os testes de unidade forem aprovados, você poderá passar para os testes de integração com maior confiança.
Teste de regressão
Uma regressão ocorre quando o comportamento existente muda ou quebra depois de adicionar ou alterar um recurso. O teste de regressão ajuda a determinar se o código, a configuração ou outras alterações afetam o comportamento geral do software.
O teste de regressão é importante porque uma alteração em um componente pode afetar o comportamento de outro componente. Por exemplo, digamos que você otimize um banco de dados para desempenho de gravação. O desempenho de leitura desse banco de dados, que é manipulado por outro componente, pode cair inesperadamente. A queda no desempenho de leitura é uma regressão.
Você pode usar várias estratégias para testar a regressão. Essas estratégias normalmente variam de acordo com o número de testes executados para verificar se um novo recurso ou correção de bug não interrompe a funcionalidade existente. No entanto, quando você automatiza os testes, os testes de regressão podem envolver apenas a execução de todos os testes de unidade e testes de integração cada vez que o software é alterado.
Teste de sanidade
O teste de sanidade envolve testar cada componente principal de um software para verificar se o software parece estar funcionando e pode passar por testes mais completos. Você pode pensar em testes de sanidade como sendo menos completos do que testes de regressão ou testes de unidade, mas os testes de sanidade são mais amplos do que os testes de fumaça.
Embora o teste de sanidade possa ser automatizado, geralmente é feito manualmente em resposta a uma alteração de recurso ou a uma correção de bug. Por exemplo, um testador de software que está validando uma correção de bug também pode verificar se outros recursos estão funcionando inserindo alguns valores típicos. Se o software parece estar funcionando como esperado, ele pode passar por um teste mais completo.
Teste da interface de utilizador
O teste da interface do usuário (UI) verifica o comportamento da interface do usuário de um aplicativo. Os testes de interface do usuário ajudam a verificar se a sequência, ou ordem, das interações do usuário leva ao resultado esperado. Esses testes também ajudam a verificar se os dispositivos de entrada, como o teclado ou o mouse, afetam a interface do usuário corretamente. Você pode executar testes de interface do usuário para verificar o comportamento de um aplicativo nativo do Windows, macOS ou Linux. Ou você pode usar testes de interface do usuário para verificar se a interface do usuário se comporta como esperado em navegadores da Web.
Um teste de unidade ou teste de integração pode verificar se a interface do usuário recebe dados corretamente. Mas o teste da interface do usuário ajuda a verificar se a interface do usuário é exibida corretamente e se o resultado funciona como esperado para o usuário.
Por exemplo, um teste de interface do usuário pode verificar se a animação correta aparece em resposta a um clique no botão. Um segundo teste pode verificar se a mesma animação aparece corretamente quando a janela é redimensionada.
Neste módulo, você trabalha com testes de interface do usuário que são codificados manualmente. Mas você também pode usar um sistema de captura e reprodução para criar automaticamente seus testes de interface do usuário.
Testes de usabilidade
O teste de usabilidade é uma forma de teste manual que verifica o comportamento de um aplicativo da perspetiva do usuário. Os testes de usabilidade normalmente são feitos pela equipe que cria o software.
Enquanto o teste de interface do usuário se concentra em saber se um recurso se comporta conforme o esperado, o teste de usabilidade ajuda a verificar se o software é intuitivo e atende às necessidades do usuário. Em outras palavras, o teste de usabilidade ajuda a verificar se o software é "utilizável".
Por exemplo, digamos que você tenha um site que inclua um link para o perfil do usuário. Um teste de interface do usuário pode verificar se o link está presente e se ele exibe o perfil do usuário quando o link é clicado. No entanto, se os seres humanos não conseguirem localizar facilmente esse link, eles podem ficar frustrados quando tentarem acessar seu perfil.
Testes de aceitação dos utilizadores
O teste de aceitação do usuário (UAT), como o teste de usabilidade, se concentra no comportamento de um aplicativo da perspetiva do usuário. Ao contrário dos testes de usabilidade, o UAT é normalmente feito por usuários finais reais.
Dependendo do software, os usuários finais podem ser solicitados a concluir tarefas específicas. Ou eles podem ser autorizados a explorar o software sem seguir diretrizes específicas. Para software personalizado, o UAT normalmente acontece diretamente com o cliente. Para software de uso mais geral, as equipes podem executar testes beta . Em testes beta, usuários de diferentes regiões geográficas ou aqueles com interesses particulares recebem acesso antecipado ao software.
O feedback dos testadores pode ser direto ou indireto. O feedback direto pode vir na forma de comentários verbais. O feedback indireto pode vir na forma de medir a linguagem corporal dos testadores, os movimentos oculares ou o tempo que eles levam para concluir certas tarefas.
Já abordamos a importância dos testes de redação. Mas só para enfatizar, aqui está um pequeno vídeo onde Abel Wang, Cloud Advocate da Microsoft, explica como ajudar a garantir a qualidade em seu plano de DevOps.
Pergunte ao Abel
O que escolhe a equipa?
Tim: Todos esses testes parecem importantes. O que devemos abordar primeiro?
Andy: Já temos testes de unidade de trabalho. Ainda não estamos prontos para realizar testes de aceitação do usuário. Com base no que ouço, acho que devemos nos concentrar nos testes de interface do usuário. Neste momento, é a parte mais lenta do nosso processo. Amita, concorda?
Amita: Sim, concordo. Ainda nos resta algum tempo nesta reunião. Andy ou Mara, você quer me ajudar a planejar um teste automatizado de interface do usuário?
Mara: Com certeza. Mas vamos tirar algumas preliminares do caminho. Gostaria de discutir qual ferramenta devemos usar e como executaremos os testes.
Que ferramentas posso usar para escrever testes de interface do usuário?
Mara: Quando se trata de escrever testes de interface do usuário, quais são nossas opções? Sei que são muitas. Algumas ferramentas são de código aberto. Outros oferecem apoio comercial pago. Aqui estão algumas opções que vêm à mente:
- Driver de aplicativo do Windows (WinAppDriver): WinAppDriver ajuda você a automatizar testes de interface do usuário em aplicativos do Windows. Esses aplicativos podem ser escritos em Plataforma Universal do Windows (UWP) ou Windows Forms (WinForms). Precisamos de uma solução que funcione em um navegador.
- Selenium: Selenium é uma estrutura portátil de teste de software de código aberto para aplicações web. Ele é executado na maioria dos sistemas operacionais, e suporta todos os navegadores modernos. Você pode escrever testes Selenium em várias linguagens de programação, incluindo C#. Na verdade, você pode usar pacotes NuGet que facilitam a execução do Selenium como testes NUnit. Já utilizamos o NUnit para os nossos testes unitários.
- SpecFlow: SpecFlow é para projetos .NET. É inspirado numa ferramenta chamada Pepino. Tanto o SpecFlow quanto o Cucumber suportam o desenvolvimento orientado a comportamento (BDD). O BDD usa um analisador de linguagem natural chamado Gherkin para ajudar as equipes técnicas e não técnicas a definir regras e requisitos de negócios. Você pode combinar SpecFlow ou Cucumber com Selenium para criar testes de interface do usuário.
Andy olha para Amita.
Andy: Eu sei que essas opções são novas para você, então você se importa se escolhermos Selenium? Tenho alguma experiência com ele e suporta línguas que já conheço. Selenium também nos dará suporte automático para vários navegadores.
Amita: Claro. É melhor se um de nós tiver alguma experiência.
Como executar testes funcionais no pipeline?
No Azure Pipelines, você executa testes funcionais da mesma forma que executa qualquer outro processo ou teste. Pergunte a si mesmo:
- Em que fase decorrerão os testes?
- Em que sistema serão executados os testes? Eles serão executados no agente ou na infraestrutura que hospeda o aplicativo?
Vamos juntar-nos à equipa enquanto respondem a estas perguntas.
Mara: Uma coisa que me entusiasma é que agora podemos testar em um ambiente que é como a produção, onde o aplicativo está realmente sendo executado. Testes funcionais, como testes de interface do usuário, fazem sentido nesse contexto. Podemos executá-los na fase de teste do nosso pipeline.
Amita: Concordo. Podemos manter o mesmo fluxo de trabalho se executarmos testes automatizados de interface do usuário no mesmo estágio em que executo testes manuais. Os testes automatizados poupar-nos-ão tempo e permitir-me-ão concentrar-me na usabilidade.
Tim: Amita testa o site a partir de seu laptop Windows porque é assim que a maioria dos nossos usuários visita o site. Mas nós criamos no Linux e, em seguida, implantamos o Serviço de Aplicativo do Azure no Linux. Como lidamos com isso?
Mara: Ótima pergunta. Também podemos escolher onde executar os testes. Podemos executá-los:
- No agente: um agente da Microsoft ou um agente que hospedamos
- Infraestrutura de teste: no local ou na nuvem
Nossa etapa de teste existente inclui um trabalho. Esse trabalho implanta o site no Serviço de Aplicativo a partir de um agente Linux. Podemos adicionar um segundo trabalho que executa os testes da interface do usuário de um agente do Windows. O agente do Windows hospedado pela Microsoft já está configurado para executar testes Selenium.
Andy: Mais uma vez, vamos ficar com o que sabemos. Vamos usar um agente do Windows hospedado pela Microsoft. Mais tarde, podemos executar os mesmos testes de agentes que executam macOS e Linux se precisarmos de cobertura de teste adicional.
O plano
Mara: OK. Eis o que vamos fazer:
- Executar testes da interface do usuário do Selenium a partir de um agente do Windows hospedado pela Microsoft
- Fazer com que os testes busquem o conteúdo da Web do aplicativo que está sendo executado no Serviço de Aplicativo, no estágio Teste
- Execute os testes em todos os navegadores que suportamos
Andy: Vou trabalhar com Amita neste. Amita, vamos nos encontrar amanhã de manhã. Eu gostaria de fazer um pouco de pesquisa antes de nos encontrarmos.
Amita: Ótimo! Até lá.
Criar um plano de teste funcional
Vimos a equipe decidir como implementará seus primeiros testes funcionais. Se sua equipe está apenas começando a incorporar testes funcionais em seu pipeline (ou mesmo se você já está fazendo isso), lembre-se de que você sempre precisa de um plano.
Muitas vezes, quando alguém pergunta aos membros da equipe sobre seu plano de teste de desempenho, é comum que eles respondam com uma lista de ferramentas que vão usar. No entanto, uma lista de ferramentas não é um plano. Você também deve descobrir como os ambientes de teste serão configurados. Você precisa determinar os processos a serem usados e determinar como é o sucesso ou o fracasso.
Certifique-se de que o seu plano:
- Leva em conta as expectativas do negócio.
- Tem em conta as expectativas dos utilizadores-alvo.
- Define as métricas que você usará.
- Define os KPIs que você usará.
Os testes de desempenho precisam fazer parte do seu planejamento, desde o início. Se você usa uma história ou um quadro Kanban, você pode considerar ter uma área perto dele onde você pode planejar sua estratégia de teste. Como parte do planejamento de iteração, as lacunas na estratégia de teste devem ser destacadas. Também é importante descobrir como você monitorará o desempenho depois que o aplicativo for implantado, e não apenas medir o desempenho antes de ser lançado.