Blog > Teste de software nas nuvens

11/jan

Este artigo descreve como a evolução da computação em nuvem está mudando radicalmente a área de teste e qualidade de software. Ao longo do artigo, discutimos como a nuvem tem sido usada como uma extensão do laboratório de testes pelos desenvolvedores e profissionais de qualidade de software, permitindo dessa forma, uma redução drástica de gastos com infra-estrutura ociosa. Além disso, são apresentados os desafios enfrentados pelas organizações para garantir a qualidade das aplicações hospedadas na nuvem.

Introdução

O termo computação em nuvem (Cloud Computing) surgiu em 2006 em uma palestra de Eric Schmidt, da Google, sobre como sua empresa gerenciava seus data centers (local onde são concentrados os computadores e sistemas responsáveis pelo processamento de dados de uma empresa ou organização).

Fundamentada em conceitos já estabelecidos, como a virtualização e o modelo pay-per-use (modelo de pagamento baseado no uso, semelhante aos serviços de telefonia e energia elétrica), a computação em nuvem está se tornando um paradigma chave da indústria de Tecnologia da Informação. Na computação em nuvem, a localização de toda a infra-estrutura computacional é deslocada para a Internet. Dessa forma, os dados, o hardware e as aplicações são fornecidos na forma de serviços baseados na Internet, reduzindo drasticamente os custos para o usuário final que faz uso só do que precisa e quando precisa.

Um recente relatório da consultoria Gartner elenca os cinco atributos que definem o modelo de computação em nuvem. Os cinco atributos definidos para a computação em nuvem são:

  • Baseado em serviço: Na computação em nuvem os serviços podem ser considerados sob medida, uma vez que são designados para atender a necessidades específicas de um grupo de clientes. As tecnologias, por sua vez, são escolhidas para suprir a solução ou o serviço em vez do contrário – o serviço ser desenvolvido de acordo com a infra-estrutura tecnológica disponível.
  • Escalável e elástico: O serviço deve ter a capacidade de aumentar ou reduzir os recursos de acordo com a demanda do cliente.
  • Compartilhado: A criação de grupos que compartilham serviços facilita a economia de escala. E os recursos de TI são usados com o máximo de eficiência. A infra-estrutura, software ou plataformas passam a ser divididos entre vários usuários dos serviços. Isso permite fornecer um número infinito de recursos para atender as necessidades de múltiplos clientes, ao mesmo tempo.
  • Medido por uso: Esse modelo de serviços possibilita criar métricas que permitam diferentes modelos de pagamento. O provedor pode cobrar pelo uso, por número de usuários, criar planos limitados, entre outros. Mas, em todos os casos, o pagamento vai ser feito pelo uso do serviço e não de acordo com o custo do equipamento.
  • Baseado no uso da internet: Os serviços são oferecidos por meio de protocolos e formatos web (como URLs, http e IP).
  • A computação em nuvem distribui os recursos na forma de serviços. Com isso, podemos dividir a computação em nuvens em três modelos fundamentais:
  • Software como Serviço (SaaS): Podemos dizer que o SaaS representa os serviços de mais alto nível disponibilizados em uma nuvem. Esses serviços representam as aplicações completas que são oferecidas aos usuários. Os prestadores de serviços disponibilizam o SaaS na camada de aplicação, o que leva a rodar inteiramente na nuvem e pode ser considerado uma alternativa a rodar um programa em uma máquina local. Assim o SaaS traz a redução de custos, dispensando a aquisição de licença de softwares. Colocamos como exemplo de SaaS, sistemas de banco de dados e processadores de textos.
  • Plataforma como Serviço (PaaS): O PaaS tem por objetivo facilitar o desenvolvimento de aplicações destinadas aos usuários de uma nuvem, criando uma plataforma que agiliza esse processo. O PaaS oferece uma infra-estrutura de alto nível de integração para implementar e testar aplicações na nuvem. Também fornece um sistema operacional, linguagens de programação e ambientes de desenvolvimento para as aplicações, auxiliando a implementação de softwares, já que contém ferramentas de desenvolvimento e colaboração entre desenvolvedores.
  • Infra-estrutura como Serviço (IaaS): O IaaS traz os serviços oferecidos na camada de infra-estrutura. Nestes serviços podemos incluir servidores, roteadores, sistemas de armazenamento e outros recursos de computação. Também é responsável por prover toda a infra-estrutura necessária para a SaaS e o PaaS. O IaaS traz algumas características, como uma interface única para administração da infra-estrutura, a aplicação API (Application Programming Interface) para interação com hosts, switches, roteadores e o suporte para adicionar novos equipamentos de forma simples e transparente.

