Revista TSPI
Published in

Revista TSPI

Testes de Software em Smartphones

Uma análise empírica sobre testes em aplicações móveis

4 iphones à esquerda e 4 galaxies à direita
Foto de smartphones do PCMag

O futuro da tecnologia está nesses incríveis dispositivos que carregamos atualmente em mãos. Por acreditar fielmente nisso, dedico a maior parte da minha carreira ao entendimento de como smartphones nos são úteis e como tornar os apps ainda melhores. Aqui, compartilho parte de minha experiência.

O que esperar deste artigo

Empírico significa dizer “com base na experiência e vivências sensoriais”. Já análise é “reduzir um assunto complexo a componentes simplificados”.

Meu intuito é explicar testes de software em smartphones com base em meu aprendizado, experiência e experienciação, não uma pesquisa formal com dados e estudos comprovados. O fundamento dessa análise é heurística, ou seja, falível, não-absoluta e submissa ao contexto.

Ao ler, compare minha experiência com a sua e absorva o que te for útil. Entenda que experiências e interpretações são contextuais: minhas observações podem ser úteis no seu emprego atual, mas inúteis no seguinte.

Dito isso, recheei este artigo com observações técnicas sobre os dois sistemas móveis prevalentes, Android e iOS. Explicarei a conexão entre o sistema operacional e rotinas de uso, além de como isso afeta os apps que seu time está desenvolvendo. Falarei sobre a diferença do paradigma de uso entre PCs e smartphones, analisando também como isso deveria mudar drasticamente a forma como você conduz seus testes. Também abordarei o porquê conhecer o hardware (a parte física) de seus dispositivos.

Ao final, compartilho a minha heurística de estratégia de testes em dispositivos móveis, algo que desenvolvi com o acúmulo de experiências em minha carreira e que tem me ajudado a ser um testador mais eficiente.

Um marco na história

Nossos celulares foram projetados como meios quase que exclusivamente de comunicação. A Nokia dominava o mercado com seu sistema Symbian, uma inovação que permitia acesso limitado à internet, além de alguns jogos muito marcantes. Mas a nossa vida tecnólogica mudou para sempre quando o primeiro iPhone surgiu, lá em 2007, abrindo um mar de possibilidades ao alcance de nossos dedos. Internet de maior velocidade e aplicativos mais interativos. Em pouco tempo, chegamos à era das mensagens instantâneas — e integrações ainda mais robustas envolvendo diversos dispositivos, como o IoT.

Quando as mensagens instantâneas surgiram nos smartphones, computadores pessoais já contavam com ela há muito mais tempo (saudades, MSN). Tínhamos acesso a websites ricos em recursos. Aplicações avançadas que não só nos permitiam comunicação rápida, como também criar uma planilha para cada aspecto de nossas vidas. Tecnologia já estava presente em nossas vidas. Algumas pessoas até tinham computadores em casa. Outras, mais afortunadas, contavam com laptops.

Então por que ter tudo isso, num dispositivo menor e menos potente, foi um marco tão grande? Porque smartphones poderiam fazer o que laptop nenhum conseguiria: caber em nossos bolsos.

Troca de mensagens só é instantânea de verdade se você puder responder de imediato, em qualquer lugar, sem esforço.

Apenas smartphones conseguem atender a esses critérios. As diferenças começam a tomar um rumo mais drástico a partir daqui.

Diferenças no uso

Boa parte dos aplicativos disponíveis para computador também estão disponíveis em smartphones. Tirando uma tela consideravelmente maior, um teclado mais confortável e o uso do mouse, são poucas as mordomias presentes num PC e ausentes num celular. Há algumas empresas cujo modelo de negócio considera somente o uso do smartphone: foi assim que o Instagram começou.

Hoje, a cada 100 dispositivos com acesso a internet, 59 são smartphones, comparado a 37 PCs. Analisando o trajeto desses dados, é perceptível que essa diferença tende a aumentar. Isso diz muito sobre a popularidade dessas pequenas maravilhas tecnológicas, então é preciso investigar o que muda com isso.

Computadores

Precedendo smartphones, PCs nos permitem realizar muitas tarefas, como jogar, acessar sites, enviar mensagens e e-mails, organizar tarefas, escrever artigos (como este aqui). Utilizamos vários periféricos para tornar seu uso mais conveniente, como um teclado e mouse (ou touchpad). Por ser mais acessível e disponível, o sistema operacional dominante é o Windows, presente em 76 a cada 100 computadores pessoais.

Observando algumas características dos PCs, o que notamos? A primeira coisa que me vem à mente é: quantidade de programas. Com o auxílio de um navegador, temos acesso a bilhões de websites, mas programas para o computador são poucos. É comum pessoas abrirem várias abas no Chrome do que abrirem inúmeros programas. Quando aplicativos são abertos, eles costumam ser usados de maneira objetiva e por um longo período de tempo. Uma vez utilizados, são finalizados pela pessoa que está usando.

Quanto ao multi-tarefas, noto que seu uso também é direcionado. Pessoas costumam abrir várias aplicações quando estas auxiliam a um mesmo propósito, por exemplo ao abrir o Excel e a Calculadora, ou escrevendo um artigo no Word, enquanto pesquisa sobre o assunto no Chrome — imagine várias abas, nem todas relacionadas à tarefa em mãos, como o Whatsapp Web) — e ouve música no Spotify. Longe dos olhos, o Windows está baixando atualizações. Em alguns casos, o único programa aberto é o Chrome, somado a dúzias de abas nem sempre relacionadas entre si.

A mesa vibra com o smartphone sambando em cima dela. Provavelmente, algum app enviou uma notificação que fez com o telefone emitisse um alerta, mesmo que silencioso. Os olhos desviam para o dispositivo, as mãos saem do teclado físico e vão para o virtual. Os segundos necessários para ler e responder a mensagem viram 5 minutos, porque outros 3 apps também enviaram uma notificação e o “feed” de um deles está recheado de conteúdo novo.