Apesar de não existir um consenso com relação aos tipos dos serviços que podem ser oferecidos com base na computação em nuvem, na prática existem 11 categorias mais comuns no mercado:

  • Armazenamento como serviço: Como o nome indica, é a capacidade de utilizar o storage que existe fisicamente em um site remoto, mas é, logicamente, um recurso de local para qualquer aplicativo que requer armazenamento. É o componente mais primitivo da computação em nuvem, explorado pela maioria dos outros.
  • Banco de dados como serviço: Capacidade de utilizar os serviços de um banco de dados hospedado remotamente, compartilhando-o com outros usuários. Funcionaria logicamente como se o banco de dados fosse local. Diversos fornecedores oferecem diferentes modelos, mas sua força está em explorar a tecnologia de banco de dados que normalmente custaria milhares de dólares em hardware e licenças de software.
  • Informação como serviço: Capacidade de consumir qualquer tipo de informação, hospedada remotamente, por meio de uma interface bem definida, como uma API.
  • Aplicativo como serviço (ou software como serviço): Qualquer aplicativo oferecido sobre a plataforma web para um usuário final, geralmente explorando o aplicativo pelo browser. Embora muita gente associe aplicativo como serviço a aplicativos corporativos, tais como o Salesforce SFA, os aplicativos de automação de escritório, na realidade, também são aplicativos como serviço, entre eles o Google Docs, Gmail e Google Calendar.
  • Processo como serviço: Recurso remoto que pode reunir muitos outros, tais como serviços e dados, sejam eles hospedados no mesmo recurso de cloud computing ou remotamente, para criar processos de negócio. É possível pensar em um processo de negócio como um meta-aplicativo que abrange sistemas, explorando serviços e informações essenciais que são combinados em sequência para formar processos. Em geral, eles são mais fáceis de mudar do que os aplicativos, proporcionando agilidade a quem utiliza estes mecanismos de processos fornecidos sob demanda.
  • Integração como serviço: Capacidade de fornecer uma pilha de integração completa a partir da cloud, incluindo interfaceamento com aplicativos, mediação semântica, controle de fluxos, design de integração e assim por diante. Em essência, a integração como serviço abrange a maioria dos recursos e das funções encontradas na tecnologia convencional de enterprise application integration (EAI), mas fornecidos como um serviço.
  • Plataforma como serviço: Plataforma completa, incluindo desenvolvimento de aplicativos, de interfaces e de banco de dados, armazenamento, teste e assim por diante, disponíveis para assinantes em uma plataforma hospedada remotamente. Com base no tradicional modelo de tempo compartilhado, os modernos fornecedores de plataforma como serviço oferecem a capacidade de criar aplicativos corporativos para uso local ou sob demanda, de graça ou por um pequeno custo de assinatura.
  • Segurança como serviço: Capacidade de fornecer serviços de segurança essenciais remotamente via internet. A maior parte dos serviços de segurança disponíveis é rudimentar, porém alguns mais sofisticados, tais como gerenciamento de identidade, começam a ser oferecidos atualmente.
  • Gestão/governança como serviço: Qualquer serviço sob demanda que permita gerenciar um ou mais serviços de computação em nuvem, como gerenciamento de tempo de atividade, topologia, utilização de recursos e virtualização. Também começam a surgir sistemas de governança, como capacidade de aplicar políticas definidas para dados e serviços.
  • Infra-estrutura como serviço: Trata-se de data center como serviço ou a capacidade de acessar recursos de computação remotamente. Em essência, você aluga um servidor físico, que pode usar como lhe convier. Para fins práticos, ele é o seu data center ou, pelo menos, parte de um data center. A diferença desta abordagem em relação à computação em nuvem principal é que, em vez de usar uma interface e um serviço mensurado, você tem acesso à máquina inteira e ao software que está nesta máquina. É menos "empacotada" e mais do tipo hospedagem.
  • Teste como serviço: Capacidade de testar sistemas locais ou fornecidos em nuvem empregando software e serviços de teste hospedados remotamente. É importante observar que, embora um serviço de cloud exija teste em si mesmo, os sistemas de teste como serviço podem verificar outros aplicativos em nuvem, websites e sistemas empresariais internos, e não requerem espaço para hardware ou software na corporação.
  • A restrição ou abertura de acesso aos recursos da nuvem depende do processo de negócios, do tipo de informação e assim por diante. Percebemos que certas organizações não desejam que todos os usuários possam acessar e utilizar determinados recursos no seu ambiente de computação em nuvem. Segue abaixo a divisão dos diferentes tipos de implantação:
  • Privado: As nuvens privadas são aquelas construídas exclusivamente para um único usuário (uma empresa, por exemplo). Diferentemente de um data center privado virtual, a infra-estrutura utilizada pertence ao usuário, e, portanto, ele possui total controle sobre como as aplicações são implementadas na nuvem. Uma nuvem privada é, em geral, construída sobre um data center privado.
  • Público: As nuvens públicas são aquelas que são executadas por terceiros. As aplicações de diversos usuários ficam misturadas nos sistemas de armazenamento, o que pode parecer ineficiente a princípio. Porém, se a implementação de uma nuvem pública considera questões fundamentais, como desempenho e segurança, a existência de outras aplicações sendo executadas na mesma nuvem permanece transparente tanto para os prestadores de serviços como para os usuários.
  • Comunidade: A infra-estrutura de nuvem é compartilhada por diversas organizações e suporta uma comunidade específica que partilha as preocupações (por exemplo, a missão, os requisitos de segurança, política e considerações sobre o cumprimento). Pode ser administrado por organizações ou por um terceiro e pode existir localmente ou remotamente.
  • Híbrido: Nas nuvens híbridas temos uma composição dos modelos de nuvens públicas e privadas. Elas permitem que uma nuvem privada possa ter seus recursos ampliados a partir de uma reserva de recursos em uma nuvem pública. Essa característica possui a vantagem de manter os níveis de serviço mesmo que haja flutuações rápidas na necessidade dos recursos. A conexão entre as nuvens pública e privada pode ser usada até mesmo em tarefas periódicas que são mais facilmente implementadas nas nuvens públicas, por exemplo.

Testando nas nuvens

Quando um aplicativo é migrado para a nuvem, novos tipos de testes tornam-se obrigatórios na estratégia de testes de uma organização. Compatibilidade, escalabilidade, disponibilidade, desempenho, entre outras características da qualidade, sequer faziam parte da estratégia de testes de aplicativos tradicionais (cliente-servidor rodando no desktop do usuário final), agora tornaram-se temas prioritários na agenda de reuniões gerenciais.

Embora os termos "testes" e "qualidade" podem ser aplicáveis para qualquer categoria de computação em nuvem existente, vamos nos concentrar nos testes e aferição da qualidade na perspectiva das categorias de computação em nuvem chamadas: Aplicativo como serviço (ou software como serviço) e Teste como serviço.

O poder computacional e de disponibilidade de infra-estrutura fornecido pela nuvem eleva o teste de software a novos patamares. Uma equipe de testes pode criar um laboratório de testes virtualizado com centenas de computadores usando sistemas operacionais diferentes em questões de minutos. Outra equipe de testes pode realizar um teste de desempenho usando uma carga de milhões de usuários virtuais distribuídos geograficamente em data-centers ao redor do mundo e pagar apenas o tempo em que o teste foi realizado. Estes cenários, sem o uso da computação em nuvem são inconcebíveis ou exigem investimentos astronômicos e proibitivos para qualquer organização.