Fugindo da distração, a tarefa no computador é retomada. Após algumas horas e cansaço acumulado, o PC é desligado para não gastar energia à toa.

Smartphones

Estes dispositivos são usados de maneira muito, muito mais dinâmica. A primeira coisa que pode ser dita sobre eles é que foram feitos para passarem longos períodos de tempo sem que sejam desligados, diferente dos computadores convencionais.

Esse é um ponto importante porque nos diz que as aplicações estão sempre rodando em algum nível.

A segunda coisa em que diferem dos PCs é o constante uso de sensores. Pode não parecer, mas smartphones estão mais cientes aos nosso arredores do que nós:

  • O GPS está triangulando localização quando demandado e de acordo com uma determinada frequência;
  • O Wi-Fi está sempre procurando uma conexão conhecida e/ou livre que esteja forte, eficiente e disponível. Também usa essa informação para saber a distância entre os pontos de acesso identificados, o que te permite ter uma localização mais precisa;
  • O Bluetooth está fazendo a mesma coisa que o Wi-Fi, só que de maneira muito mais precisa. Estamos falando de alta precisão, com uma margem de erro de poucos metros;
  • Seu celular também está verificando a pressão atmosférica das proximidades utilizando um sensor chamado Barômetro. Não sabia disso, né?;
  • A antena celular está identificando o sinal enviado pela operadora, qual a antena com sinal mais forte e mais próxima, além de se preparar para “pular” entre as antenas à medida em que você se movimenta, pra que sua conexão não seja interrompida de repente. Isso é chamado de handover;
  • O sensor de luminosidade está identificando o quanto de luz você precisará no display para que possa enxergar o conteúdo.

Seu celular está colhendo e analisando dados o tempo inteiro. Essa é a parte smart do seu phone.

Tente lembrar de como você o utiliza: desbloqueia a tela pra mandar uma mensagem, mas seu dedo move-se automaticamente para o Instagram. Um vídeo de 10 segundos chama a sua atenção, o que te faz deslizar o feed em busca de mais conteúdo e dopamina. Um pequeno banner aparece no topo da tela, te notificando de uma mensagem recebida. Você olha e decide responder depois. Sai do app, abre o Spotify. Conecta seus fones bluetooth e coloca sua playlist pra tocar. Bloqueia a tela.

Minutos depois, lembra que queria mandar uma mensagem. Desbloqueia o celular, abre outro app. Começa a digitar uma mensagem, mas começa a tocar uma música que você não quer ouvir agora. Desce a barra de notificação, passa para a próxima música, envia a mensagem, abre outro app. Lá, tem uma mensagem com um link para um site. Ao clicar nele, o Chrome é aberto. No fundo, seu GPS foi consultado: a Google queria saber onde você estava.

A pessoa que você gosta te manda uma mensagem, mas é em outro app! Você o abre para responder, abre a câmera, envia uma foto, coloca uma legenda e envia. Antes de terminar, você voltou para a tela inicial e abriu o app do Mercado Livre para olhar o status da entrega de um produto. Bloqueia a tela do celular. Longe dos seus olhos, seu GPS é consultado de novo, dessa vez porque você saiu de uma antena e conectou-se a outra, um handover. A loja de aplicativos detectou novas atualizações e começou a baixá-las. Breve, novas notificações chegarão.

Achei melhor parar de descrever, pois notei que não teria fim. Usuários de smartphones não têm foco. Estão totalmente espalhados em dezenas de aplicativos que demandam sua atenção ao mesmo tempo a todo momento.

Um detalhe interessante é que o uso do computador eventualmente é interrompido pelo uso de um smartphone, mas raramente acontece o oposto.

Como esses padrões devem influenciar nossos testes?

Quando testamos apps de dispositivos móveis, estamos num ambiente controlado e aquém do real. Temos em mãos um dispositivo com poucos aplicativos terceiros, que provavelmente estava desligado antes de precisarmos dele. Pouco consumo da memória de armazenamento. Ligamos, instalamos o app sob teste, usamos por alguns minutos, desligamos o dispositivo.

Isso parece uma utilização real? Você já viu alguém que use somente um app sem ser interrompido por nenhum outro? Você já viu algum dispositivo onde os apps não disputam entre si pelos recursos? Minha suposição é que “não” para todas as perguntas. Repetindo o padrão acima, nos colocamos num ponto de cegueira onde não perceberemos possíveis problemas relacionados ao uso real. Devemos mudar isso.

Sistemas Operacionais

Para entendermos como o uso de smartphones é tão dinâmico, precisamos compreender o que permite tal dinamismo. Sistemas Operacionais são os cérebros que dão vida a esses aparelhos. No caso de celulares, esses sistemas são muito mais robustos do que em computadores, porque os recursos disponíveis são menores, mais curtos e não dão espaço para erros. É como ir ao mercado e tentar fazer as compras do mês com 100 reais: você precisa ser eficiente e ainda assim irá falhar.

Em celulares, os sistemas operacionais precisam gerenciar múltiplos sensores, apps, recursos e identificar o padrão de uso do seu usuário, de maneira que suas aplicações favoritas estejam sempre disponíveis. Isso exige uma tremenda capacidade de gestão, porque sua bateria, diferente da fonte de energia de computadores, é limitada. Se o OS for desleixado, gastará mais do que deveria e vai se tornar inútil ao desligar. Hoje, considerando o quanto dependemos de nossos smartphones, isso é inadmissível.

Android

Comecemos pelo sistema operacional móvel mais utilizado, presente em 72 a cada 100 smartphones disponíveis no mundo.

símbolo do sistema operacional android
Foto por Olhar Digital

Linguagem

Com suas aplicações nativas originalmente escritas em Java, a Google adotou o Kotlin como linguagem oficial em 2017. Isso significa dizer que você encontrará aplicações escritas em ambas as linguagens, portanto, entender o básico sobre elas será crucial para entender suas vantagens, desvantagens e vulnerabilidades. Tenha certeza que problemas comuns a ela poderão ser encontrados em seu app.

Um dos problemas que a Google buscou resolver ao adotar o Kotlin é a frequência com que o erro NullPointerException acontecia utilizando Java. Esse é um ponto de partida que pode revelar riscos interessantes.

Fragmentação

Neste OS, temos um problema particular chamado de fragmentação. Isso porque os dispositivos não só estão espalhados com muitas versões diferentes do Android, como também inúmeras customizações das fabricantes (que contam com versões próprias).

Diferente do iOS, onde temos uma maioria dos dispositivos nas versões mais recentes, que são lançadas somente por uma empresa, a maior concentração dos dispositivos Android rodam versões anteriores à mais atual: 53% estão nas versões 11 e 10, comparado a 17% na versão 12 (mais atual). Por referência, o número de dispositivos na versão mais atual do iOS (15.5) é 57%.

Ciclo de Vida

Para manter uma comunicação fluida entre aplicativo e sistema operacional, apps Android mandatoriamente implementam métodos chamados de Activity Lifecycle. Cada um destes métodos refere-se a um estado em que o app se encontra, executam rotinas próprias e ajudam o Android a decidir qual app pode ou não ser removido da memória. Estes métodos são:

  • onCreate(): Primeiro estado de uma aplicação Android, está ativo quando o app é aberto pela primeira vez e começa a consumir recursos, como memória. Costuma ficar neste estado por um curto espaço de tempo. Ainda não está visível ao usuário.
  • onStart(): Os elementos gráficos da aplicação começam a ficar visíveis, mas não respondem a interações.
  • onResume(): Estado em que o app está usável. Quando usuários interagem com aplicação, ela está neste estado.
  • onPause(): Quando uma outra aplicação toma a tela e o app em questão deixa de ser visível, mas ainda ativo, por exemplo quando chamamos a barra de notificação ou recebemos uma ligação. Neste estado, o Android considera o app como passível de remoção da memória. Significa dizer que, se outra aplicação com maior prioridade solicitar recursos, um app no estado onPause() poderá ser descartado.
  • onStop(): Passamos para este estado quando nossa aplicação é enviada para o background, tornando-se invisível e parcialmente inativa. Apps nesta situação estão no topo da lista para serem descartados, caso o Android precise de recursos.
  • onRestart(): Após ser enviada para o background e o usuário tentar abrí-la novamente, a aplicação passa por este estado, logo antes de exibir elementos na tela.
  • onDestroy(): Estado que indica que o app foi removido da memória. Sempre quando você acessa os aplicativos recentes e “limpa” os apps, você faz com que eles passem por este estado.
apresentação visual do ciclo de vida android
Versão simplificada do ciclo de vida das aplicações Android, disponível no Android Developer.

iOS

Bastante popular entre os norte-americanos, o iOS está presente em 27% dos dispositivos celulares do mundo. Uma das razões que explica a diferença numérica entre ele e o Android é preço: iPhones são bem caros.

fotos de iphones com a versão 15 do iOS
Foto de iPhones por TudoCelular

Linguagem

Inicialmente codificados em Objective-C (uma vertente da linguagem C com a adição dos paradigmas de orientação a objetos), a Apple passou a adotar, em 2014, o Swift como sua linguagem principal.

Diferente do Android e seu extensivo uso do Java/Kotlin, Apple adotou linguagens que possibilitassem uma performance melhor, já que o Swift não necessita de uma máquina virtual para rodar, é compatível com as bibliotecas em C utilizadas no iOS e é mais fácil de aprender que o Objective-C.

Ciclo de Vida

Da mesma forma que no Android, o iOS também utiliza ciclos de vida para indicar o estado de suas aplicações. Apesar de presentes em menor quantidade, partilham da mesma utilidade prática:

  • Not Running: quando uma aplicação não foi aberta ou foi encerrada pelo usuário/sistema, ela entra neste estado.
  • Inactive: estado utilizado quando a aplicação está em destaque, mas ainda não recebe interações ou quando outra aplicação tomou a tela (por exemplo, ao receber uma ligação ou puxar a tela de histórico de notificações). Costuma-se ser um estado de transição entre uma aplicação que acabou de ser aberta até o momento em que possa ser utilizada.
  • Active: quando o app está em destaque, visível e usável.
  • Background: se você utilizar o botão/gesto de ir para a Tela Inicial enquanto usa uma aplicação, você faz com que ela entre neste estado. Ele também é usado quando o app está prestes a ser suspenso — diferente do Android, os apps levam mais tempo para serem removidos da memória. Antes disso, ele tem seus recursos limitados e não pode executar nenhum código.
  • Suspended: ao entrar neste estado, a aplicação consome recursos mínimos e não executa nenhum código ou rotina. O próprio sistema coloca as aplicações neste estado, sem intervenção do usuário. Aplicativos neste estado serão removidos da memória por completo, caso um outro app com maior prioridade precise de mais recursos.
apresentação visual do ciclo de vida ios
Versão simplificada do ciclo de vida de aplicações iOS, disponível na Apple Developer.

Para cada um destes estados, existem métodos responsáveis pelas rotinas e códigos que a aplicação executará. Você pode conferir a lista aqui.

Hardware dos Smartphones

Quando testamos websites ou programas de computador, raramente levamos em consideração as características do dispositivo onde estamos testando. Aqui, por outro lado, esses aspectos são relevantes — suficiente para conseguir prejudicar todo o funcionamento de seu software. Separei algumas características que valem a pena observar ao montar seu planejamento.

foto de um galaxy S8 desmontado
Galaxy S8 por dentro, disponível na Samsung Newsroom.

Processadores