Em função disso, tem crescido o interesse de empresas e profissionais em usar os recursos da computação em nuvem para potencializar o teste de software. Esse novo conceito, ou paradigma de testes, é chamado de teste nas nuvens (Cloud Testing) e tem por objetivo testar aplicações que residem na nuvem ou usar a nuvem para amplificar a cobertura dos testes. Dessa forma, a nuvem pode ser usada como uma extensão do laboratório de testes, como um meio para a realização de teste em combinações quase infinitas ou em escalas globais, para ampliar a cobertura de testes manuais e automatizados, para testar combinações diferentes de hardware, software e dispositivos, fornecer um ambiente acessível para a execução de crowd-testing e assim por diante.

O teste de software nas nuvens pode ser classificado em duas categorias:

  • Teste usando a nuvem: Nesta categoria, o teste de software migra para a nuvem e os recursos computacionais da nuvem são utilizados para potencializar a profundidade, amplitude e a escala do teste de software.
  • Teste da nuvem: Nesta categoria são tratados os desafios da implementação de uma estratégia para a realização de testes em aplicações residentes nas nuvens.

Testando usando a nuvem

Um dos fatores críticos para o sucesso da execução de testes é o uso de um ambiente de testes adequado e similar ao ambiente de produção tanto do ponto de vista da infra-estrutura quanto do ponto de vista dos dados. Além disso, laboratórios de testes exigem o envolvimento de um ou mais profissionais em tempo integral para preparar e manter a integridade do ambiente para a condução dos testes. Dessa forma, criar e manter um laboratório de testes que atenda esses requisitos requer investimentos que muitas organizações não estão dispostas a pagar em função de que o uso do laboratório de testes é geralmente sazonal ao longo de um projeto e o laboratório fica grande parte do tempo em ociosidade.

Na prática, muitas equipes de testes realizam o seu trabalho em laboratórios inadequados e compartilham os recursos escassos com outras equipes. Como consequência, isso retarda a execução dos testes, gera dificuldade na reprodução de defeitos, aumenta o tempo de preparação e restauração do ambiente, e assim por diante.

Com o advento da computação em nuvem, este cenário mudou completamente: a equipe de testes pode usar os recursos computacionais da nuvem como uma extensão do laboratório de testes ou como um laboratório virtual de testes hospedado completamente na nuvem. Muitas empresas oferecem serviços de virtualização de infra-estrutura, tais como: computadores, servidores, dispositivos móveis e assim por diante. Dessa forma, uma equipe de testes pode ter recursos ilimitados a sua disposição, pagando apenas pelo que usar e somente quando usar.

O uso da nuvem como laboratório virtual de testes potencializa a profundidade, amplitude e a escala do teste de software. Dentre as principais vantagens, podemos destacar:

  • Fidelidade dos testes em função do uso de uma infra-estrutura realística e similar a produção;
  • Economia no tempo da preparação e restauração do ambiente de testes;
  • Aumento da infra-estrutura somente quando é necessário;
  • Pagamento apenas do que é usado e somente quando for usado;
  • Redução dos custos de licenciamento (ferramentas de testes, sistemas operacionais, etc);
  • Redução de gastos com recursos ociosos;
  • Diversidade de combinações de infra-estrutura e dispositivos;
  • Escala geográfica para a realização de testes de desempenho.

Atualmente, muitas organizações estão adotando soluções para gestão unificada do ciclo de vida de desenvolvimento de software, também conhecidas como soluções ALM (do inglês: Application Lifecycle Management). Estas soluções normalmente residem na nuvem e tem o objetivo de gerir o ciclo de vida de desenvolvimento de software do começo ao fim, contemplando: gestão de tarefas e recursos, requisitos, arquitetura, código, defeitos, entregas, suporte, entre outras áreas.

Em função disso, muitas organizações estão migrando todos os "Assets" de testes para as nuvens. Assets, no contexto da área de teste de software, são todos os artefatos produzidos durante o processo de teste e requeridos para planejar, projetar e executar testes, dentre eles: documentação, roteiros, entradas, resultados esperados, procedimentos de preparação e de limpeza, arquivos, dados, ambiente e qualquer software adicional ou utilitários utilizados para apoiar atividades de testes.