Onde a mágica acontece, são responsáveis por interpretar instruções e executá-las, tornando seu dispositivo usável. É um dos maiores responsáveis pela performance, o que torna o processador uma das principais características a se observar num smartphone.

Computadores pessoais têm um mercado simplificado nesse aspecto, já que os principais processadores são modelos da Intel ou da AMD. Quando se trata de smartphones, a diferença é mais notável: parte das maiores fabricantes de celulares também fabricam seus próprios modelos de processadores. Isso significa dizer que a sua aplicação pode ter vulnerabilidades e performances completamente diferentes, dependendo do dispositivo onde seja usada.

Para dar um pouco de contexto a essa variação, listarei alguns processadores a qual se atentar:

  • A Xiaomi utiliza processadores Snapdragon (produzidos pela Qualcomm) em seus dispositivos intermediários e topos de linha, e MediaTek nos modelos mais básicos. Recentemente, por conta da crise no vale do silício, a Xiaomi também recorreu à MediaTek para utilizar em celulares com suporte à tecnologia 5G;
  • A Samsung desenha e produz processadores Exynos, que utiliza em dispositivos intermediários e topo de linha. Para os celulares mais básicos e alguns intermediários, utiliza processadores MediaTek. Nos EUA, entretanto, seus dispositivos topo de linha usam processadores Snapdragon;
  • A Apple desenha, mas não produz, os processadores Linha A, que utiliza em seus smartphones, tablets e laptops. Seus processadores mais recentes foram fabricados pela Samsung;
  • A Huawei desenha e fabrica processadores Kirin, que utiliza em seus celulares;
  • Motorola utiliza processadores Snapdragon e MediaTek.

Em números absolutos, o mercado tem uma presença maior de processadores MediaTek, presentes em 38% dos smartphones do mundo, seguido pela Qualcomm (30%) e Apple na terceira posição, com 15% de presença nos smartphones do mundo. Há uma particularidade comum a quase todos esses processadores: seus fabricantes utilizam o design feito por uma empresa chamada ARM, a mega-mente por trás dos mais avançados processadores para dispositivos móveis que existe. Quando estudar smartphones, tenha essa informação em mente.

Memória

Memórias RAM são componentes físicos que armazenam informações simples temporariamente, permitindo que sistemas operacionais e aplicativos as acessem de maneira rápida, economizando tempo e processamento. Por conta disso, é o segundo aspecto de um smartphone que impacta diretamente em como o seu app se comportará, especialmente em sistemas Android.

Diferente das RAMs usadas em computadores pessoais, as utilizadas em smartphones precisam ser rápidas e extremamente eficientes no consumo de energia, já que celulares possuem bateria limitada.

Esse é um problema particularmente sério em smartphones Android: o sistema foi feito para funcionar em qualquer tipo de dispositivo, independente do hardware. O mesmo mecanismo que torna isso possível também é responsável pelo alto consumo de recursos que o Android tem. É necessária uma grande quantidade de memória RAM para que funcione em plenitude. Pouca memória limitará sua aplicação de maneiras difíceis de prever, daí a importância de otimizar o consumo de recursos de sua aplicação.

Sensores e Antenas

O que torna os seres vivos entidades tão impressionantes é a sua capacidade de captar múltiplas informações simultaneamente de maneira fluida e com o mínimo de esforço. Mesmo que você não perceba, seu corpo está registrando a temperatura ambiente, sons, cheiros, o contato da roupa na sua pele, os raios de luz vindos do monitor/tela do smartphone, o óculos escorrendo aos poucos do seu nariz (aconteceu comigo enquanto escrevia esse trecho), seu estômago ficando vazio, sua lombar doendo por sua má postura na cadeira.

De maneira a imitar parte desse potencial, smartphones são equipados com inúmeros sensores que os permitem ter algo parecido com uma inteligência, captando diferentes interações para melhorar a experiência de uso. Os sensores mais comuns são:

  • Acelerômetro: responsável por indicar ao sistema a velocidade e a direção linear para onde seu smartphone foi movimentado. Este é o sensor que seu smartphone (e smartwatch) utiliza para identificar o exercício que você está praticando, além de contabilizar seus passos. É utilizado em conjunto com o giroscópio;
  • Giroscópio: sensor que determina a inclinação do movimento e sua velocidade, bem parecido com o acelerômetro. Usados em conjunto, pode-se saber se o celular está em pé ou deitado, como quando você quer assistir a um vídeo em tela cheia. Essa função pode ser sobrepujada através de uma configuração do sistema operacional ou se a aplicação estabelecer um uso de orientação fixo, por exemplo, jogos costumam ser fixos na horizontal;
  • Proximidade: costuma estar localizado no topo do smartphone, é usado para indicar ao dispositivo se ele está coberto por algo, como quando está dentro do bolso ou próximo da orelha numa ligação. Dessa forma, o sistema pode tomar decisões inteligentes, como desligar a tela e impedir toques acidentais;
  • Magnetômetro: detecta campos magnéticos de maneira similar a uma bússola, alinhando-se com o campo magnético dos pólos terrestres. É usado em conjunto com o GPS;
  • GPS: sensor que envia e recebe sinais de satélite, calculando o tempo de resposta para determinar a localização geométrica. Somado ao magnetômetro e o barômetro, oferece uma alta precisão quanto a determinar a localização;
  • Barômetro: responsável por captar e analisar pressão atmosférica, utiliza essa informações para determinar altitude, oferecendo maior precisão ao GPS ao triangular sua localização.
  • Antena WiFi: sensor configurado para uma frequência e banda de rádio específica utilizada pela tecnologia WiFi, que costuma ter um alcance muito limitado, mas estáveis e de alta velocidade. Essa antena capta frequências de rádio de 2.4 GHz e 5 GHz. Quanto maior a frequência, maior a velocidade e menor o alcance;
  • Antena Móvel: capta a banda e frequência utilizado pela tecnologia de Conexão Celular, identifica inúmeras frequências de longo alcance com uma velocidade e estabilidade de conexão menores que a provida pela tecnologia WiFi. Isso pode mudar em breve com o advento da conexão 5G;
  • Sensores Biométricos: responsáveis por captar características únicas de seus usuários para fatores de autenticação, como impressão digital, íris ocular e reconhecimento facial.

Tela

Por serem dispositivos touchscreen, as telas dos seus smartphones têm papel protagonista em sua usabilidade: é através dela que interagimos com o sistema e por onde informações são majoritariamente mostradas. Devido à essa relevância, entender as telas do celulares pode te dar insights importantes sobre como sua aplicação se comportará.

Quando se trata de telas, há quatro aspectos técnicos potencialmente importantes:

  • Tipo: para que a tela consiga exibir informações, aumentar e dimuir o brilho, além de mostrar cores, utiliza-se um painel de iluminação atrás do display, que dará vida àquilo que você consegue ver. Em essência, os dois tipos de paineis predominantes no mercado são o painel OLED e o painel IPS. Suas características individuais mudam os paradigmas de iluminação, o que pode influenciar como sua aplicação é mostrada. Painéis OLED iluminam cada pixel do display de maneira individual, tendo acesso a brilhos e cores mais intensas que o concorrente. Também são capazes de economizar a bateria do dispositivo ao iluminarem a cor preta, já que desligam o pixel para reproduzir a cor, economizando energia, e também são capazes de atingir taxas de atualização mais altas. São mais vulneráveis ao efeito burn-in. Por outro lado, os painéis IPS têm uma fidelidade muito maior às cores, exebindo-as próximo do que é encontrado na natureza, iluminam o painel como um todo (em vez de cada pixel individualmente) e têm maior resistência ao efeito burn-in. Samsungs são notavelmente conhecidos por usar telas OLED em seus dispositivos. Se o aspecto das cores for importante para sua aplicação, observe como ela se comporta em diferentes tipos de tela.
  • Tamanho: um dos aspectos mais facilmente notáveis sobre um smartphone. A tela é uma das responsáveis por indicar o quanto de informação pode ser mostrada e tem uma variação enorme no mercado, com suas dimensões variando entre 3.5 polegadas a mais ou menos 7 — esse número é ainda maior se considerarmos tablets. Durante o desenvolvimento de software, há algumas precauções para que sua aplicação tenha um design consistente em vários tamanhos de tela, mas nunca é uma garantia. Dessa forma, durante seus testes, é importante que você tenha dispositivos com uma variação no tamanho das telas, o que irá te ajudar a combater os viéses de olhar somente um tamanho específico e observar melhor como seu app se comporta em outros aparelhos.
  • Resolução: segundo aspecto responsável pela quantidade de informações que poderá ser exibida na tela, a resolução indica quantos pixels existem no display. Quanto maior a resolução, maior a quantidade de pixel e menor o tamanho deles, o que significa que o conteúdo mostrado na tela terá detalhes mais nítidos. Os smartphones atuais costumam ter uma resolução que varia de 720p (conhecido como HD) a 4320p (famoso 4K), com a maioria concentrada nos 1080p (full HD). É comum que alguns elementos, como ícones da aplicação, sejam projetados para apenas uma dessas resoluções, e é aí que está o perigo — um ícone projetado para 720p ficará totalmente desfocado em telas que tenham uma resolução maior que isso. O mesmo se aplica a qualquer outro elemento.
  • Taxa de atualização: para dar a sensação de movimento, como o efeito ao abrir a aplicação ou ao jogar um jogo, é necessário mostrar inúmeras imagens estáticas sequenciais em um curto espaço de tempo, que nem quando alguém faz múltiplos desenhos nas páginas de um caderno e passa por elas, cada página com uma pequena alteração no desenho. A velocidade com que a tela faz isso é determinada pela taxa de atualização. Os olhos humanos conseguem detectar até 24 imagens diferentes em 1 segundo, o que significa dizer que se passarmos imagens rapidamente, 24 vezes por segundo ou mais, nossos olhos serão incapazes de distingui-las individualmente, nos dando a ideia de movimento. Por padrão, a maioria dos smartphones contam com telas que conseguem exibir 60 imagens por segundo — quase 3x acima da nossa percepção — , com alguns trazendo telas que capazes de ir até 144 imagens/segundo. Quanto maior a quantidade, maior a fluidez com que a sensação de movimento é transpassada. Em termos de usabilidade, tende-se a achar que uma aplicação com efeitos mais fluidos também é mais performática. Considerando que cada vez mais têm surgido smartphones com grandes taxas de atualização, é chegado o momento de experimentar como sua aplicação foi desenvolvida e como se sai num destes dispositivos. Torná-la compatível com taxas de atualização maiores pode proporcionar uma melhor experiência a seus usuários, ganhando destaque perante a concorrência.

Ferramentas analíticas e sua utilidade em testes

uma pessoa preta em frente a uma tela com múltiplos gráficos para ilustrar ferramentas analíticas
Foto por Freepik

Testar é avaliar o produto ao aprender sobre ele através de exploração, experimentação e experienciação. Isso envolve, em algum nível, modelar seu entendimento sobre produto, fazer questionamentos, estudar o software e o negócio, fazer inferências e observar o produto. Isso significa dizer que nós lidamos, essencialmente, com a aquisição de novas informações.

Uma forma particularmente eficiente de observar o produto é através de ferramentas analíticas que te permitam coletar e analisar dados de vários usuários ao mesmo tempo. Cada membro de um time de desenvolvimento se beneficia com a coleta desses dados. Aqui, destaco três formas para encorpar a prática de testes em aplicativos móveis.

Conhecendo seus usuários