Teste da nuvem

Uma estratégia de testes para aplicações desenvolvidas ou migradas para a nuvem deve considerar as características deste novo ambiente, tais como: ambiente distribuído, multi-usuário, escalabilidade elástica, alta disponibilidade, infra-estrutura compartilhada, entre outros. Além disso, uma aplicação ou serviço baseado na Internet e residente na nuvem normalmente está disponível a um volume muito maior de usuários simultâneos em comparação com aplicações similares residentes em Intranets. Estes usuários normalmente não tiveram treinamento formal para usar a aplicação e esperam que o uso seja fácil, o tempo de resposta seja imediato, assim como, a aplicação esteja disponível sempre que eles precisarem. Dessa forma, é obrigatória a realização de testes de desempenho, compatibilidade, usabilidade, entre outros.

Neste contexto, diversos tipos de testes devem ser planejados e executados para assegurar que as aplicações residentes na nuvem atendam aos seus requisitos explícitos e implícitos. Dentre os tipos de testes mais comuns, podemos destacar os seguintes:

  • Funcionalidade: É avaliada a capacidade de um software prover as funcionalidades que satisfaçam o usuário em suas necessidades declaradas e implícitas, fornecer resultados precisos ou com a precisão dentro do que foi acordado/solicitado dentro de um determinado contexto de uso;
  • Interoperabilidade: É avaliada a capacidade do software de integrar, coexistir e interagir com outros softwares;
  • Confiabilidade: É avaliada a capacidade do software em evitar falhas decorrentes de defeitos, em manter o funcionamento adequado mesmo quando ocorrem defeitos, assim como, a capacidade de um software se recuperar após uma falha, restabelecendo seus níveis de desempenho e recuperando os seus dados;
  • Usabilidade: É avaliada a capacidade do software ser compreendido, seu funcionamento aprendido e ser intuitivo e atraente ao usuário;
  • Eficiência: É avaliada a utilização tanto dos recursos consumidos pelo software (memória, disco, rede, etc) quanto a capacidade do software em utilizar os recursos disponíveis;
  • Segurança: É avaliada a capacidade do sistema de proteger as informações do usuário e fornecê-las apenas às pessoas autorizadas;
  • Compatibilidade: É avaliada a capacidade do software em operar corretamente nos ambientes suportados (sistemas operacionais, navegadores, banco de dados, línguas estrangeiras, etc);
  • Desempenho: É avaliado se os tempos de resposta (ou de processamento) do software estão dentro das especificações em função de uma carga de usuários/transações simultâneas dentro dos limites operacionais;
  • Escalabilidade: É avaliado se os tempos de resposta (ou processamento) do software se mantêm dentro das especificações à medida que a carga de usuários/transações ultrapassa os limites operacionais. O objetivo é assegurar que a arquitetura de software/infra-estrutura está preparada a escalar os recursos para atender demandas acima dos limites operacionais;
  • Conformidade: É avaliada a aderência do software em relação a exigências legais, requisitos externos ou contratuais, etc.

Conclusão

A computação em nuvem deixou de ser apenas discurso e tornou-se parte da estratégia de Tecnologia da Informação da grande maioria das organizações. Sob uma perspectiva, ela traz o benefício da ubíqüidade, elasticidade, pagamento apenas do que usar e quando usar, compartilhamento de recursos, redução dos gastos em infra-estrutura, entre outros. No entanto, estes benefícios trazem muitos desafios, já que o modelo de negócio ainda está em amadurecimento e muitas organizações ainda estão em fase de transição de plataformas legadas para a nuvem.

Neste cenário de mudanças e incertezas, cabe aos desenvolvedores e equipes de qualidade e teste de software apressar o passo e definir as ferramentas, padrões e processos de uso da nuvem para dar suporte ao desenvolvimento e atividades de garantia de qualidade. Afinal, a transição para a nuvem é inevitável e as áreas de desenvolvimento e qualidade devem apostar em provas de conceito e pesquisas a fim de se prepararem tecnicamente para lidar com os desafios desse novo paradigma.

POSTS RELACIONADOS

AGENDA

CURSOS RELACIONADOS