Uma das melhores formas de saber se estão construindo o produto correto é saber para quem o produto está sendo feito. É irreal desenvolver uma aplicação sem saber como ela será usada. Logo, é uma decisão errônea testar um produto sem saber qual o intuito de sua existência.

Pessoas usuárias são, antes de mais nada, pessoas. Elas possuem características pessoais que as definem, emoções que variam a todo momento, expectativas, realidades e os meios onde expectativa e realidade se relacionam. Um desses meios é o seu produto, é onde a diferença entre o que seus usuários esperam fazer e o que conseguem de fato fazer se manifesta. Para facilitar a aquisição dessas informações, é possível utilizar ferramentas analíticas, como o Firebase, que te indicarão quem, tecnicamente falando, está usando seu app. De um lado um pouco mais pessoal, é possível utilizar ferramentas como o FullStory, que conseguem identificar reações emotivas de seus usuários (tipo o rage-click).

Duas formas ainda mais eficientes de se familiarizar com pessoas usuárias são conversar diretamente com elas ou reunir o seu time, especialmente quem for responsável pela área de negócios, e dialogar sobre para quem estão produzindo o software. Com base nisso, de maneira a melhor fundamentar seus testes e o desenvolvimento, é possível montar arquétipos ou personas de usuários. Você perceberá que conhecer características sobre quem você serve também mudará a sua perspectiva sobre o que você julga ser importante.

Monitorando suas aplicações

Aprendizagem (que é a essência do teste) envolve, em algum nível, observação. Quando desenvolvemos software, as proporções de seu uso costumam ser grandes demais para conseguirmos acompanhar presencialmente como ele está sendo usado, mas ainda assim é preciso observá-lo. Para isso, utilizamos inúmeras ferramentas que nos permitam coletar dados de uso e saber mais sobre como nosso produto está sendo usado na prática. Analisando estes dados através da ótica de arquétipos e personas, é possível identificar padrões de uso que não foram antecipados, informando melhor o seu time quanto ao que priorizar.

Durante o uso, inúmeras informações são geradas e podem ser coletadas: tomada de decisão e fluxos de uso (podem ser monitorados como ferramentas tipo o Segment), requisições que são pesadas e/ou consomem mais tempo para sem processadas por alguma má otimização (o NewRelic costuma brilhar nisso), avaliações e índice de desinstalações (podem ser colhidos na Play Store e na App Store), quais dispositivos foram usados (Firebase e NewRelic coletam esse dado de maneira semelhante), quais usuários estão mais engajados e com qual função (Optimizely faz isso muito bem com uma técnica chamada A/B Testing) e onde seus usuários estão se deparando com erros (Crashlytics, NewRelic e FullStory são particularmente bons nisso). O que nos leva à próxima sessão.

Diagnosticando problemas

Pessoas não-treinadas em testes de software costumam ser particularmente ruins em reportar erros. “Não está funcionando” é uma descrição comum e que ajuda em absolutamente nada na solução. Em outras palavras, não é sábio contar com o reporte de usuários para conseguir apropriadamente identificar o quê e onde algo está dando errado, então é preciso de uma fonte de informação mais precisa e eficiente. Há alguns indicativos de que seus usuários estão passando por alguma dificuldade. Sabendo quais são, fica mais fácil de encontrá-los com o uso de ferramentas:

  • Crash: manifesta-se quando o aplicativo fecha de repentinamente durante o uso (ou até mesmo longe dos olhos dos usuários, em background). Costumam ser graves quando ocorrem, por raramente haver uma forma de contornar o erro. Eles ocorrem quando a aplicação se depara com uma exceção durante sua execução. Por não haver algum tratamento para isso, sua execução é interrompida. Pode causar perda de dados significativos e é fortemente associada a sentimentos de frustração. O Crashlytics, NewRelic e FullStory podem identificar quando crashes ocorrem em produção e indicar exatamente o momento, além do histórico do código executado antes do erro ocorrer (conhecido como Stack Trace).
  • Rage Click: quando um botão é pressionado repetidas vezes num curto espaço de tempo, é interpretado como um rage click. Isso ocorre quando a aplicação demora a responder a alguma interação da pessoa usuária e não há indicativos de que esteja processando informações. Pode ser causado por pouco recurso no dispositivo, código mal-otimizado, requisições grandes e complexas ou funções inativas (quando o botão não tem uma funcionalidade definida). Pode ser captado no FullStory e no Segment;
  • Demora para finalizar um fluxo: no uso do smartphone, é comum passearmos entre muitas aplicações antes de finalizarmos uma tarefa. Porém, se cada um dos passos ou alguns passos em particular costumam ser demorados, pode ser sinal de má otimização de recursos, design não-intuitivo ou requisições pesadas. Em ambos os casos, esses segundos a mais pode significar a desistência de seu usuário em fazer uma compra, por exemplo, o que pode representar um risco ao negócio. É possível detectar essa flutuação e o tempo gasto no fluxo através de ferramentas como o Segment e o NewRelic;
  • Desistência: ao monitorar seus usuários, você percebe que eles chegam até um determinado ponto do fluxo desenhado pelo seu time, mas desistem, nunca o completam. As causas podem ser inúmeras, entre elas um design não-intuitivo ou um fluxo muito longo, o que faz com o tempo gasto para completar a ação tenha menos valor do que a desistência. E uma função que não é utilizada reduz a importância do tempo e dinheiro gasto em seu desenvolvimento. Pode ser monitorado e detectado através do Segment.

Incorporando esses indicadores na sua estratégia de testes, é possível se antecipar a possíveis problemas mais graves, como evasão de usuários, que é quando seu número de usuários ativos cai em comparação a períodos anteriores. Também te dará insights importantes sobre o que se espera do seu produto e o que é efetivamente possível fazer com ele.

Heurística de estratégia de testes mobile

Para montar uma estratégia de testes abrangente e que me permita mapear diversos fatores de risco, é necessário analisar cuidadosamente cada um dos aspectos gerais de um smartphone. Com base nisso, desenhei uma heurística que me auxilia a criar estratégias eficientes. Cada característica leva em consideração quem são as pessoas usuárias, aspectos técnicos, objetivos de negócio e limitações. Isso significa dizer que alterar uma dessas variáveis também mudará a forma como as características abaixo são observadas.

Público

Pense em qual grupo demográfico compõe seu público. Catalogue os modelos de smartphones mais comum entre eles (é possível coletar esse dado utilizando ferramentas analíticas, como Firebase). Monte um arquétipo com base nessas informações. Investigue jornadas de usuário e descubra com que frequência sua aplicação é utilizada, com que frequência certas ações são feitas. Descubra as condições em que sua aplicação é mais utilizada ou menos utilizada. Utilize essas informações para desenhar seus experimentos.

Dispositivo

Considere características do dispositivo que usará (ou deveria usar) para testes.

  • Tamanho do display, tipo e resolução: as telas de seu app podem parecer perfeitos numa tela de 6.2", mas quebrar totalmente numa tela de 5.0". As cores podem parecer corretas numa tela IPS, mas estarem demasiadamente diferentes numa tela AMOLED;
  • Versão do SO e versão de customização da fabricante do dispositivo (por exemplo, MIUI para Xiaomi, OneUI para Samsung): problemas comuns em sistemas da Samsung podem não ocorrer num dispositivo Huawei. O que ocorre no sistema Xiaomi pode não ocorrer no Android Puro (AOSP). Isso te ajudará a descobrir quem é o público afetado por um problema;
  • Fabricante do processador: problemas comuns a determinados processadores podem e vão vazar para a sua aplicação. Leia sobre essa vulnerabilidades e descubra como isso pode impactar alguém importante ao seu negócio;
  • Tamanho da memória e armazenamento disponíveis: sua aplicação pode funcionar bem num dispositivo com 4 GB, mas ser terrível em um com 2 GB. Quanto recurso mínimo é necessário para que seu app funcione de maneira satisfatória? Se a maioria do seu público utilizar dispositivos com 2 GB de RAM, mas sua aplicação precisa de dispositivos com no mínimo o dobro dessa capacidade, você e seu time estão realmente produzindo uma solução plausível?

E tenha um modelo de referência para que possa comparar como possíveis problemas se comportam. Se ocorrer no modelo de referência, é possível que você tenha um bug mais sério em mãos.

Versão

Todo app precisa ter uma versão mínima suportada, ou seja, a partir de qual versão do OS é possível instalar e utilizar seu app. Problemas costumam ocorrer na versão mais antiga e na mais recente. Por exemplo, se seu app foi desenvolvido para funcionar em qualquer Android acima do 5.0 e o mais recente é o Android 12, inconsistências tenderão a ocorrer nestas duas versões. A natureza humana nos força a olhar pra frente, então é quase certo que o seu time de desenvolvimento não está olhando de perto versões consideradas obsoletas.

Uma excelente maneira de saber o que cada versão tem é olhar a lista de versionamento, disponível aqui para Android e aqui para iOS.

Consumo

Uma aplicação podem demonstrar sintomas de problemas potencialmente sérios. Um destes sintomas costuma ser o consumo de recursos, como memória RAM e o tamanho do app. Utilizando o Profiler disponível no Android Studio ou no Xcode (para iOS) enquanto o app estiver em execução, será possível captar quais processos estão sendo executados, além de quanta memória está sendo consumida. Picos de memória ao fazer determinadas operações são um bom lugar para investigar.

Outro sintoma é o tamanho do app. Uma aplicação que gerencia notas de texto é improvável que tenha um pacote de instalação que pese 500 MB. Se isso correr, suspeite. Compare o tamanho do app que você está testando com aplicações concorrentes. Se a diferença for muito grande, busque entender o porquê.

Um truque particularmente interessante no Android é uma configuração dentro do Menu de Desenvolvimento que te permite ver a carga de trabalho da GPU do dispositivo. Ao utilizar o app e navegar entre as telas e animações, você verá indicadores na tela mostrando o quão difícil foi para o celular processar aquela informação gráfica. Pode te revelar pontos de melhoria, locais onde sua aplicação poderá ser otimizada.

Concorrência

Pessoas costumam encher seus smartphones com aplicativos (muitas vezes, inúteis) que estão o tempo inteiro brigando por espaço. Você deveria fazer o mesmo com seu dispositivo de testes. Nas lojas de aplicativos, como Play Store e App Store, você poderá encontrar um ranking com os apps mais baixados no país. O top 100 de apps gratuitos te dará munição suficiente para encher seu celular. Utilize-os, faça com que tenham algum espaço na memória RAM. Faça com que gerem cache. Como sua aplicação se comporta na presença de outras? E o que acontece quando você instala aplicações concorrentes? Elas podem ser utilizadas sem sinais de conflito?

Paralelismo

Como mencionado alguns tópicos acima, o grande diferencial dos smartphones quanto aos PCs é que as pessoas costumam fazer muitas coisas ao mesmo tempo. Ou seja, você precisa utilizar várias funções e apps ao mesmo tempo. Ouça música, troque de aplicação com frequência, deixe seu app em background por um tempo, receba várias notificações durante seu uso. Pela forma como os sistemas operacionais são construídos — com múltiplos métodos para informar o estado da aplicação — , atividades paralelas podem corromper dados, fazer seu app quebrar ou simplesmente ficarem inoperantes enquanto sua aplicação estiver aberta (e vice-versa).

O objetivo é observar como seu app se comporta num cenário caótico.

Permissões

Por qual razão um app que acompanha o ciclo menstrual pediria acesso à câmera? O que ele fará com acesso ao bluetooth? Descubra quais permissões sua aplicação solicita, quais são consistentes com seu propósito e de quais formas elas são usadas. Compare com apps similares. Discrepâncias precisam ser justificadas.

Tempo

Alguma vez você já abriu uma aplicação após muito tempo e ela ainda estava do jeitinho que você deixou? Exponha sua aplicação a situações semelhantes. Identifique como ela se comporta com uso prolongado, quanto tempo leva até ser eliminada da memória, o que acontece com o cache à medida que o tempo passa (por exemplo, crescer de maneira exacerbada — é estranho uma aplicação de 100 MB ter um cache de 1 GB). Não há uma regra que diga o quanto é estranho, então use bom-senso (e uma dose cavalar de ajuda do time de desenvolvimento).

Ciclo de Vida

Diferente de programas de computador, apps móveis precisam informar ao sistema operacional exatamente o que estão fazendo, quando estão fazendo e o por quê de precisarem ou não de recursos. É dessa forma que o OS decide qual app irá retirar da memória para abrir espaço — isso mesmo, você não precisa ficar limpando a memória: o sistema faz isso melhor que você. Isso é chamado de ciclo de vida da aplicação. Descubra quais rotinas são executadas em cada uma das etapas deste ciclo e investigue o que a aplicação faz em cada etapa. Erros comuns envolvem: reiniciar, perder dados, travar.

Integração

De maneira que seja possível comunicar-se com o hardware, os aplicativos fazem uso de diversas interfaces para dizer ao sistema operacional exatamente qual recurso precisam. Essas interfaces são chamadas de APIs — não confundir com APIs Web, cujo propósito é similar (intermediar comunicações entre dois sistemas), mas funcionam de maneira diferente.

Ao se interagir com essas interfaces, é possível fazer uso de câmeras, bluetooth, sensores de orientação de tela, etc. É muito provável que sua aplicação precise de algum dos recursos de hardware nativos, o que torna integração com o sistema uma parte importante de seu funcionamento. Um erro bastante comum é acessar o recurso da câmera e as fotos tiradas através dessa integração ficarem distorcidas. Mapeie todos os pontos de comunicação entre sua aplicação e o hardware, anotando riscos que podem emergir dessa relação.

Camadas

Uma das grandes percepções sobre desenvolvimento de software é que tudo é feito em camadas. Utilizamos uma linguagem que foi escrita em cima de outra linguagem, que depende de uma estrutura específica que foi escrita em cima de outra estrutura. Em alguns casos, essas camadas se amontoam tanto que não sabemos onde começa. O importante a se ter em mente é um paradigma conhecido como Lei das Abstrações com Vazamento.

Essa lei fala que um problema que ocorre numa camada inferior irá vazar para a camada superior, da mesma forma que lava às vezes chega à superfície, independente de quantas camadas de terra estejam em cima. Um exemplo prático: a linguagem Java precisa de um artifício chamado JVM para funcionar. Problemas na JVM invariavelmente incorrem em problemas no Java.

Tratando-se de apps móveis, temos três tipos padrão:

  • Aplicação web instalável em smartphones: são essencialmente websites que conseguem rodar em smartphones, com alta dependência dos browsers. Você terá camadas referentes ao Android/iOS (OS do dispositivo), Chrome/Safari (motor web utilizado por esses OS), a linguagem utilizada para escrever a aplicação e a biblioteca/framework que deu vida a ela;
  • Híbrida: são aplicações feitas utilizando bibliotecas não-nativas que permitem a criação de apps multi-plataforma, podendo ser instalados e utilizar os recursos de hardware com maior liberdade. Dessa forma, temos camadas referentes ao sistema operacional, ao motor web, à biblioteca usada para desenvolver a aplicação (como o Flutter);
  • Nativa: aplicações feitas utilizando as ferramentas de desenvolvimento específicas para o sistema operacional para onde estão sendo desenvolvidas. Precisam ser instaladas e fazem total uso do hardware do dispositivo. Além das camadas associadas ao próprio sistema operacional, temos as da linguagem e as das bibliotecas terceiras utilizadas.

Se ocorrer um problema em qualquer uma das camadas relacionadas ao tipo do app, ele poderá “vazar” na aplicação. Estude de quais estruturas o seu produto depende e analise os riscos associados a elas. Lembra quando mencionei que precisamos saber também qual o processador do dispositivo? Vulnerabilidades e defeitos associados ao processador também vazarão para a sua aplicação. É uma fonte rica de riscos e deve ser investigada.

Conclusão

Tomando liberdade para reiterar algo que já é realidade, em caso de ainda não estar nítido: você é uma pessoa usuária exemplar e já faz um terço do que descrevi neste artigo para todos os apps que usa no dia a dia, exceto aqueles que você se dispõe a testar. Por esses padrões de comportamento não estarem transparentes, é natural que você os ignore quando está testando. O problema é que mudar seu padrão de uso te afasta daquelas que serão mais afetadas pelo seu produto.

Testar envolve forte investigação e adaptar suas ações de acordo com as informações aplicadas a um contexto. Com este artigo, trago perspectivas técnicas e humanas de onde coletar essas informações e incorporar em seus testes, apontando onde eventuais riscos podem estar escondidos. Nunca foi tão importante entender as mudanças de paradigmas de usabilidade e estar próximo das pessoas que consomem seu software.

Como pessoas testadoras, é imprescindível que tenhamos múltiplas perspectivas por onde analisar nosso trabalho. Sendo assim, proponho um exercício: na próxima vez em que utilizar seu celular, faça de maneira consciente. Observe o que você faz naturalmente, entenda como isso se aplica ao seu trabalho e repense suas próximas estratégias de testes em smartphones.

--

--

Conteúdo gratuito sobre Fundamentos, Abordagens, Técnicas, Ferramentas e Automação de Testes, de estudantes para estudantes.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Rafael Bandeira

Rafael Bandeira

Senior Test Consultant at Thoughtworks. A lover of mobile apps. You can find me at https://www.linkedin.com/in/rafaelbandeeira